您的位置:首页 > 其它

Mybatis中的关联查询

2020-02-03 00:28 288 查看

事先准备工作

  • 根据数据库设计出对应的类,生成get&set方法

一对一查询

  • sql语句为:
SELECT
orders.*,
user.username,
userss.address
FROM
orders,
user
WHERE orders.user_id = user.id

法一:resultType

  • 定义pojo类接收多余出来的字段,这里主要查询orders的信息,那么就以orders为主表进行查询。类的定义如下:
public class OrdersCustom extends Orders{
//orders的扩展类,里面只能放关于orders的东西注意和包装类的差别
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}

}
  • mapper.xml文件配置:
<select id="oneToOne"  resultType="orderscustom">
SELECT
orders.*,
user.username,
user.address
FROM
orders,
user
WHERE orders.user_id = user.id
</select>
  • 接口配置:
public List<OrdersCustom> oneToOne();

总结:以上就是一对一查询映射使用pojo类的情况,在查询的时候,选择一个类作为主类然后继承它,并且把多余的属性添加到这个继承类中,然后添加get&set方法,后续的步骤就和普通的查询配置是一样的了。

法二:resultMap

  • 定义专门的resultMap来进行一对一查询的结果映射
  • 首先还是定义pojo类,不过是在orders类中添加user属性,应为是一对一的查询关系,这里直接使用单个user属性进行接收即可。
//用户信息
private User user;

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
  • 配置xml文件中的resultMap:
<!-- 定义一对一查询的resultMap -->
<resultMap type="orders" id="oneToOneResultMap">
<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"/>
<!-- 联系配置 -->
<association property="user" javaType="user">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>

<select id="oneToOneMap"  resultMap="oneToOneResultMap">
SELECT
orders.*,
user.username,
user.address
FROM
orders,
user
WHERE orders.user_id = user.id
</select>
  • 接口配置:
public List<Orders> oneToOneMap();
  • 一对一查询小结:

resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果没有特殊要求建议使用resultType。

resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。

resultMap可以实现延迟加载,resultType无法实现延迟加载。

一对多查询

  • sql语句为:
SELECT
orders.*,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
orderdetail
WHERE orderdetail.orders_id=orders.id
  • 在orders中添加orderdetail属性,不多这里是一对多,所以需要使用到list集合,并且添加它的get&set方法:
//订单明细
private List<Orderdetail> orderdetails;

public List<Orderdetail> getOrderdetails() {
return orderdetails;
}

public void setOrderdetails(List<Orderdetail> orderdetails) {
this.orderdetails = orderdetails;
}
  • 然后定义reslutMap进行映射配置:
		<!-- 定义一对多查询的resultMap配置 -->
<resultMap type="orders" id="oneToManyResultMap">
<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"/>
<!-- 定义一对多查询的联系 -->
<collection property="orderdetails" ofType="orderdetail">
<id column="orderdetail_id" property="id"/>
<result column="orders_id" property="ordersId"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
</collection>
</resultMap>

<select id="oneToManyMap" resultMap="oneToManyResultMap">
SELECT
orders.*,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
orderdetail
WHERE orderdetail.orders_id=orders.id</select>
  • 接口配置:
public List<Orders> oneToManyMap();

多对多查询

  • sql语句
SELECT
orders.*,
USER.username,
USER.sex,
USER.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
USER,
orderdetail
WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
  • 然后定义reslutMap进行映射配置:
	<resultMap type="user" id="manyToManyResultMap">
<!-- 用户信息 -->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>

<!-- 订单信息
一个用户对应多个订单,使用collection映射
-->
<collection property="orders" ofType="orders">
<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"/>

<!-- 订单明细
一个订单包括 多个明细
-->
<collection property="orderdetails" ofType="orderdetail">
<id column="orderdetail_id" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<result column="orders_id" property="ordersId"/>

<!-- 商品信息
一个订单明细对应一个商品
-->
<association property="items" javaType="items">
<id column="items_id" property="id"/>
<result column="items_name" property="name"/>
<result column="items_detail" property="detail"/>
<result column="items_price" property="price"/>
</association>

</collection>

</collection>

</resultMap>

<select id="manyToManyMap" resultMap="manyToManyResultMap">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
USER,
orderdetail
WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id</select>
  • 接口配置:
public List<User> manyToManyMap();

总结

其实看多对多发现,也是一对多,我感觉mybatis中的映射全部都是单向映射,所以根本不存在多对多的情况,只有一对一和一对多。不知道对不对,这是我自己的总结,所以只需了解一对一和一对多的之间的映射配置即可。。

代码下载:https://github.com/qianxi0410/Mybatis

  • 点赞
  • 收藏
  • 分享
  • 文章举报
千禧0410 发布了11 篇原创文章 · 获赞 0 · 访问量 161 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: