您的位置:首页 > 其它

MyBatis高级映射

2018-01-26 14:37 260 查看
一.什么是MyBatis高级映射?

 mybatis是一个持久层框架,不完全的ORM(对象关系映射)框架。sql语句需要程序员自己去编写,但是mybatis也有映射(输入参数映射、输出结果映射)。pojo通过映射数据库字段才能对数据进行增删改查操作,让程序员把精力放在写sql语句上,并对sql语句优化非常方便。即mapper.xml(映射文件)。

输入映射:

parameterType:指定输入参数类型可以简单类型、pojo、hashmap。
   对于综合查询,建议parameterType使用包装的pojo,有利于系统
扩展。

输出映射:

resultType:查询到的列名和resultType指定的pojo的属性名一致,才能映射成功。
reusltMap:可以通过resultMap 完成一些高级映射。
 如果查询到的列名和映射的pojo的属性名不一致时,通过resultMap设置列名和属性名之间的对应关系(映射关系)。可以完成映射。

1.resultMap元素中,允许有以下直接子元素:
 constructor -- 类在实例化时,用来注入结果到构造方法中;
 作用与result相同,同时可以标识出用这个字段值可以区分其他对象实例。可以理解为数据表中的主键,可以定位数据表中唯一一笔记录;
 result -- 将数据表中的字段注入到Java对象属性中;
 association -- 关联,简单的讲,就是“有一个”关系,如“用户”有一个“帐号”;
 collection -- 集合,顾名思议,就是“有很多”关系,如“用户”有很多“订单”;
 discriminator -- 使用结果集决定使用哪个个结果映射(暂不涉及)

2.这里对assacation标签的属性进行解释一下:

 property    对象属性的名称
 javaType        对象属性的类型
 column       所对应的外键字段名称
 select       使用另一个查询封装的结果

高级映射:多表关联映射

将关联查询的列映射到一个pojo属性中。(一对一)

将关联查询的列映射到一个List<pojo>中。(一对多)

二.为什么用MyBatis高级映射?

 在现实的项目中进行数据库建模时,我们要遵循数据库设计范式的要求,会对现实中的业务模型进行拆分,封装在不同的数据表中,表与表之间存在着一对多或是多对多的对应关系。进而,我们对数据库的增删改查操作的主体,也就从单表变成了多表。下面举例说明高级映射:

 (1)一个用户可以创建多个订单,一对多;

 (2)一个订单只由一个用户创建,一对一 ;

 (3)一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系

 (4)反过来多个订单明细对应一个订单,多对一关系;

 (5)多个用户创建多个订单,多对多关系。

三.一对一关系

<?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,namespace的值习惯上设置成包名+sql映射文件名,这样保证了namespace的值是唯一的-->
<mapper namespace="com.yc.mybatis.test.classMapper">

<!--
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
封装联表查询的数据(去除重复的数据)
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
-->

<select id="getClass" parameterType="int" resultMap="getClassMap">
select * from class c, teacher t  where c.teacher_id = t.t_id and c.teacher_id=#{id}
</select>

<!-- resultMap:映射实体类和字段之间的一一对应的关系 -->
<resultMap type="Classes" id="getClassMap">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>

<!--
方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
property:别名(属性名)    column:列名 -->
<!-- 把teacher的字段设置进去 -->
<select id="getClass1" parameterType="int" resultMap="getClassMap1">
select * from class where c_id=#{id}
</select>

<resultMap type="Classes" id="getClassMap1">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="getTeacher"/>
</resultMap>
<select id="getTeacher" parameterType="int" resultType="Teacher">
select t_id id,t_name name from teacher where t_id =#{id}
</select>
</mapper>

这里bean层会发生变化 这个classes的被bean层会多一个Teacher的属性,并且增加的get,set方法。

三.一对多关系demo

一对多的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="com.yc.mapper.CustomerMapper">

<resultMap type="com.yc.m.Customer" id="resultCustomerMap">
<id column="id" jdbcType="INTEGER" property="id" />
<result property="address" column="address"/>
<result property="postcode" column="postcode"/>
<result property="sex" column="sex"/>
<result property="cname" column="cname"/>
<collection property="orders" ofType="com.yc.m.Orders">
<id property="id" column="id"/>
<result property="code" column="code"/>
</collection>
</resultMap>

<select id="getCustomer" resultMap="resultCustomerMap" parameterType="int">
SELECT *
FROM t_customer
WHERE id=#{id}
</select>
</mapper>

 在这里可以明显的看出多出了一个属性ofType,这个ofType的含义就是你collection所对应的是那个bean,当然在bean层中也会发生变化 ,这里在Customer的bean中嵌套一条语句
private List<Orders> orders;   //一个Customer 对应N多个Orders
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: