一、连接数据库的配置单独放在一个properties文件中
之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下:
其实我们完全可以将数据库的连接配置信息写在一个properties文件中,然后在conf.xml文件中引用properties文件,具体做法如下:
1、在src目录下新建一个db.properties文件,如下图所示:
在db.properties文件编写连接数据库需要使用到的数据库驱动,连接URL地址,用户名,密码,如下:
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis name=root password=XDP
2、在MyBatis的conf.xml文件中引用db.properties文件,如下:
二、为实体类定义别名,简化sql映射xml文件中的引用
之前,我们在sql映射xml文件中的引用实体类时,需要写上实体类的全类名(包名+类名),如下:
<!-- 创建用户(Create) --> <insert id="addUser" parameterType="me.gacl.domain.User"> insert into users(name,age) values(#{name},#{age}) </insert>
parameterType=”
me.gacl.domain.User
“这里写的实体类User的全类名
me.gacl.domain.User,
每次都写这么一长串内容挺麻烦的,而我们希望能够简写成下面的形式
<insert id="addUser2" parameterType="_User"> insert into users(name,age) values(#{name},#{age}) </insert>
parameterType=”
_User
“这样写就简单多了,为了达到这种效果,我们需要在conf.xml文件中为实体类=”
me.gacl.domain.User
“定义一个别名为”
_User
“,具体做法如下:
在conf.xml文件中<configuration></configuration>标签中添加如下配置:
<typeAliases> <typeAlias type="me.gacl.domain.User" alias="_User"/> </typeAliases>
这样就可以为
me.gacl.domain.User
类定义了一个别名为
_User,
以后
_User
就代表了
me.gacl.domain.User
类,这样sql映射xml文件中的凡是需要引用
me.gacl.domain.User
类的地方都可以使用
_User
来代替,这就达到了一个简化实体类引用的目的。
除了可以使用<typeAliastype=”me.gacl.domain.User” alias=”_User”/>这种方式单独为某一个实体类设置别名之外,我们还可以使用如下的方式批量为某个包下的所有实体类设置别名,如下:
-
-
<!-- 配置实体类的别名,配置实体类别名的目的是为了在引用实体类时可以使用实体类的别名来代替实体类,达到简写的目的 -->
-
<typeAliases>
-
<!-- 为实体类me.gacl.domain.User配置一个别名_User -->
-
<!-- <typeAlias type="me.gacl.domain.User" alias="_User"/> -->
-
<!-- 为me.gacl.domain包下的所有实体类配置别名,MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名
-
比如me.gacl.domain.User这个实体类的别名就会被设置成User
-
-->
-
<package name="me.gacl.domain"/>
-
</typeAliases>
-
<package name=”me.gacl.domain”/>就表示为这个包下面的所有实体类设置别名。MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名,比如me.gacl.domain.User这个实体类的别名就会被设置成User。
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突。
一、准备演示需要使用的表和数据
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);
二、定义实体类
-
package me.gacl.domain;
-
-
/**
-
* @author gacl
-
* 定义orders表对应的实体类
-
*/
-
public
class Order {
-
/**
-
*
-
CREATE TABLE orders(
-
order_id INT PRIMARY KEY AUTO_INCREMENT,
-
order_no VARCHAR(20),
-
order_price FLOAT
-
);
-
*/
-
-
//Order实体类中属性名和orders表中的字段名是不一样的
-
private
int id;
//id===>order_id
-
private String orderNo;
//orderNo===>order_no
-
private
float price;
//price===>order_price
-
-
public int getId() {
-
return id;
-
}
-
-
public void setId(int id) {
-
this.id = id;
-
}
-
-
public String getOrderNo() {
-
return orderNo;
-
}
-
-
public void setOrderNo(String orderNo) {
-
this.orderNo = orderNo;
-
}
-
-
public float getPrice() {
-
return price;
-
}
-
-
public void setPrice(float price) {
-
this.price = price;
-
}
-
-
@Override
-
public String toString() {
-
return
"Order [id=" + id +
", orderNo=" + orderNo +
", price=" + price+
"]";
-
}
-
}
三、编写测试代码
3.1、编写SQL的xml映射文件
1、创建一个orderMapper.xml文件,orderMapper.xml的内容如下:
2、在conf.xml文件中注册orderMapper.xml映射文件
<mappers> <!-- 注册orderMapper.xml文件, orderMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/orderMapper.xml--> <mapper resource="me/gacl/mapping/orderMapper.xml"/> </mappers>
3.2、编写单元测试代码
执行单元测试的结果:
1、testGetOrderById方法执行查询后返回一个null。
2、testGetOrderById2方法和testGetOrderById3方法执行查询后可以正常得到想要的结果。
四、总结
上面的测试代码演示当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:
解决办法一: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通
过在sql语句中定义别名来解决字段名和属性名的映射关系的。
解决办法二: 通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式
来解决字段名和属性名的映射关系的。