Mybatis

66次阅读
没有评论

共计 6396 个字符,预计需要花费 16 分钟才能阅读完成。

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

  关联查询

一对一查询

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

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

方法一:

使用 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 中怎么实现关联查询,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计6396字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)