宽为限 紧用功 工夫到 滞塞通
今天看了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.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入门基础(六)—-高级映射(一对一,一对多,多对多)