mybatis 使用resultMap

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>

  

猜你喜欢

转载自www.cnblogs.com/-beyond/p/10134466.html