Mybatis   发布时间:2019-10-08  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html     http://www.cnblogs.com/xdp-gacl/p/4264425.html

一、优化MyBatis配置文件中的配置

1、连接数据库的配置单独放在一个properties文件中

  之前,我们是直接将数据库的连接配置信息写在了MyBatis的主配置文件conf.xml文件中,如下:

s.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" transactionManager source m.mysql.jdbc.Driver" password" source

  其实我们完全可以将数据库的连接配置信息写在一个properties文件中,然后在conf.xml文件中引用properties文件,具体做法如下:

  1、在src目录下新建一个db.properties文件,如下图所示:

  

title="Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突" alt="Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突" src="https://cn.js-code.com/res/2019/02-10/10/f368bba5b2583afc7b84d7e3ef0742ab.png" >

  在db.properties文件编写连接数据库需要使用到的数据库驱动,连接URL地址,用户名,密码,如下:

1 driver=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/mybatis 3 name=root 4 password=XDP

  2、在MyBatis的主配置文件conf.xml文件中引用db.properties文件,如下:

s.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" resource transactionManager source {driver}" {url}" {name}" password"{passworD}" source

2、为实体类定义别名,简化sql映射xml文件中的引用

  之前,我们在sql映射xml文件中的引用实体类时,需要写上实体类的全类名(包名+类名),如下:

@me.gacl.domain.User"> insert into users(name,agE) values(#{name},#{agE})

  parameterType="@H_531_274@me.gacl.domain.User"这里写的实体类User的全类名@H_531_274@me.gacl.domain.User,每次都写这么一长串内容挺麻烦的,而我们希望能够简写成下面的形式

{agE})

  parameterType="_User"这样写就简单多了,为了达到这种效果,我们需要在conf.xml文件中为实体类="@H_531_274@me.gacl.domain.User"定义一个别名为"_User",具体做法如下:  在conf.xml文件中标签中添加如下配置:

l.domain.User" alias="_User"/>

  这样就可以为@H_531_274@me.gacl.domain.User类定义了一个别名为_User,以后_User就代表了@H_531_274@me.gacl.domain.User类,这样sql映射xml文件中的凡是需要引用@H_531_274@me.gacl.domain.User类的地方都可以使用_User来代替,这就达到了一个简化实体类引用的目的。

  除了可以使用l.domain.User" alias="_User"/>这种方式单独为某一个实体类设置别名之外,我们还可以使用如下的方式批量为某个包下的所有实体类设置别名,如下:

s.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"
<span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; 引用db.properties配置文件 </span><span style="color: #008000"&gt;--></span>
<span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;properties </span><span style="color: #ff0000"&gt;resource</span><span style="color: #0000ff"&gt;="db.properties"</span><span style="color: #0000ff"&gt;/></span>
<span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; 
    development : 开发模式
    work : 工作模式
 </span><span style="color: #008000"&gt;--></span>
<span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;environments </span><span style="color: #ff0000"&gt;default</span><span style="color: #0000ff"&gt;="development"</span><span style="color: #0000ff"&gt;></span>
    <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;environment </span><span style="color: #ff0000"&gt;id</span><span style="color: #0000ff"&gt;="development"</span><span style="color: #0000ff"&gt;></span>
        <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;transactionManager </span><span style="color: #ff0000"&gt;type</span><span style="color: #0000ff"&gt;="JDBC"</span> <span style="color: #0000ff"&gt;/></span>
        <span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; 配置数据库连接信息 </span><span style="color: #008000"&gt;--></span>
        <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;datasource </span><span style="color: #ff0000"&gt;type</span><span style="color: #0000ff"&gt;="POOLED"</span><span style="color: #0000ff"&gt;></span>
            <span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; value属性值引用db.properties配置文件中配置的值 </span><span style="color: #008000"&gt;--></span>
            <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;property </span><span style="color: #ff0000"&gt;name</span><span style="color: #0000ff"&gt;="driver"</span><span style="color: #ff0000"&gt; value</span><span style="color: #0000ff"&gt;="${driver}"</span> <span style="color: #0000ff"&gt;/></span>
            <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;property </span><span style="color: #ff0000"&gt;name</span><span style="color: #0000ff"&gt;="url"</span><span style="color: #ff0000"&gt; value</span><span style="color: #0000ff"&gt;="${url}"</span> <span style="color: #0000ff"&gt;/></span>
            <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;property </span><span style="color: #ff0000"&gt;name</span><span style="color: #0000ff"&gt;="username"</span><span style="color: #ff0000"&gt; value</span><span style="color: #0000ff"&gt;="${name}"</span> <span style="color: #0000ff"&gt;/></span>
            <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;property </span><span style="color: #ff0000"&gt;name</span><span style="color: #0000ff"&gt;="password"</span><span style="color: #ff0000"&gt; value</span><span style="color: #0000ff"&gt;="${passworD}"</span> <span style="color: #0000ff"&gt;/></span>
        <span style="color: #0000ff"&gt;</</span><span style="color: #800000"&gt;datasource</span><span style="color: #0000ff"&gt;></span>
    <span style="color: #0000ff"&gt;</</span><span style="color: #800000"&gt;environment</span><span style="color: #0000ff"&gt;></span>
<span style="color: #0000ff"&gt;</</span><span style="color: #800000"&gt;environments</span><span style="color: #0000ff"&gt;></span>

<span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; 配置实体类的别名,配置实体类别名的目的是为了在引用实体类时可以使用实体类的别名来代替实体类,达到简写的目的 </span><span style="color: #008000"&gt;--></span>
<span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;typeAliases</span><span style="color: #0000ff"&gt;></span>
    <span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; 为实体类me.gacl.domain.User配置一个别名_User </span><span style="color: #008000"&gt;--></span>
    <span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; <typeAlias type="me.gacl.domain.User" alias="_User"/&gt; </span><span style="color: #008000"&gt;--></span>
    <span style="color: #008000"&gt;<!--</span><span style="color: #008000"&gt; 为me.gacl.domain包下的所有实体类配置别名,MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名
    比如me.gacl.domain.User这个实体类的别名就会被设置成User
     </span><span style="color: #008000"&gt;--></span>
    <span style="color: #0000ff"&gt;<</span><span style="color: #800000"&gt;package </span><span style="color: #ff0000"&gt;name</span><span style="color: #0000ff"&gt;="me.gacl.domain"</span><span style="color: #0000ff"&gt;/></span>
<span style="color: #0000ff"&gt;</</span><span style="color: #800000"&gt;typeAliases</span><span style="color: #0000ff"&gt;></span>

<span style="color: #0000ff"></<span style="color: #800000">configuration<span style="color: #0000ff">>

   NAME="me.gacl.domain"/>就表示为这个包下面的所有实体类设置别名。MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名,比如me.gacl.domain.User这个实体类的别名就会被设置成User。

二、解决字段名与实体类属性名不相同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突。

title0">1、准备演示需要使用的表和数据

create table orders( order_id INT PRIMary KEY AUTO_INCREMENT,order_no VARCHAR(20),order_price FLOAT ); INSERT INTO orders(order_no,order_pricE) VALUES('aaaa',23); INSERT INTO orders(order_no,order_pricE) VALUES('bbbb',33); INSERT INTO orders(order_no,order_pricE) VALUES('cccc',22);

title1">2、定义实体类

l.domain; ** orders表对应的实体类 { ** create table orders( Mary KEY AUTO_INCREMENT, order_no VARCHAR(20), ); orders表中的字段名是不一样的 id; order_id String orderNo; order_no price; order_price { setId({ .id = String getOrderNo() { String orderNo) { .orderNo = { setPrice(E) { .price = String toString() { "Order [id=" + id + ",orderNo=" + orderNo + ",price=" + price+ "]" }

title2">3、编写测试代码

title3">3.1、编写SQL的xml映射文件

  1、创建一个orderMapper.xml文件,orderMapper.xml的内容如下:

s.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" l.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后缀) l.mapping.orderMapper" 用这个查询是查询不到我们想要的结果的, 主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录 SELEct l.domain.order" SELEct * from orders where order_id=#{iD} SELEct 用这个查询是可以正常查询到我们想要的结果的, 是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上 SELEct SELEctOrder" l.domain.order" SELEct order_id id,order_no orderNo,order_price price from orders where order_id=#{iD} SELEct 用这个查询是可以正常查询到我们想要的结果的, 是因为我们通过映射实体类属性名和表的字段名一一对应关系 SELEct SELEctOrderResultMap" SELEct * from orders where order_id=#{iD} SELEct 映射实体类属性名和表的字段名对应关系 l.domain.order" column columnorder_no" column

  2、在conf.xml文件中注册orderMapper.xml映射文件

l.mapping这个包下,所以resource写成me/gacl/mapping/orderMapper.xml resource

title4">3.2、编写单元测试代码

l.test; l.domain.order; l.util.MyBatisUtil; s.session.sqlSession; { { SqlSession sqlSession =l.getSqlSession(); ** l.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, SELEct标签的id属性值,通过SELEct标签的id属性值就可以找到要执行的SQL String statement = "me.gacl.mapping.orderMapper.getOrderById"; Order order = sqlSession.SELEctOne(statement,1);orders表中id为1的记录 使用sqlSession执行完SQL之后需要关闭SqlSession ); System.out.println(order);相应的记录 { SqlSession sqlSession =l.getSqlSession(); ** l.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, SELEctOrder是SELEct标签的id属性值,通过SELEct标签的id属性值就可以找到要执行的SQL String statement = "me.gacl.mapping.orderMapper.SELEctOrder"; Order order = sqlSession.SELEctOne(statement,1);orders表中id为1的记录 使用sqlSession执行完SQL之后需要关闭SqlSession ); System.out.println(order); { SqlSession sqlSession =l.getSqlSession(); ** l.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, SELEctOrderResultMap是SELEct标签的id属性值,通过SELEct标签的id属性值就可以找到要执行的SQL String statement = "me.gacl.mapping.orderMapper.SELEctOrderResultMap"; Order order = sqlSession.SELEctOne(statement,1);orders表中id为1的记录 使用sqlSession执行完SQL之后需要关闭SqlSession ); System.out.println(order); }

  执行单元测试的结果:

  1、testGetOrderById方法执行查询后返回一个null。

  2、testGetOrderById2方法和testGetOrderById3方法执行查询后可以正常得到想要的结果。

title5">4、总结

  上面的测试代码演示当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:

  解决办法一通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。

  解决办法二通过来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。

大佬总结

以上是大佬教程为你收集整理的Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突全部内容,希望文章能够帮你解决Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: