MyBatis之association和collection标签

resultMap

resultMap的顺序

  1. constructor : 用于在实例化类时,注入结果到构造方法中
  2. idArg : ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
  3. arg : 将被注入到构造方法的一个普通结果
  4. id : 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  5. result : 注入到字段或 JavaBean 属性的普通结果
  6. association : 一个复杂类型的关联;许多结果将包装成这种类型嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
  7. collection : 一个复杂类型的集合嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
  8. discriminator : 使用结果值来决定使用哪个 resultMap
  9. case : 基于某些值的结果映射嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射

顺序不对时会报错:

The content of element type “resultMap” must match “(constructor?,id*,result*,association*,collection*,discriminator?)”

一般情况下一对一使用<association>标签,一对多使用<collection>标签

association标签

属性

描述

property

属性名:映射实体类属性名

column

映射数据库字段名

javaType

属性类型:映射java类型

jdbcType

映射数据库类型

select

用于加载复杂类型属性的映射语句的ID(它会从column 属性指定的列中检索数据,作为参数传递给目标 select 语句。)

resultMap

不使用嵌套模式,而是将此关联的嵌套结果集映射到一个外部的标签中,然后通过 id 进行引入。

typeHandler

数据库与Java类型匹配处理器,使用这个属性可以覆写类型处理器。

notNullColumn

不为空的列,如果指定了列,只有指定字段不为空时,Mybatis才会创建对象。

columnPrefix

给关联的数据库中的 column 添加一个前缀(如果不添加前缀,当 两个表同时有 id 字段,查询结果时一定会产生覆盖,使得两个 id 的值一样)

resultSet

用于加载复杂类型的结果集名字。

foreignColumn

指定外键对应的列名,指定的列将与父类型中 column 的给出的列进行匹配。

autoMapping

自动封装,如果数据库字段和javaBean的字段名一样,可以使用这种方式;(但是不建议采取,如果非要使用此功能,那就在全局配置中加上mapUnderscoreToCamelCase=TRUE,它会使经典数据库字段命名规则翻译成javaBean的经典命名规则,如:a_column翻译成aColumn。)

fetchType

延迟加载,lazy打开延迟加载,eager积极加载。指定属性后,将在映射中忽略全局配置参数lazyLoadingEnabled,使用属性的值。

实体类


/**
*书籍
*/
@Data
public class Book {
    private String id;
    private String name;
    private String author;
    private Double price;
    //出版社
    private Publisher pub;//一本书对应一个出版社
}

/**
*出版社
*/
@Data
public class Publisher {
    private String id;
    private String name;
    private String phone;
    private String address;
}

XML

关联查询

<!--配置关联实体类-->
<resultMap id="bookResultMap" type="com.entity.Book">
    <!--主键属性-->
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <!--普通属性-->
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <result property="author" column="author" jdbcType="VARCHAR"></result>
    <result property="price" column="price" jdbcType="VARCHAR"></result>
    <!--一对一映射-->
    <association property="pub" javaType="com.entity.Publisher">
        <id property="id" column="id" jdbcType="VARCHAR"></id>
        <result property="name" column="name" jdbcType="VARCHAR"></result>
        <result property="phone" column="phone" jdbcType="VARCHAR"></result>
        <result property="address" column="address" jdbcType="VARCHAR"></result>
    </association>
</resultMap>
<!--关联查询-->
<select id="selectAllBook" resultMap="bookResultMap">
    SELECT * FROM book e
    left JOIN publisher d ON e.publisher_id = d.id
</select>

嵌套查询

<resultMap id="bookResultMap" type="com.entity.Book">
    <!--主键属性-->
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <!--普通属性-->
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <result property="author" column="author" jdbcType="VARCHAR"></result>
    <result property="price" column="price" jdbcType="VARCHAR"></result>
    <association column="{publisherId=publisher_id}" property="pub" 
        javaType="com.entity.Publisher" select="selectPublisher"></association>
</resultMap>

<!--书籍查询-->
<select id="selectAllBook" resultMap="bookResultMap">
    select * from book
</select>

<!--出版社映射Map-->
<resultMap id="publisherResultMap" type="com.entity.Publisher">
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <result property="phone" column="phone" jdbcType="VARCHAR"></result>
    <result property="address" column="address" jdbcType="VARCHAR"></result>
</resultMap>

<!--嵌套查询-->
<select id="selectPublisher" resultMap="publisherResultMap">
    SELECT * FROM publisher d
    WHERE d.id = #{publisherId}
</select>

collection标签

<collection>和<association>标签属性基本相同,就多了一个ofType属性。

属性

描述

ofType

映射集合的类型(指定一对多的集合里面元素的类型)

实体类


/**
*出版社
*/
@Data
public class Publisher {
    private String id;
    private String name;
    private String phone;
    private String address;
    // 书籍列表
    List<Book> bookList;//一个出版社对应多本书
}

/**
*书籍
*/
@Data
public class Book {
    private String id;
    private String name;
    private String author;
    private Double price;
}

XML

关联查询

<resultMap id="publisherResultMap" type="com.entity.Publisher">
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <result property="phone" column="phone" jdbcType="VARCHAR"></result>
    <result property="address" column="address" jdbcType="VARCHAR"></result>
    <collection property="bookList" ofType="com.entity.Book">
        <id property="id" column="id" jdbcType="VARCHAR"></id>
        <result property="name" column="name" jdbcType="VARCHAR"></result>
        <result property="author" column="author" jdbcType="VARCHAR"></result>
        <result property="price" column="price" jdbcType="VARCHAR"></result>
    </collection>
</resultMap>

<select id="selectAllPublisher" resultMap="publisherResultMap">
    SELECT * FROM publisher d
    left JOIN book e ON e.publisher_id = d.id
</select>

嵌套查询

<resultMap id="publisherResultMap" type="com.entity.Publisher">
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <result property="phone" column="phone" jdbcType="VARCHAR"></result>
    <result property="address" column="address" jdbcType="VARCHAR"></result>
    <collection column="{id=id}" property="bookList" 
        javaType="java.util.ArrayList" ofType="com.entity.Book"
       select="selectBookList"/>
</resultMap>

<select id="selectAllPublisher" resultMap="publisherResultMap">
    SELECT * FROM publisher d
</select>

<resultMap id="bookResultMap" type="com.worldly.config.entity.Employee">
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <result property="author" column="author" jdbcType="VARCHAR"></result>
    <result property="price" column="price" jdbcType="VARCHAR"></result>
</resultMap>

<select id="selectBookList" resultMap="bookResultMap">
    SELECT * FROM book e
    WHERE e.publisher_id = #{id}
</select>
多条件查询

修改collection标签的column属性,{参数名1=列名1,参数名2=列名2}


/**
*出版社
*/
@Data
public class Publisher {
    private String id;
    private String name;
    private String phone;
    private String address;
    // 新增---状态
    private String status;
    // 书籍列表
    List<Book> bookList;//一个出版社对应多本书
}

/**
*书籍
*/
@Data
public class Book {
    private String id;
    private String name;
    private String author;
    private Double price;
    // 新增---状态
    private String status;
}
<!--修改collection标签的column属性-->
<collection column="{publisherId=id,status=status}" property="bookList" 
        javaType="java.util.ArrayList" ofType="com.entity.Book"
       select="selectBookList"/>

<select id="selectEmpBydepId" resultMap="empResultMap">
    SELECT * FROM book e
    WHERE e.publisher_id = #{publisherId} AND e.status=#{status}
</select>

<resultMap>标签用于封装sql的查询结果,可以包装成自定义的对象,使用<result>子标签指定好查询结果的列和对象的属性之间的对应关系。
id标签一定要有,为了标识结果集的唯一性。如果没有id,则默认第一个result为唯一性标识。

jdbc Type与java Type对照表

JDBC Type

Java Type

CHAR

String

VARCHAR

String

LONGVARCHAR

String

NUMERIC

java.math.BigDecimal

DECIMAL

java.math.BigDecimal

BIT

boolean

BOOLEAN

boolean

TINYINT

byte

SMALLINT

short

INTEGER

INTEGER

BIGINT

long

REAL

float

FLOAT

double

DOUBLE

double

BINARY

byte[]

VARBINARY

byte[]

LONGVARBINARY

byte[]

DATE

java.sql.Date

TIME

java.sql.Time

TIMESTAMP

java.sql.Timestamp

CLOB

Clob

BLOB

Blob

ARRAY

Array

DISTINCT

mapping of underlying type

STRUCT

Struct

REF

Ref

DATALINK

java.net.URL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值