mybatis--高级结果映射之一对一、一对多、多对多
2017-02-09 13:42
567 查看
高级结果映射
一、数据模型分析
1、 明确每张表存储的信息2、 明确每张表中关键字段(主键、外键、非空)
3、 明确数据库中表与表之间的外键关系
4、 明确业务中表与表的关系(建立在具体的业务)
二、一对一映射
1、需求
查询订单信息,关联查询用户信息2、SQL语句
主信息:orders从信息:user
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex` FROM orders, USER WHERE orders.`user_id` = user.`id`
3、使用resultType输出映射
3.1创建扩展类OrdersExt:
package po; public class OrdersExt extends Orders{ private String username; private String sex; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
Orders:
package po; import java.util.Date; import java.util.List; public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //订单明细集合 private List<Orderdetail> detailList;
3.2映射文件
<!-- 一对一映射之resultMap -->
<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex` FROM orders, USER WHERE orders.`user_id` = user.`id`</select>
3.3Mapper接口
public interface OrdersMapper { //一对一映射之resultType public List<OrdersExt> findOrdersAndUser();
3.4测试代码
@Test public void testFindOrdersAndUser() { // 创建OrdersMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersExt> list = mapper.findOrdersAndUser(); sqlSession.close(); }
3.5小结
使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。
而且映射的属性要存在于一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。
4、使用resultMap输出映射
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。4.1修改扩展类
package po; public class OrdersExt extends Orders{ private String username; private String sex; //用户信息 private User user;
4.2映射文件
<!-- OrdersAndUserRstMap -->
<resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndUserRstMap">
<!-- 订单信息 -->
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<!-- 用户信息(一对一) -->
<!-- association:一对一关联映射 -->
<!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
<!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
<association property="user" javaType="com.itheima.mybatis.po.User">
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
</association>
</resultMap>
<!-- 一对一映射之resultMap -->
<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex` FROM orders, USER WHERE orders.`user_id` = user.`id`</select>
4.3Mapper接口
//一对一之resultMap public List<OrdersExt> findOrdersAndUserRstMap();
4.4测试代码
@Test public void testFindOrdersAndUserRstMap() { // 创建OrdersMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersExt> list = mapper.findOrdersAndUserRstMap(); sqlSession.close(); }
5、小结
在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,比如:查询订单列表,然后在点击列表中的查看订单明细按钮,这个时候就需要使用resultMap进行结果映射。
而resultType更适用于查询明细信息,比如,查询订单明细列表。
三、一对多映射
1、需求
查询订单信息,关联查询订单明细信息及用户信息
2、SQL语句
主信息:orders从信息:orderdetail、user
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex`, orderdetail.`id` detailId, orderdetail.`items_id`, orderdetail.`items_num` FROM orders, USER, orderdetail WHERE orders.`user_id` = user.`id` AND orders.`id` = orderdetail.`orders_id`
3、修改扩展类
package po; import java.util.List; public class OrdersExt extends Orders{ private String username; private String sex; private User user; ///订单明细信息 private List<Orderdetail> detailList;
Orderdetail:
package po; public class Orderdetail { private Integer id; private Integer ordersId; private Integer itemsId; private Integer itemsNum; //商品信息 private Items items;
4、映射文件
<!-- OrdersAndDetailRstMap --> <!-- extends:可以继承一个已有的resultMap,指定resultMap的唯一标示即可 --> <!-- 注意:继承时,只能继承type类型是一样的resultMap --> <resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndDetailRstMap" extends="OrdersAndUserRstMap"> <!-- 订单明细信息(一对多) --> <!-- collection:映射一对多关系 --> <!-- property:映射的多的那个集合的属性 --> <!--ofType: 集合内的对象的类型 --> <collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail"> <id column="detailId" property="id" /> <result column="items_id" property="itemsId" /> <result column="items_num" property="itemsNum" /> </collection> </resultMap> <!-- 一对多映射 --> <select id="findOrdersAndDetailRstMap" resultMap="OrdersAndDetailRstMap"> SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex`, orderdetail.`id` detailId, orderdetail.`items_id`, orderdetail.`items_num` FROM orders, USER, orderdetail WHERE orders.`user_id` = user.`id` AND orders.`id` = orderdetail.`orders_id` </select>
5、Mapper接口
//一对多 public List<OrdersExt> findOrdersAndDetailRstMap();
6、测试代码
@Test public void testFindOrdersAndDetailRstMap() { // 创建OrdersMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersExt> list = mapper.findOrdersAndDetailRstMap(); sqlSession.close(); }
四、多对多映射
多对多映射是一对多映射的特例1、需求
查询用户信息,关联查询该用户购买的商品信息2、SQL语句
主信息:user从信息:items、orders、orderdetail
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex`, orderdetail.`id` detailId, orderdetail.`items_id`, orderdetail.`items_num`, items.`name`, items.`price` FROM orders, USER, orderdetail, items WHERE orders.`user_id` = user.`id` AND orders.`id` = orderdetail.`orders_id` AND orderdetail.`items_id` = items.`id`
3、修改PO类
在User类中添加List<Orders> orders;public class User implements Serializable{ private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 //订单信息 private List<Orders> orders;
在Orders类中添加List<Orderdetail> detailList;
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //订单明细集合 private List<Orderdetail> detailList;
在Orderdetail中添加Items items;
public class Orderdetail { private Integer id; private Integer ordersId; private Integer itemsId; private Integer itemsNum; //商品信息 private Items items;
4、Mapper接口
//多对多 public List<User> findUserAndItemsRstMap();
5、映射文件
<!-- UserAndItemsRstMap --> <resultMap type="com.itheima.mybatis.po.User" id="UserAndItemsRstMap"> <!-- 用户信息 --> <id column="user_id" property="id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> <!-- 订单信息(一对多) --> <collection property="orders" ofType="com.itheima.mybatis.po.Orders"> <id column="id" property="id" /> <result column="user_id" property="userId" /> <result column="number" property="number" /> <!-- 订单明细信息(一对多) --> <collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail"> <id column="detailId" property="id" /> <result column="items_id" property="itemsId" /> <result column="items_num" property="itemsNum" /> <!-- 商品信息(一对一) --> <association property="items" javaType="items"> <id column="items_id" property="id" /> <result column="name" property="name" /> <result column="price" property="price" /> </association> </collection> </collection> </resultMap> <!-- 多对多 --> <select id="findUserAndItemsRstMap" resultMap="UserAndItemsRstMap"> SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex`, orderdetail.`id` detailId, orderdetail.`items_id`, orderdetail.`items_num`, items.`name`, items.`price` FROM orders, USER, orderdetail, items WHERE orders.`user_id` = user.`id` AND orders.`id` = orderdetail.`orders_id` AND orderdetail.`items_id` = items.`id` </select>
6、测试代码
@Test public void testFindUserAndItemsRstMap() { // 创建OrdersMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<User> list = mapper.findUserAndItemsRstMap(); sqlSession.close(); }
相关文章推荐
- (八)mybatis学习之高级映射(一对一、一对多、多对多)
- Mybatis高级映射(一对一的查询以及一对多)
- Mybatis(四) 高级映射,一对一,一对多,多对多映射
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis映射 一对一、一对多、多对多高级映射
- mybatis高级映射(一对一,一对多,多对多)
- Mybatis高级结果映射一对一或一对多
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis-高级结果映射之一对一(多种方式, 有没提到的你找我)
- mybatis中的高级映射一对一、一对多、多对多
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- MyBatis高级映射之-一对一(一对多)关联映射
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- 框架学习系列 mybatis 第十八篇 高级结果一对一结果映射之resultMap的使用
- 【mybatis深度历险系列】mybatis中的高级映射一对一、一对多、多对多
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)