一般MyBatis数据封装类的属性都要和数据库中的表的列名相同,这样便于在映射配置文件中写SQL语句时引起不必要的麻烦,但是如果封装类的属性和表的列名不同,也仍然有办法让程序正确运行。
假如数据库中,有一张表,其中的列名分别为:
id
name
address
email
一般情况下,会将封装类的属性写成如下形式:
private id;
private name;
private address;
private email;
但是现在, 如果将上述属性改为下面这种形式:
private userId;
private userName;
private userAddress;
private userEmail;
这样在映射配置文件中的SQL语句如果还是按原来的写法不做改动,那么从数据库读取到的数据就无法直接封装到类属性中。为了解决这种问题,有以下两种方法。(表的名称为user,封装类为User)
为表的列名起一个别名
若原本的xml文件中的SQL语句如下:
<select id="find" resultType="com.spark.domain.User">
select * from user
</select>
则应改为如下形式:
<select id="find" resultType="com.spark.domain.User">
select id as userId, name as userName, address as userAddress, email as userEmail from user
</select>
这样就相当于为表的列名起了别名,在封装过程中,列名与类属性可以对应起来,就能正确的封装数据。
配置列名和类属性的对应关系
这种方法不需要更改SQL语句,但是需要在映射配置文件中添加resultMap标签属性,如下:
<resultMap id="userMap" type="com.spark.domain.User">
<!-- 主键对应关系 -->
<id property="userId" column="id"></id>
<!-- 非主键对应关系 -->
<result property="userName" column="name"></result>
<result property="userAddress" column="address"></result>
<result property="userEmail" column="email"></result>
</resultMap>
上述xml文件中的resultMap标签中的id是一个唯一标志,可以自己定义,type表示对应的实体类的全限定类名。
resultMap标签中的元素,就是各列的对应关系,property是类属性名,column是表的列名。
然后在查询标签中将resultType属性更改为reslutMap属性,并且reslutMap属性的值就是自定义的值,这里的值就是userMap,如下:
<select id="find" resultMap="userMap">
select id as userId, name as userName, address as userAddress, email as userEmail from user
</select>
这个属性的意思就是将查询的结果以reslutMap的映射关系封装到实体类中。
注意点
- 第一种方式执行的效率更快,第二种方式由于多了一层映射关系,执行效率会有所下降。
- 第二种方式的复用性更好,可以直接在其他标签中添加resultMap属性。第一种方法需要每次都写很长的SQL语句。
- 由于Mysql数据库在Linux下区分大小写,在Windows下不区分大小写。所有如果表的列名为username,类属性为userName,这种写法在Windows下也是可以正确封装数据的。
- 在配置列名和类属性的对应关系时,property对应类属性,是严格区分大小写的;column对应MySQL列名,是不区分大小写的。