mybatis <association> 标签的使用

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: mybatis <association> 标签的使用

MyBatis是一个流行的Java ORM框架,用于将Java对象映射到关系数据库中。MyBatis提供了许多标签来简化ORM映射,其中之一是标签。允许您通过SQL语句映射Java对象。在使用MyBatis时,标签用于处理关联关系,可以将多个表中的数据映射到单个Java对象中。本文将详细介绍标签的使用方法和用途。

在 MyBatis 中, 是一个非常重要的标签,它用于描述两个实体类之间的一对一关系。通俗地说,如果一个实体类中包含了另外一个实体类的对象,那么就可以使用 标签来建立这种一对一的关系。

一、标签的基本使用方法

标签用于处理两个对象之间的关联关系,它的基本语法如下:

<association property="属性名" javaType="对象类型" resultMap="结果映射">
    <id property="属性名" column="列名"/>
    <result property="属性名" column="列名"/>
    ……
</association>

其中,标签的属性说明如下:
property:表示当前对象的属性名。
javaType:表示当前对象的Java类型。
resultMap:表示当前对象的结果映射。
在标签中,我们可以使用和标签来定义当前对象的属性。其中,标签用于定义当前对象的主键属性,标签用于定义当前对象的非主键属性。这两个标签的属性说明如下:
property:表示当前对象的属性名。
column:表示当前对象属性对应的列名。
下面,我们来看一个具体的例子:

<resultMap id="userMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="user_name"/>
    <result property="password" column="user_password"/>
    <association property="role" javaType="Role" resultMap="roleMap">
        <id property="id" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleDesc" column="role_desc"/>
    </association>
</resultMap>

在上面的例子中,我们定义了一个名为userMap的结果映射,它对应的Java类型是User类。在该结果映射中,我们使用了标签来定义User对象和Role对象之间的关联关系。其中,User对象中的属性role对应的是Role对象,它的Java类型是Role类,结果映射是roleMap。

二、标签的高级使用方法
除了上面介绍的基本使用方法外,标签还有一些高级用法,下面我们来逐一讲解。

使用select属性
在标签中,我们可以使用select属性来指定一个SQL语句,用于查询关联对象的信息。这个SQL语句可以使用动态SQL来构建,以便根据需要动态生成查询条件。下面是一个例子:

<resultMap id="userMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="user_name"/>
    <result property="password" column="user_password"/>
    <association property="role" javaType="Role" select="selectRoleById">
        <id property="id" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleDesc" column="role_desc"/>
    </association>
</resultMap>
<select id="selectRoleById" resultType="Role">
    select * from role where id = #{
   id}
</select>

在上面的例子中,我们使用了select属性来指定了一个SQL语句selectRoleById,用于查询Role对象的信息。该SQL语句中使用了#{id}占位符,它的值将由Java代码动态生成。

使用fetchType属性
在标签中,我们可以使用fetchType属性来控制关联对象的加载方式。fetchType属性有两个取值,lazy和eager。其中,lazy表示延迟加载,即只有在需要使用关联对象时才会进行加载;eager表示立即加载,即在查询主对象时就会同时加载关联对象。下面是一个例子:

<resultMap id="userMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="user_name"/>
    <result property="password" column="user_password"/>
    <association property="role" javaType="Role" resultMap="roleMap" fetchType="lazy">
        <id property="id" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleDesc" column="role_desc"/>
    </association>
</resultMap>

在上面的例子中,我们使用了fetchType属性来指定了关联对象的加载方式为lazy,即延迟加载。

使用notNullColumn属性
在标签中,我们可以使用notNullColumn属性来指定关联对象的非空列。这个属性的作用是在查询关联对象时,只查询指定的非空列,可以提高查询效率。下面是一个例子:

<resultMap id="userMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="user_name"/>
    <result property="password" column="user_password"/>
    <association property="role" javaType="Role" resultMap="roleMap" notNullColumn="role_name, role_desc">
        <id property="id" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleDesc" column="role_desc"/>
    </association>
</resultMap>

在上面的例子中,我们使用了notNullColumn属性来指定了关联对象Role的非空列为role_name和role_desc。

使用autoMapping属性
在标签中,我们可以使用autoMapping属性来控制是否自动映射关联对象的属性。autoMapping属性有两个取值,true和false。其中,true表示自动映射,即关联对象的属性会自动映射到主对象中;false表示不自动映射,即需要手动指定关联对象的属性。下面是一个例子:

<resultMap id="userMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="user_name"/>
    <result property="password" column="user_password"/>
    <association property="role" javaType="Role" resultMap="roleMap" autoMapping="false">
        <id property="id" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleDesc" column="role_desc"/>
    </association>
</resultMap>

在上面的例子中,我们使用了autoMapping属性来指定了关联对象的自动映射方式为false,即需要手动指定关联对象的属性。

总结

标签是MyBatis中非常重要的一个标签,它用于处理对象之间的关联关系。在使用标签时,我们需要注意一些高级用法,如使用select属性、fetchType属性、notNullColumn属性和autoMapping属性等。只有熟练掌握了这些高级用法,才能更好地使用MyBatis框架,提高开发效率和代码质量。

公众号请关注"果酱桑", 一起学习,一起进步!

目录
相关文章
|
28天前
|
SQL XML Java
Mybatis中选择语句的使用:<choose>标签、分区排序 Row_num() over ()函数的使用呢
Mybatis中选择语句的使用:<choose>标签、分区排序 Row_num() over ()函数的使用呢
15 0
|
4月前
|
SQL Java 数据库连接
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
90 0
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
|
1月前
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
18 0
|
1月前
|
SQL Java 关系型数据库
MyBatis中的9种常用动态sql标签精妙用法
MyBatis中的9种常用动态sql标签精妙用法
65 0
|
5月前
|
Java 数据库连接 mybatis
MyBatis中对象映射关联之association使用实践
MyBatis中对象映射关联之association使用实践
202 1
|
3月前
|
SQL XML Java
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
49 0
|
3月前
|
Java 数据库连接 mybatis
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
|
3月前
|
SQL Java 数据库连接
一文彻底搞懂Mybatis系列(九)之Mybatis动态SQL标签总结
一文彻底搞懂Mybatis系列(九)之Mybatis动态SQL标签总结
110 0
|
4月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
36 0
|
4月前
|
SQL XML Java
掌握MyBatis动态SQL:从标签到实战的全面解析
掌握MyBatis动态SQL:从标签到实战的全面解析
274 0