概述
一、一对多查询
需求:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
sql语句:
SELECT o.id, o.user_id userId, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id
1.1 方法一:使用resultType
使用resultType,改造订单pojo类,此pojo类中包括了订单信息和用户信息,这样返回对象的时候,mybatis自动把用户信息也注入进来了。
1.1.1 改造pojo类
OrderUser类继承Order类后OrderUser类包括了Order类的所有字段,只需要定义用户的信息字段即可:
public class OrderUser extends Order { private String username; private String address; get/set... }
1.1.2 Mapper.xml
在UserMapper.xml中添加sql:
<!-- 查询订单,同时包含用户数据 --> <select id="queryOrderUser" resultType="orderUser"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id </select>
1.1.3 Mapper接口
在UserMapper接口添加方法:
/** * 一对一关联,查询订单同时包含用户 * @return */ List<OrderUser> queryOrderUser();
1.1.4 测试方法
@Test public void testQueryOrderUser() throws Exception { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用userMapper执行根据条件查询用户 List<OrderUser> list = userMapper.queryOrderUser(); for (OrderUser orderUser : list) { System.out.println(orderUser); } // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close(); }
1.1.5 小结
定义专门的pojo类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。
1.2 方法二:使用resultMap
使用resultMap,定义专门的resultMap用于映射一对一查询结果。
1.2.1 改造pojo类
在Order类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。
public class Order { // 订单id private int id; // 用户id private Integer userId; // 订单号 private String number; // 订单创建时间 private Date createtime; // 备注 private String note; private User user; get/set... }
1.2.2 Mapper.xml
这里resultMap指定orderUserResultMap:
<resultMap type="order" id="orderUserResultMap"> <id property="id" column="id"/> <result property="userId" column="user_id"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> <!-- association :配置一对一属性 --> <!-- property:order里面的User属性名 --> <!-- javaType:属性类型 --> <association property="user" javaType="user"> <!-- id:声明主键,表示user_id是关联查询对象的唯一标识--> <id property="id" column="user_id"/> <result property="username" column="username" /> <result property="address" column="address" /> </association> </resultMap> <!-- 一对一关联,查询订单,订单内部包含用户属性 --> <select id="queryOrderUserResultMap" resultMap="orderUserResultMap"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id </select>
1.2.3 Mapper接口
在UserMapper.xml中添加方法:
/** * 一对一关联,查询订单,订单内部包含用户属性 * @return */ List<Order> queryOrderUserResultMap();
1.2.4 测试方法
@Test public void testQueryOrderUserResultMap() throws Exception { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<Order> list = userMapper.queryOrderUserResultMap(); for (Order order : list) { System.out.println(order); } // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close(); }
二、一对多查询
需求:查询所有用户信息及用户关联的订单信息
用户信息和订单信息为一对多关系。
sql语句:
SELECT u.id, u.username, u.birthday, u.sex, u.address, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id
2.1 修改pojo类
在User类中加入List<Order> orders属性:
public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 private List<Order> orders; get/set... }
2.2 Mapper.xml
在UserMapper.xml添加sql:
<resultMap type="user" id="userOrderResultMap"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="sex" column="sex"/> <result property="birthday" column="birthday"/> <result property="address" column="address"/> <!-- 配置一对多关系 --> <collection property="orders" javaType="list" ofType="order"> <!-- 配置主键,是关联Order的唯一标识 --> <id property="id" column="oid"/> <result property="number" column="number" /> <result property="createtime" column="createtime" /> <result property="note" column="note" /> </collection> </resultMap> <!-- 一对多关联,查询用户的同时查询该用户下的订单 --> <select id="queryUserOrder" resultMap="userOrderResultMap"> SELECT u.id, u.username, u.birthday, u.sex, u.address, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id </select>
2.3 Mapper接口
在UserMapper.java中添加方法:
/** * 一对多关联,查询用户,用户内部包含该用户的订单 * @return */ List<User> queryUserOrder();
2.4 测试方法
@Test public void testQueryUserOrder() throws Exception { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.queryUserOrder(); for (User user : list) { System.out.println(user); } // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close(); }
转载于:https://www.cnblogs.com/yft-javaNotes/p/10199325.html
最后
以上就是危机冬瓜为你收集整理的Mybatis学习笔记(七) —— 关联查询一、一对多查询二、一对多查询的全部内容,希望文章能够帮你解决Mybatis学习笔记(七) —— 关联查询一、一对多查询二、一对多查询所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复