复习之MyBatis基础用法(二)——ResultMap用法详解

ResultMap – 是最复杂也是最强大的元素

它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事情。事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。 ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。

半自动映射

当数据库某些字段名称和实体类属性命名不同时候(大小写不同不需要,因为sql语句不分大小写),可以使用ResultMap让实体类和字段名映射

  • property:指定对象的属性名
  • javaType:指定要映射的对象的类型。
<resultMap type="Orders" id="orders">
	
	<!-- 可以半自动映射 只写不同的  -->
	<result column="user_id" property="userId"/>
	<!-- 主键配id,可以提高MyBatis性能 -->
<!-- 手动映射		<id column="id" property="id"/>
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>
		<result column="createtime" property="createtime"/>
		<result column="note" property="note"/> -->
	</resultMap>

	<select id="selectOrdersList" resultMap="orders">
		Select id,user_id,number,createtime,note from orders
	</select>

复杂结果映射

联表查询是需要得到一个复杂结果的数据,需要ResultMap把需要的数据映射

一对一关联查询

  • association专门用来建立1对1关联关系。
<!-- 一对一关联查询 -->
	
	<resultMap type="Orders" id="order">
		<result column="id" property="id"/>
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>
		<!-- Order内里面还有一个类变量user,并且order与user是一对一的关系 -->
		<!-- javaType="User"指明类变量的类型 -->
		<!-- 类变量的属性一一映射 -->
		<association property="user" javaType="User">
			<id column="user_id" property="id"/>
			<result column="username" property="username"/>
		</association>
		
	</resultMap>
	
<!-- 第二种方式-->
<resultMap type="User" id="userMap">
			<id column="user_id" property="id"/>
			<result column="username" property="username"/>
	</resultMap>
	
<resultMap type="Orders" id="order">
		<result column="id" property="id"/>
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>
		<!-- 类变量直接映射层一个map -->
		<association property="user" javaType="User" resultMap="userMap"/>
	</resultMap>
	<!--  查询语句 -->
	 <select id="selectOrders" resultMap="order">
		select
		o.id,o.user_id,o.number,o.createtime,
		u.username
		from orders o 
		left join e_user u on o.user_id = u.id
	</select> 

上述的实体类

public class Orders  implements Serializable{
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;
    
    //附件对象
    private User user;
    //get、set方法省略

一对多关联查询

  • collection专门用来建立1对1关联关系。
	<resultMap type="User" id="UserAddressMap">
		<id property="id" column="id"/>
		<result property="userCode" column="userCode"/>
		<result property="userName" column="userName"/>
		<!-- 一个人有多个地址 -->
		<collection property="addressList" ofType="Address">
			<id property="id" column="aId"/>
			<result property="postCode" column="postCode"/>
			<result property="contact" column="contact"/>
			<result property="addressDesc" column="addressDesc"/>
		</collection>
	</resultMap>
<!-- 第二种方式 -->
	<resultMap type="Address" id="AddressMap">
		<id property="id" column="aId"/>
		<result property="postCode" column="postCode"/>
		<result property="contact" column="contact"/>
		<result property="addressDesc" column="addressDesc"/>
	</resultMap>
	<resultMap type="User" id="UserAddressMap2">
		<id property="id" column="id"/>
		<result property="userCode" column="userCode"/>
		<result property="userName" column="userName"/>
		<!-- 一个人有多个地址 -->
		<collection property="addressList" ofType="Address" resultMap="AddressMap"/>
	</resultMap>
	<!-- 查询语句 -->
	<select id="getUserByUserId3" resultMap="UserAddressMap2">
		select u.*,a.id aId,a.postCode,a.contact,a.addressDesc from smbms_user u inner join smbms_address a
		on u.id = a.userId
		where u.id = #{userId}
	</select>

上述实体类

public class User {
	private Integer id; //id 
	private String userCode; //用户编码
	private String userName; //用户名称
	private String userPassword; //用户密码
	private Integer gender;  //性别
	private Date birthday;  //出生日期
	private String phone;   //电话
	private String address; //地址
	private Integer userRole;    //用户角色
	private String userRoleName;
	//角色对象
	private Role role;
	
	//地址集合对象
	
	private List<Address> addressList;
	
	private Integer createdBy;   //创建者
	private Date creationDate; //创建时间
	private Integer modifyBy;     //更新者
	private Date modifyDate;   //更新时间
	//get、set方法省略

猜你喜欢

转载自blog.csdn.net/IManiy/article/details/82928874