case mybatis 不同表_Mybatis多表查询(一对一、一对多、多对多)(转)

Mybatis的多表级联查询 。

一对一可以通过实现,一对多和多对多通过实现。

元素,可以灵活选择属性column使用哪个字段进行鉴别。

一. 一对一的级联查询

对user_t表和book_t表进行连接查询。sql语句类似如下:

select b.book_id,b.name,b.publishers,a.id,a.user_name

from user_t a

inner join book_t b on b.book_id=a.id

当然,sql语句也可以是成普通的多表级联查询,如下所示:

select b.book_id,b.name,b.publishers,a.id,a.user_name

from user_t a ,book_t b

where b.book_id=a.id

在User类中添加Book类的对象,还要加上getter()和setter(),以便在UserMapper.xml中进行映射。如下示:

public class User {

private Integer id;

private String userName;

private String password;

private Integer age;

//添加Book对象,还有getter(),setter()方法

private Book book;

public Book getBook() {

return book;

}

public void setBook(Book book) {

this.book = book;

}

//以下还有其他的getter(),setter(),本文忽略不写

// ......

}

UserMapper.xml如下示:

在中,数据表user_t的字段映射User对象的属性。

表示主键,里面是其他字段。

而其中的 中的property,对应在User类中新添加的Book类对象属性

select b.book_id,b.name,b.publishers,a.id,a.user_name

from user_t a

inner join book_t b on b.book_id=a.id

二、一对多的级联查询

一个User拥有多个Role。查看某个用户拥有哪些角色的sql语句,类似如下:

SELECT a.userName,a.name,b.uid,b.role_id FROM user_info a

INNER JOIN sys_user_role b

ON a.uid=b.uid

WHERE a.userName="admin"

同样的,在User类中添加角色列表属性ListroleIdList,还要加上getter()和setter(),以便在UserMapper.xml中进行映射如下所示:

public class User {

private String uid;

//帐号

private String userName;

//名称

private String name;

//密码

private String password;

//添加roleIdList属性和对应的getter(),setter()

private List roleIdList;

public List getRoleIdList() {

return roleIdList;

}

public void setRoleIdList(List roleIdList) {

this.roleIdList = roleIdList;

}

}

在UserMap添加如下:

SELECT a.userName,a.name,b.uid,b.role_id FROM user_info a

INNER JOIN sys_user_role b

ON a.uid=b.uid

WHERE a.userName=#{userName}

注意:

在一对一的查询中,是通过 javaType 的定义去声明实体映射的。

一对一有两种方式,一种是在中写select,另一种是JavaType

**而 在一对多的查询中,则是使用 oftype 进行声明的。 **

三、更复杂的多个表的一对多的级联查询

1.需求

查询用户及用户购买的商品信息。

2.sql语句

查询主表:用户表

关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所有关联表:orders、orderdetail、items。

SELECT

orders.*,

USER.username,

USER.sex,

USER.address,

orderdetail.id orderdetail_id,

orderdetail.items_id,

orderdetail.items_num,

orderdetail.orders_id,

items.name items_name,

items.detail items_detail,

items.price items_price

FROM

orders,

USER,

orderdetail,

items

WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id

3.映射思路

将用户信息映射到user中。

在User类中添加订单列表属性Listorderslist,将用户创建的订单映射到orderslist;

在Orders中田间订单明细列表属性Listorderdetails,将订单的明细映射到orderdetails;

在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items。

mapper.xml

SELECT

orders.*,

USER.username,

USER.sex,

USER.address,

orderdetail.id orderdetail_id,

orderdetail.items_id,

orderdetail.items_num,

orderdetail.orders_id,

items.name items_name,

items.detail items_detail,

items.price items_price

FROM

orders,

USER,

orderdetail,

items

WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id

5.定义resultMap

6.mapper.java

public interface OrdersCustomMapper {

//查询订单,级联查询用户信息

public List findOrdersUser() throws Exception;

//查询订单,级联查询用户信息,使用resultMap

public List findOrdersUserResultMap() throws Exception;

//查询订单(关联用户)及订单明细

public List findOrdersAndOrderDetailResultMap() throws Exception;

//查询用户购买商品信息

public List findUserAndItemsResultMap() throws Exception;

}

四、多对多的级联查询

现实中有许多用户 , 一个用户可以对应多个角色,而一个角色又可以由多个用户担当,

这个时候用户和角色是以一张用户角色表建立关联关系,这样用户和角色就是多对多的关系

在程序中,多对多的级联查询往往会被拆分为两个一对多来处理。

首先,按照示例二的一对多的级联查询,

一个用户对应多个角色, 需要在用户类User中添加角色列表属性 ListroleIdList;以及该属性的getter()和setter()。

同理的,一个角色对应多个用户,需要在角色类Role中添加用户列表属性 ListuserIdList; 以及该该属性的getter()和setter()。

其余步骤和示例二一样。

五、元素

元素,鉴别器 , 它的属性 column 代表使用哪个字段进行鉴别。

示例如下:

这里的column是 sex ,而它的子元素 case,则用于进行分类选择 , 类似于 Java 的 switch...case...语句。

而 resultMap 属性表示采用哪个 ResultMap 去映射 。

当 sex=l时 ,则 使用maleHealthFormMapper 进行映射。

当sex=2时,则使用femaleHealthFormMapper进行映射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值