Mybatis中的关联查询
2020-02-03 00:28
288 查看
事先准备工作
- 根据数据库设计出对应的类,生成get&set方法
一对一查询
- sql语句为:
SELECT orders.*, user.username, userss.address FROM orders, user WHERE orders.user_id = user.id
法一:resultType
- 定义pojo类接收多余出来的字段,这里主要查询orders的信息,那么就以orders为主表进行查询。类的定义如下:
public class OrdersCustom extends Orders{ //orders的扩展类,里面只能放关于orders的东西注意和包装类的差别 private String name; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
- mapper.xml文件配置:
<select id="oneToOne" resultType="orderscustom"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
- 接口配置:
public List<OrdersCustom> oneToOne();
总结:以上就是一对一查询映射使用pojo类的情况,在查询的时候,选择一个类作为主类然后继承它,并且把多余的属性添加到这个继承类中,然后添加get&set方法,后续的步骤就和普通的查询配置是一样的了。
法二:resultMap
- 定义专门的resultMap来进行一对一查询的结果映射
- 首先还是定义pojo类,不过是在orders类中添加user属性,应为是一对一的查询关系,这里直接使用单个user属性进行接收即可。
//用户信息 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }
- 配置xml文件中的resultMap:
<!-- 定义一对一查询的resultMap --> <resultMap type="orders" id="oneToOneResultMap"> <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"/> <!-- 联系配置 --> <association property="user" javaType="user"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="birthday" property="birthday"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> </resultMap> <select id="oneToOneMap" resultMap="oneToOneResultMap"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
- 接口配置:
public List<Orders> oneToOneMap();
- 一对一查询小结:
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果没有特殊要求建议使用resultType。
resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。
一对多查询
- sql语句为:
SELECT orders.*, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, orderdetail WHERE orderdetail.orders_id=orders.id
- 在orders中添加orderdetail属性,不多这里是一对多,所以需要使用到list集合,并且添加它的get&set方法:
//订单明细 private List<Orderdetail> orderdetails; public List<Orderdetail> getOrderdetails() { return orderdetails; } public void setOrderdetails(List<Orderdetail> orderdetails) { this.orderdetails = orderdetails; }
- 然后定义reslutMap进行映射配置:
<!-- 定义一对多查询的resultMap配置 --> <resultMap type="orders" id="oneToManyResultMap"> <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"/> <!-- 定义一对多查询的联系 --> <collection property="orderdetails" ofType="orderdetail"> <id column="orderdetail_id" property="id"/> <result column="orders_id" property="ordersId"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> </collection> </resultMap> <select id="oneToManyMap" resultMap="oneToManyResultMap"> SELECT orders.*, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, orderdetail WHERE orderdetail.orders_id=orders.id</select>
- 接口配置:
public List<Orders> oneToManyMap();
多对多查询
- sql语句
SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
- 然后定义reslutMap进行映射配置:
<resultMap type="user" id="manyToManyResultMap"> <!-- 用户信息 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <!-- 订单信息 一个用户对应多个订单,使用collection映射 --> <collection property="orders" ofType="orders"> <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"/> <!-- 订单明细 一个订单包括 多个明细 --> <collection property="orderdetails" ofType="orderdetail"> <id column="orderdetail_id" property="id"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <result column="orders_id" property="ordersId"/> <!-- 商品信息 一个订单明细对应一个商品 --> <association property="items" javaType="items"> <id column="items_id" property="id"/> <result column="items_name" property="name"/> <result column="items_detail" property="detail"/> <result column="items_price" property="price"/> </association> </collection> </collection> </resultMap> <select id="manyToManyMap" resultMap="manyToManyResultMap"> SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id</select>
- 接口配置:
public List<User> manyToManyMap();
总结
其实看多对多发现,也是一对多,我感觉mybatis中的映射全部都是单向映射,所以根本不存在多对多的情况,只有一对一和一对多。不知道对不对,这是我自己的总结,所以只需了解一对一和一对多的之间的映射配置即可。。
代码下载:https://github.com/qianxi0410/Mybatis
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- mybatis一对一关联查询映射
- MyBatis配置一对一关联查询的两种方式及其双向获取时注意问题
- 【Mybatis】collection解决一对多关联查询
- Mybatis关联结果查询分页方法
- mybatis(二)---关联表查询
- mybatis一对多关联查询多条数据只显示一条的问题
- mybatis 实现关联查询的一对多和多对多查询
- MyBatis的学习总结四:实现关联表查询【参考】
- Spring+SpringMVC+mybatis+easyui整合实例(六)mybatis一对一、一对多关联查询
- MyBatis学习总结——实现关联表查询
- Mybatis_多表关联查询_resultMap_集合对象_N+1方式实现
- MyBatis(三)---实现一对一和一对多的关联表查询
- MyBatis实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- mybatis学习笔记三(实现关联数据的查询)
- Mybatis学习(3)实现关联数据的查询
- MyBatis笔记05 - 一对一关联查询
- mybatis一对多关联查询
- MyBatis——实现关联表查询