您的位置:首页 > 其它

mybatis级联,一对多(1)

2017-08-09 05:45 274 查看
宽为限 紧用功 工夫到 滞塞通

今天看了mybatis级联的第二种骚操作,顿时感觉之前被坑了,就先看一下它的一对一是怎么搞的吧

<!-- ############ 一对一 ############## -->
<resultMap type="test.mybatis.one2many.po.Orders" id="OrdersUserResultMap">
<!-- 配置映射的订单信息 -->
<!-- id:查询列中的唯一标识,订单信息中的唯一标识,如果多列组成唯一标识(如:一般数据库设计中的字典表 使用联合主键),就需要配置多个id
column:订单信息的唯一标识 列 property:订单信息的唯一标识列所映射到orders中的那个属性(假如:数据库中orders表中的主键为orders_id,而实体属性名称为ordersId,
则这个配置应为<id column="orders_id" property="ordersId"/>,类似hibernate实体映射文件配置)。 -->
<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:要将关联查询的用户信息映射到Orders中那个属性 -->
<association property="user" javaType="test.mybatis.one2many.po.User">
<!-- id:关联查询用户的唯一标识 column:指定唯一标识用户信息的列 property:映射到user的那个属性 -->
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
<result column="address" property="address" />
</association>
</resultMap>

<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
SELECT t1.*,
t2.username,
t2.sex,
t2.address
FROM
orders t1,
t_user t2
WHERE
t1.user_id=t2
d060
.id
</select>


再回看一下之前的那种 mybatis级联,一对一

是不是觉得这种配置非常简单粗暴


OrdersCustomMapper.java 接口文件

/**
* 查询订单关联查询用户信息,使用reslutMap
* @return
*/
public List<Orders> findOrdersUserResultMap();


测试文件是这样滴

sqlSession = SqlSessionFactoryUtil.openSqlSession();
// 创建代理对象
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
List<Orders> list2 = oc.findOrdersUserResultMap();
System.out.println(list2.get(0).getUser().getUsername());


当然你也可以改一下SQL改为指定id查询,这就不是一个集合了,不知道的乍一看可能还会以为是一对多啥的…


OK,接下来我们看看这次的主题 一对多,这里就直接上这种骚操作了


先看OrdersCustomMapper.java 接口文件

/**
* 查询订单(关联用户)以及订单明细(一对多)
* @return
*/
public List<OrderDetail> findOrdersAndOrderDetailResultMap();


嗯,定义一个查询方法。

接下来再看XML配置

<!-- ################ 一对多 ###################### -->
<select id="findOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap">
SELECT
t1.*,
t2.username,
t2.sex,
t2.address,
t3.id orderdetail_id,
t3.items_id,
t3.items_num,
t3.orders_id
FROM
orders t1,
t_user t2,
orderdetail t3
WHERE
t1.user_id = t2.id AND t3.orders_id=t1.id
</select>

<resultMap type="test.mybatis.one2many.po.Orders" id="ordersAndOrderDetailResultMap"
extends="OrdersUserResultMap">
<!-- 订单信息 -->
<!-- 关联用户信息 -->
<!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->

<!-- 关联订单明细信息 一个订单关联查询出了多条订单明细,要使用collection映射 collection:对关联查询到的多条记录映射到集合中
property:将关联查询到的多条记录映射到orders类的那个属性 ofType:指定映射的集合属性中pojo的类型 -->
<collection property="orderdetails" ofType="test.mybatis.one2many.po.OrderDetail">
<!-- id:唯一标识 property:要将订单明细的唯一标识映射到test.mybatis.one2many.po.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" />
</collection>
</resultMap>


注意:

看这个,orderdetail_id 它是在
<select id="findOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap">
这里定义的 t3.id orderdetail_id这是个别名,所以数据库里别翻了。


还是简单介绍一下 一对多 在xml里是怎么配置的吧! 来,这里是这一句
<collection property="orderdetails" ofType="test.mybatis.one2many.po.OrderDetail">
没错,就这个collection属性,一对一的是这个属性 association 使用时别混淆了。其实也很好记,Java 中Collection这个不就是集合框架的父类。

这种级联的方式主要是通过SQL直接查询的,这里并不是通过对象直接点出来的那种。之前一对一的那种方式本人愚笨,一对多的暂时还没搞清楚。不过我还是会回来的


那再看看测试类吧

sqlSession = SqlSessionFactoryUtil.openSqlSession();
// 创建代理对象
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
List<OrderDetail> list3 = oc.findOrdersAndOrderDetailResultMap();
System.out.println(list3);


运行效果:



站在巨人的肩膀上

本篇博客参考的文章 mybatis入门基础(六)—-高级映射(一对一,一对多,多对多)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: