Mybatis_day05中怎么实现关联查询

开发技术 作者:Leah 2024-03-27 21:40:01
本篇文章给大家分享的是有关Mybatis_day05中怎么实现关联查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟�...

本篇文章给大家分享的是有关Mybatis_day05中怎么实现关联查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

 关联查询

一对一查询

案例:查询所有订单信息,关联查询下单用户信息。

注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

方法一:

使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息:

Sql语句:

SELECT  orders.*,  user.username,  userss.address  FROM  orders,  user  WHERE orders.user_id = user.id

定义po类

Po类中应该包括上边sql查询出来的所有字段,如下:

public class OrdersCustom extends Orders {  private String username;// 用户名称  private String address;// 用户地址  get/set。。。。  OrdersCustom类继承Orders类后OrdersCustom类包括了Orders类的所有字段,只需要定义用户的信息字段即可。

Mapper.xml

<!-- 查询所有订单信息 -->  <select id="findOrdersList" resultType="com.pp.mybatis.po.OrdersCustom">  SELECT  orders.*,  user.username,  user.address  FROM  orders, user  WHERE orders.user_id = user.id  </select>

Mapper接口:

public List<OrdersCustom> findOrdersList() throws Exception;  测试:  Public void testfindOrdersList()throws Exception{  //获取session  SqlSession session = sqlSessionFactory.openSession();  //获限mapper接口实例  UserMapper userMapper = session.getMapper(UserMapper.class);  //查询订单信息  List<OrdersCustom> list = userMapper.findOrdersList();  System.out.println(list);  //关闭session  session.close();  }

小结:

定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。

方法二:

使用resultMap,定义专门的resultMap用于映射一对一查询结果。

Sql语句:

SELECT  orders.*,  user.username,  user.address  FROM  orders,  user  WHERE orders.user_id = user.id

定义po类

在Orders类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。

public class Orders {  private Integer id;  private Integer userId;  private String number;  private Date createtime;  private String note;  private User user;  public Integer getId() {  return id;  }  public void setId(Integer id) {  this.id = id;  }  public Integer getUserId() {  return userId;  }  public void setUserId(Integer userId) {  this.userId = userId;  }  public String getNumber() {  return number;  }  public void setNumber(String number) {  this.number = number;  }  public Date getCreatetime() {  return createtime;  }  public void setCreatetime(Date createtime) {  this.createtime = createtime;  }  public String getNote() {  return note;  }  public void setNote(String note) {  this.note = note;  }  public User getUser() {  return user;  }  public void setUser(User user) {  this.user = user;  }  @Override  public String toString() {  return "Orders{" +  "id=" + id +  ", userId=" + userId +  ", number='" + number + '\\'' +  ", createtime=" + createtime +  ", note='" + note + '\\'' +  ", user=" + user +  '}';  }  }

Mapper.xml

<!-- 查询订单关联用户信息使用resultmap -->  <resultMap type="com.pp.po.Orders" id="orderUserResultMap">  <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"/> <!-- 一对一关联映射 --> <!-- property:Orders对象的user属性  javaType:user属性对应 的类型  -->  <association property="user" javaType="com.pp.po.User">  <!-- column:user表的主键对应的列 property:user对象中id属性-->  <id column="user_id" property="id"/>  <result column="username" property="username"/>  <result column="address" property="address"/>  </association>  </resultMap>  <select id="findOrdersWithUserResultMap" resultMap="orderUserResultMap">  SELECT  o.id,  o.user_id,  o.number,  o.createtime,  o.note,  u.username,  u.address  FROM  orders o  JOIN `user` u ON u.id = o.user_id  </select>  这里resultMap指定orderUserResultMap。  association:表示进行关联查询单条记录  property:表示关联查询的结果存储在com.pp.mybatis.po.Orders的user属性中  javaType:表示关联查询的结果类型  <id property="id"  column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id  />表示user_id是关联查询对象的唯一标识。  <result property="username"  column="username"/>:查询结果的username列对应关联对象的username属性。

Mapper接口:

public List<Orders> findOrdersListResultMap() throws Exception;  测试:  Public void testfindOrdersListResultMap()throws Exception{  //获取session  SqlSession session = sqlSessionFactory.openSession();  //获限mapper接口实例  UserMapper userMapper = session.getMapper(UserMapper.class);  //查询订单信息  List<Orders> list = userMapper.findOrdersList2();  System.out.println(list);  //关闭session  session.close();  }

小结:

使用association完成关联查询,将关联查询信息映射到pojo对象中。

一对多查询

案例:查询所有用户信息及用户关联的订单信息。

用户信息和订单信息为一对多关系。

使用resultMap实现如下:

Sql语句:

SELECT  u.*, o.id oid,  o.number,  o.createtime,  o.note  FROM  `user` u  LEFT JOIN orders o ON u.id = o.user_id

定义po类

在User类中加入Listorders属性

public class User {  private int id;  private String username;  private String sex;  private Date birthday;  private String address;  private List<Orders> ordersList;  @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\\'' + ", sex='" + sex + '\\'' + ", birthday=" + birthday +  ", address='" + address + '\\'' +  ", ordersList=" + ordersList +  '}';  }  public List<Orders> getOrdersList() {  return ordersList;  }  public void setOrdersList(List<Orders> ordersList) {  this.ordersList = ordersList;  }  public int getId() {  return id;  }  public void setId(int id) {  this.id = id;  }  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;  }  public Date getBirthday() {  return birthday;  }  public void setBirthday(Date birthday) {  this.birthday = birthday;  }  public String getAddress() {  return address;  }  public void setAddress(String address) {  this.address = address;  }  }

Mapper.xml

<resultMap type="com.pp.po.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" ofType="com.pp.po.Orders">  <id property="id" column="oid"/>  <!--用户id已经在user对象中存在,此处可以不设置-->  <!-- <result property="userId" column="id"/> -->  <result property="number" column="number"/>  <result property="createtime" column="createtime"/>  <result property="note" column="note"/>  </collection>  </resultMap>  <select id="getUserOrderList" resultMap="userOrderResultMap">  SELECT  u.*, o.id oid,  o.number,  o.createtime,  o.note  FROM  `user` u  LEFT JOIN orders o ON u.id = o.user_id  </select>

collection部分定义了用户关联的订单信息。表示关联查询结果集

property="orders":关联查询的结果集存储在User对象的上哪个属性。

ofType="orders":指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。

的意义同一对一查询。

Mapper接口:

List<User> getUserOrderList();

测试

@Test  public void getUserOrderList() {  SqlSession session = sqlSessionFactory.openSession();  UserMapper userMapper = session.getMapper(UserMapper.class);  List<User> result = userMapper.getUserOrderList();  for (User user : result) {  System.out.println(user);  }  session.close();  }

以上就是Mybatis_day05中怎么实现关联查询,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注捷杰建站行业资讯频道。

原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_1047.html
Mybatis_day05