Mybatis学习笔记(九)——一对一和一对多查询
2018-03-20 18:29
666 查看
本博客源码下载:戳我一下
Mybatis学习笔记汇总:戳我一下
一对一查询
案例:查询所有订单信息,关联查询下单用户信息。注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
方法一:
使用resultType,定义订单信息pojo类,此pojo类中包括了订单信息和用户信息。
1、先写sql语句
SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id
2、写一个pojp类
public class OrdersCustom extends Orders { private String username;// 用户名称 private String address;// 用户地址 get和set方法省略 }
OrdersCustom类继承
Orders类后
OrdersCustom类包括了
Orders类的所有字段,只需要定义用户的信息字段即可。
3、配置
Mapper.xml
<!-- 查询所有订单信息 --> <select id="findOrdersList" resultType="com.jiayifan.po.OrdersCustom"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
4、写
Mapper接口
public List<OrdersCustom> findOrdersList() throws Exception;
5、测试
Public void testfindOrdersList() throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 OneToOneMapper oneToOneMapper = session.getMapper(OneToOneMapper.class); //查询订单信息 List<OrdersCustom> list = oneToOneMapper.findOrdersList(); System.out.println(list); //关闭session session.close(); }
6、总结
定义专门的pojo类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。
方法二:
使用resultMap,定义专门的
resultMap用于映射一对一查询结果。
1、sql语句与方法一相同
2、定义pojo类
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //用户信息 private User user; get和set方法省略 }
3、定义
resultMap
需要关联查询映射的是用户信息,使用
association将用户信息映射到订单对象的用户属性中。
<!-- 订单信息resultmap --> <resultMap type="com.jiayifan.po.Orders" id="userordermap"> <!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 --> <id property="id" column="id"/> <result property="userId" column="user_id"/> <result property="number" column="number"/> <association property="user" javaType="com.jiayifan.po.User"> <!-- 这里的id为user的id,如果写上表示给user的id属性赋值 --> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> </resultMap>
association:表示进行关联查询单条记录
property:表示关联查询的结果存储在
com.jiayifan.po.Orders的
user属性中
javaType:表示关联查询的结果类型
<id property="id" column="user_id"/>:查询结果的
user_id列对应关联对象的id属性,这里是
<id />表示
user_id是关联查询对象的唯一标识。
<result property="username" column="username"/>:查询结果的
username列对应关联对象的
username属性。
4、配置
Mapper.xml
<select id="findOrdersListResultMap" resultMap="userordermap"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
5、
Mapper接口
public List<Orders> findOrdersListResultMap() throws Exception;
6、测试
Public void testfindOrdersListResultMap()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 OneToOneMapper oneToOneMapper = session.getMapper(OneToOneMapper.class); //查询订单信息 List<Orders> list = oneToOneMapper.findOrdersListResultMap(); System.out.println(list); //关闭session session.close(); }
7、总结
使用
association完成关联查询,将关联查询信息映射到pojo对象中。
一对多查询
案例:查询所有订单信息及订单下的订单明细信息。订单信息与订单明细为一对多关系。使用
resultMap实现如下:
1、写sql语句
SELECT orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num FROM orders,user,orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id
2、定义pojo类
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //用户信息 private User user; //订单明细 private List<Orderdetail> orderdetails; get和set方法省略 }
3、定义
resultMap
<!-- 订单信息resultmap --> <resultMap type="com.jiayifan.po.Orders" id="userorderdetailmap"> <id property="id" column="id"/> <result property="userId" column="user_id"/> <result property="number" column="number"/> <association property="user" javaType="com.jiayifan.po.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> <collection property="orderdetails" ofType="com.jiayifan.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="itemsId" column="items_id"/> <result property="itemsNum" column="items_num"/> </collection> </resultMap>
collection部分定义了查询订单明细信息。
collection:表示关联查询结果集
property="orderdetails":关联查询的结果集存储在
com.jiayifan.po.Orders上那个属性。
ofType="cn.itcast.mybatis.po.Orderdetail":指定关联查询的结果集中的对象类型即List中的对象类型。
<id />及
<result/>的意义同一对一查询。
这里发现配置文件中的上半部分和一对一查询时的配置文件相同,这时我们可以使用
resultMap的继承方法
<resultMap type="com.jiayifan.po.Orders" id="userorderdetailmap" extends="com.jiayifan.mapper.OneToOneMapper.userordermap"> <collection property="orderdetails" ofType="com.jiayifan.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="itemsId" column="items_id"/> <result property="itemsNum" column="items_num"/> </collection> </resultMap>
使用extends继承订单信息
userordermap。
4、
Mapper接口:
public List<Orders> findOrdersDetailList () throws Exception;
5、测试
Public void testfindOrdersDetailList()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 OneToMoreMapper oneToMoreMapper = session.getMapper(OneToMoreMapper.class); //查询订单信息 List<Orders> list = oneToMoreMapper.findOrdersDetailList(); System.out.println(list); //关闭session session.close(); }
6、总结
使用
collection完成关联查询,将关联查询信息映射到集合对象。
相关文章推荐
- MyBatis学习笔记:一对一和一对多关联表查询
- mybatis学习笔记(九)一对一关联表查询
- Mybatis学习——一对一关联表查询
- Mybatis学习总结之一对一关联表查询
- Springmvc和Mybatis整合实现商品查询 ---SpringMVC学习笔记(二)
- MyBatis学习笔记(五)——实现关联表查询
- 表一对一关联([尚硅谷]_张晓飞_Mybatis 学习笔记三)
- Mybatis学习(07)-高级映射之一对一查询
- 个人学习历程之菜鸟初体验mybatis高级映射一对一查询
- Mybatis学习笔记---day02关联关系查询
- MyBatis学习总结——实现级联表查询(一对一,一对多)
- 【MyBatis学习08】高级映射之一对一查询
- JavaWeb学习笔记-mybatis-23-查询缓存(一级缓存)
- Mybatis学习笔记(十二)【一对多查询】
- Mybatis学习笔记-一对一关联
- 查询缓存---Mybatis学习笔记(十)
- MyBatis 学习总结(五)—— 一对一关联表查询
- JavaWeb学习笔记-mybatis-24-查询缓存(二级缓存)
- Mybatis学习笔记(十三)【多对多查询】
- 查询缓存---Mybatis学习笔记(十)