您的位置:首页 > 其它

Mybatis 关联查询(多对一,一对多)

2017-09-15 23:11 495 查看
1.多对一查询
(1)单表查询(查询所有的订单):
    ① 在OrderMapper.xml文件中:
<!--
单表查询时使用resultType ,应该引起注意。如果还要查询关联表的属性,就需要使用resultMap :
1. resultMap: 结果映射. 把查询的结果映射为对应的 bean 的属性.
2. 一般滴, 若只查询单表, 则不需要使用 resultMap.
3. resultMap 和 resultType 只能选用其一.
-->
< select id= "getAll" resultType ="com.atguigu.mybits.beans.Order" >
SELECT order_Id,order_Name FROM orders
</ select>

     ② 在OrderMapper.java中:
//查询所有的order订单
public List< Order> getAll();

(2)单表查询(查询所有的订单,实现懒加载效果)
    ① 在OrderMapper.xml文件中:
<!--
如何分两条 SQL 语句来初始化关联的对象呢 ?
即也有 hibernate 的懒加载的效果.
-->
<select id="testResultMap" resultMap="orderMap" >
SELECT order_Id, order_Name
FROM orders
WHERE order_Id = #{orderId}
</select >
<resultMap type="com.atguigu.mybits.beans.Order" id="orderMap" >
<!-- 映射Id -->
<id column="order_Id" property= "orderId"/>
<!-- 映射Id以外的属性 -->
<result column="order_Name" property= "orderName"/>
</resultMap >

     ② 在OrderMapper.java中:
//用两条SQL语句去数据库查询对象的属性
Order testResultMap( @Param( "orderId") Integer orderId);

(3) 关联表查询(查询order时关联到Customer一端的属性)
    ① 在OrderMapper.xml文件中:
<!--
如何在查询出 bean 对象时, 也能查询出其关联的 1 的一端的对象.
1. 可以通过 "别名" 的方式为关联的 bean 的属性赋值.
customer_id AS "customer.
4000
id" 意为: 把查询的 customer_id 赋给当前 bean 的 customer 的 id 属性.
2. 可以使用外连接查询得到关联对象的属性.
3. jdbcTemplate 和 dbutils 不支持!
-->
<select id= "testAssociation" resultType="com.atguigu.mybits.beans.Order" >
SELECT o.order_Id,order_Name,o.customer_Id AS "customer.customerId",customer_Name AS "customer.customer_Name"
FROM orders o
LEFT OUTER JOIN customers c
ON c.customer_id = o.customer_id
WHERE o.order_Id=#{orderId}
</select>

    ② 在OrderMapper.java中:
//去数据库查询自己的属性和对端的属性
Order testAssociation( @Param( "orderId") Integer orderId);

(4) 关联表查询(查询order时关联到Customer一端的属性,实现懒加载效果)
    ① 在OrderMapper.xml文件中:
<!--
通过懒加载异常加载自己以及对端
-->
<select id="testAssociation2" resultMap="orderMap2" >
SELECT order_Id,order_Name,customer_id
FROM orders
WHERE order_Id=#{orderId}
</select >

<resultMap type="com.atguigu.mybits.beans.Order" id="orderMap2" >
<id column= "order_Id" property ="orderId"/>
<result column= "order_Name" property="orderName" />
<!--
property: 关联属性的属性名
select: 使用的 select 查询的 id
javaType: 返回的类型
column: 若额外的 select 需要传递参数, 则使用 column 标记把当前查询到的那一列的列值传递过去.
-->
<association property= "customer"
select= "selectCustomer"
column= "customer_Id"
javaType= "com.atguigu.mybits.beans.Customer" >
</association>
</resultMap >

<select id="selectCustomer" resultType="com.atguigu.mybits.beans.Customer" >
SELECT customer_Id, customer_Name
FROM customers
WHERE customer_Id = #{customerId}
</select >

    ② 在mybatis-config.xml中:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd";>;
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
</configuration>

    ③ 在OrderMapper.java中:
//使用懒加载的方式来查询自己和对端的属性,其实和关联映射查询出来的效果是一样的,
//但是这样是在用户用到哪些数据加载哪些数据,可以节省内存。
Order testAssociation2(@Param("orderId") Integer orderId);

(5) 当查询到自己和对端的时候列名相同,需要使用别名:
    ① 在OrderMapper.xml文件中:
<!--
注意: 只要有列名相同的, 一定要为列名起别名!
使用外连接查询时, 除了使用别名映射关联 bean 外, 也可以使用 association 完成手动的映射
映射集合属性, 不能使用别名, 必须使用 resultMap!
-->
<select id="testAssociation3" resultMap="orderMap3" >
SELECT o.order_Id, order_Name, c.customer_Id AS "c.customerId", customer_Name
FROM orders o
LEFT OUTER JOIN customers c
ON o.customer_Id = c.customer_Id
WHERE o.order_Id= #{orderId}
</select >
<resultMap type="com.atguigu.mybits.beans.Order" id="orderMap3" >
<id column= "order_Id" property ="orderId"/>
<result column= "order_Name" property="orderName" />
<association property= "customer" javaType="com.atguigu.mybits.beans.Customer" >
<id column= "c.customerId" property="customerId" />
<result column= "customer_Name" property="customerName" />
</association>
</resultMap >

    ② 在OrderMapper.java中:
//在order中使用迫切左外连接的方式并且以别名的方式完成对于级联属性的查询
Order testAssociation3( @Param( "orderId") Integer orderId);

2.一对多查询
(1) 在customer中使用迫切左外连接的方式并且以别名的方式完成对于级联属性的查询
    ① 在orderMapper.xml中:
<select id= "selectCustomer2" resultMap ="customerMap2">
SELECT c.customer_Id, customer_Name, o.order_Id AS "o.orderId",order_Name
FROM customers c
LEFT OUTER JOIN orders o
ON o.customer_Id = c.customer_Id
WHERE o.customer_Id= #{customerId}
</select >
<resultMap type="com.atguigu.mybits.beans.Customer" id="customerMap2" >
<id column= "customer_Id" property ="customerId"/>
<result column= "customer_Name" property="customerName" />
<!-- 映射集合属性 -->
<collection property= "orders" javaType="com.atguigu.mybits.beans.Order" >
<id column= "o.orderId" property ="orderId"/>
<result column= "order_Name" property="orderName" />
</collection>
</resultMap >

    ② 在OrderMapper.java中:
Customer selectCustomer2( @Param( "customerId") Integer customerId);

(2) 使用customer中完成自己以及关联表的属性
    ① 在orderMapper.xml中:
<!--
映射集合属性, 也可以分两条语句.
使用 collection 映射集合属性!
1. 使用 select 标记使用的另一条 SQL 的 id
2. 若使用了 select 属性, 则不能再使用 javaType 来标记集合中元素的类型, 而要使用 ofType.
3. 使用 column 传递 select 对应 SQL 中的参数. 通常为当前 SQL 的主键列的列名.
4. 若需要对关联的集合对象使用懒加载, 则需要设置 collection 的 fetchType 属性为 lazy. 默认为 eager.
-->
<select id="selectCustomer3" resultMap="customerMap3" >
SELECT c.customer_Id,customer_Name
FROM customers c
WHERE c.customer_Id = #{customerId}
</select >
<resultMap type="com.atguigu.mybits.beans.Customer" id="customerMap3" >
<id column= "customer_Id" property ="customerId"/>
<result column= "customer_Name" property="customerName" />
<collection property= "orders" ofType="com.atguigu.mybits.beans.Order"
select= "selectOrder" column ="order_Id" fetchType ="lazy">
</collection>
</resultMap >
<select id="selectOrder" resultType="com.atguigu.mybits.beans.Order" >
SELECT order_Id, order_Name
FROM orders
WHERE order_Id = #{orderId}
</select >

    ② 在OrderMapper.java中:
Customer selectCustomer3( @Param( "customerId") Integer customerId);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: