Mybatis关联查询
一、数据模型:
一、一对一关联查询 。
1、需求:查询所有订单信息,关联查询下单用户信息。
2、注意:因为一个订单信息只会是一个客户下单,所以从查询订单出发关联查询用户信息为一对一查询。
sql语句:
SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id
3、方法一:使用resultType改造pojo类,此pojo类中包括了订单信息和客户信息,返回对象时,mybatis自动将客户信息也注入进来。
3.1 改造pojo类,OrderUser类继承Order类后OrderUser类包括了Order类的所有字段,只需要定义用户的信息字段即可。
public class OrdersUser extends Orders{ private String username; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
3.2 在UserMapper.xml添加sql。
<!-- 查询订单,同时包含用户数据 --> <select id="queryOrderUser" resultType="orderUser"> 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 </select>
3.2 Mapper接口。
在UserMapper接口添加queryOrderUser方法。
/** * 一对一关联查询,查询订单同时包含用户信息 * @return */ public List<OrdersUser> queryOrdersUser();
3.3 测试方法。
@Test public void testQueryOrderUser() { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用userMapper执行根据条件查询用户 List<OrderUser> list = userMapper.queryOrderUser(); for (OrderUser ou : list) { System.out.println(ou); } // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close(); }
3.4 小结:定义专门的pojo类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。
4、方法二:使用resultMap,定义专门的resultMap用于映射一对一查询结果。
4.1 改造pojo类,在Order类中加入用于存储关联查询的客户信息的User属性,因为订单关联查询客户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。
// 订单id private int id; // 用户id private Integer userId; // 订单号 private String number; // 订单创建时间 private Date createtime; // 备注 private String note; private User user;
4.2 Mapper映射文件中配置映射关系,这里resultMap指定orderUserResultMap,。
<!-- 一对一的关联查询 --> <resultMap type="orders" id="ordersUserResultMap"> <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="queryOrdersUser" resultMap="ordersUserResultMap" > SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `orders` o LEFT JOIN `user` u ON o.user_id = u.id </select>
4.3 Mapper接口。
/** * 一对一关联,查询订单,订单内部包含用户属性 * @return */ public List<Orders> queryOrdersUserResultMap();
4.4 测试方法。
@Test public void testQueryOrderUserResultMap() { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = this.sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用userMapper执行根据条件查询用户 List<Order> list = userMapper.queryOrderUserResultMap(); for (Order o : list) { System.out.println(o); } // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close(); }
二、一对多关联查询。
1、需求:查询所有用户信息及用户关联的订单信息。
2、注意、客户信息和订单信息为一对多关系。一个客户可以下多个订单,所以从客户信息出发查询客户下的订单信息则为一对多查询。
sql语句:
SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id
3、修改pojo类,在User类中加入用于存储客户信息的orders属性。
private Integer id; private String username; // 用户姓名 private Date birthday;// 生日 private String sex;// 性别 private String address;// 地址 private List<Orders> orders;
4、Mapper.xml配置文件。使用resultMap配置一对多的映射关系。
<resultMap type="user" id="userOrderResultMap"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="birthday" column="birthday" /> <result property="sex" column="sex" /> <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>
5、配置文件中添加sql。
<!-- 一对多关联,查询订单同时查询该用户下的订单 --> <select id="queryUserOrder" resultMap="userOrderResultMap"> SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id </select>
6、编写Mapper接口。
/** * 一对多关联查询,擦讯用户,用户内部包含该用户的订单 * @return */ public List<User> queryUserOrders();
7、测试方法。
/** * 一对多的查询,查询用户同时查询该用户下的订单 */ @Test public void queryUserOrders(){ // 1.创建sqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 2.从SqlSession对象中获取Mapper接口的动态代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 3.执行查询方法 List<User> list = userMapper.queryUserOrders(); // 4.遍历集合 for (User user : list) { // 5.打印结果 System.out.println(user); } // 6.关闭资源 sqlSession.close(); }