AutoMapping
auto mapping,直译过来就是自动映射,工作原理大概如下:
假设我们有一张表,表名为person,包含id,name,age,addr这4个字段
mysql> desc person; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | age | int(2) | NO | | NULL | | | addr | varchar(30) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+
同时我们会创建一个实体类Person来与这张person表进行对应,此时Person类的属性名称和person表中的字段名称一一对应,不仅是名称对应,数据类型也是一一对应的:
package lixin.gan.pojo; public class Person { private int id; private String name; private int age; private String addr; // 省略了构造方法、setter、getter、toString }
之后我们会创建PersonMapper.xml这个映射文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="lixin.gan.mapper.PersonMapper"> <select id="selectAll" resultType="lixin.gan.pojo.Person"> select * from person </select> </mapper>
注意上面的resultType,这里的resultType已经指明了返回值的类型,于是mybatis在从结果集中取出一条数据后,会将每一行记录的字段名,对应到Person类的同名属性,将字段值赋值给Person类的同名属性。
此时需要注意:如果从person表中查询数据,取出结果集中的字段名称,和Person类中的属性值对应不上(名称不相同),那么返回的Person类的对象对应的那个属性就会设置为null。举个例子,person表中的name字段,应该auto mapping到Person类的name属性,但如果,Person类中,没有name属性,却有一个name1属性,那么再返回结果的时候,name1属性就会初始为null。
虽然resultType很方便,可以自动的实现映射,但是,我们往往需要进行自定义的映射,此时就可以使用resultMap了。
使用resultMap实现单表映射
假设实体类中Person.java的属性更改如下:
package lixin.gan.pojo; public class Person { private int id1; private String name1; private int age1; private String addr1; // 省略了构造方法、setter、getter、toString }
要想使用mybatis时,person表的字段仍能正确对应到Person类中的准确字段中,使用resultMap来指定对应关系,可以这样做:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="lixin.gan.mapper.PersonMapper"> <!-- 定义数据表中的字段,与实体类中的属性对应关系 --> <resultMap type="lixin.gan.pojo.Person" id="testResultMap"> <!-- 数据表中的主键列字段使用<id />标签, 其他字段使用<result />标签 --> <!-- column表示的是数据表中的字段, property表示的是实体类中对应的属性 --> <id column="id" property="id1" /> <result column="name" property="name1" /> <result column="age" property="age1" /> <result column="addr" property="addr1" /> </resultMap> <!-- 此时不用resultType属性,而是使用resultMap属性,属性值就是前面定义的对应关系id --> <select id="selectAll" resultMap="testResultMap"> select * from person </select> </mapper>