Mybatis 标签大全及标签中各属性详解

Mybatis 是一款优秀的 ORM 框架,广泛应用于 Java 开发中。在 Mybatis 中,标签是非常重要的组成部分,它们用于描述 SQL 语句、参数映射、结果映射等。本文将介绍 Mybatis 中常用的标签及其各属性详解,帮助开发人员更好地理解和使用 Mybatis。

一、SqlMapConfig 标签

SqlMapConfig 标签是 Mybatis 配置文件中的根标签,它用于配置 Mybatis 的全局属性,包括数据库连接信息、类型别名、事务管理器等。该标签有以下属性:

1. properties:用于指定外部属性文件的位置,可以用来配置数据库连接信息等敏感信息。

2. settings:用于配置 Mybatis 的全局属性,包括缓存、语句执行器等。

3. typeAliases:用于配置类型别名,方便在 SQL 映射文件中使用简单的类名代替完整的类名。

4. typeHandlers:用于配置类型处理器,用于将数据库中的数据类型转换成 Java 对象或将 Java 对象转换成数据库中的数据类型。

5. objectFactory:用于指定对象工厂,用于创建结果对象。

6. plugins:用于配置插件,可以在 SQL 执行过程中拦截并修改 SQL 语句或结果集。

7. environments:用于配置环境,包括数据源和事务管理器。

8. mappers:用于指定 SQL 映射文件的位置或 Mapper 接口的位置。

二、Mapper 标签

Mapper 标签是 Mybatis 中最重要的标签之一,它用于描述 SQL 映射关系。Mapper 标签有以下属性:

1. namespace:指定 Mapper 接口的完整路径名。

2. resultMap:指定结果映射关系,将查询结果映射成 Java 对象。

3. parameterMap:指定参数映射关系,将 Java 对象映射成 SQL 参数。

4. sql:定义可重用的 SQL 片段。

5. insert、update、delete、select:定义对应的 SQL 语句及参数映射关系。

三、ResultMap 标签

ResultMap 标签用于描述查询结果集与 Java 对象之间的映射关系。ResultMap 标签有以下属性:

1. id:指定 ResultMap 的唯一标识符。

2. type:指定映射的 Java 对象类型。

3. extends:指定继承的 ResultMap。

4. discriminator:用于多表关联查询时进行分组判断。

5. constructor、id、result、association、collection:用于定义映射关系。

<resultMap id="userMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
</resultMap>

<select id="selectUserById" resultMap="userMap">
    select * from user where id = #{id}
</select>

四、ParameterMap 标签

ParameterMap 标签用于描述 Java 对象与 SQL 参数之间的映射关系。ParameterMap 标签有以下属性:

1. id:指定 ParameterMap 的唯一标识符。

2. type:指定映射的 Java 对象类型。

3. parameter、result、parameterMap、resultMap:用于定义映射关系。

五、Sql 标签

Sql 标签用于定义可重用的 SQL 片段,可以在 SQL 映射文件中多次引用。Sql 标签有以下属性:

1. id:指定 Sql 片段的唯一标识符。

2. databaseId:指定 Sql 片段适用的数据库类型。

3. lang:指定 Sql 片段使用的脚本语言。

4. statementType、parameterType、resultType:用于定义 Sql 片段的类型信息。

<sql id="userColumns">
    id, name, age
</sql>

<select id="getUserById" resultType="com.example.User" parameterType="int">
    SELECT <include refid="userColumns"/> FROM user WHERE id = #{id}
</select>

六、Insert、Update、Delete、Select 标签

Insert、Update、Delete、Select 标签分别对应 SQL 语句中的插入、更新、删除和查询操作。这些标签都有以下属性:

1. id:指定 SQL 语句的唯一标识符。

2. parameterType:指定输入参数类型。

3. resultMap:指定结果映射关系。

4. flushCache、useCache:控制缓存行为。

5. timeout:指定 SQL 执行超时时间。

6. statementType:指定 SQL 类型。

7. keyProperty、keyColumn:仅对插入操作有效,用于获取自动生成的主键值。

SQL标签

SQL标签是MyBatis中最常用的标签之一,它用于定义SQL语句,包括增删改查等操作。SQL标签有以下几种:

1.1 select

select标签用于定义查询语句,可以包含where、order by、group by等子句。例如:

<select id="selectUserById" resultType="User">
    select * from user where id = #{id}
</select>
1.2 insert

insert标签用于定义插入语句,可以插入单条或多条数据。例如:

<insert id="insertUser" parameterType="User">
    insert into user (name, age) values (#{name}, #{age})
</insert>
1.3 update

update标签用于定义更新语句,可以更新单条或多条数据。例如:

<update id="updateUser" parameterType="User">
    update user set name = #{name}, age = #{age} where id = #{id}
</update>
1.4 delete

delete标签用于定义删除语句,可以删除单条或多条数据。例如:

<delete id="deleteUserById" parameterType="int">
    delete from user where id = #{id}
</delete>
1.5 selectKey

selectKey标签用于在插入数据时获取自动生成的主键值。该标签有多种属性,包括resultType、keyProperty等。以下是一个selectKey标签的示例:

<insert id="addUser" parameterType="com.example.User">
    <selectKey resultType="int" keyProperty="id" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>

动态SQL标签

动态SQL标签用于根据不同的条件生成不同的SQL语句,可以大大提高代码的复用性和可读性。MyBatis支持以下几种动态SQL标签:

2.1 if

if标签用于根据条件生成不同的SQL语句。例如:

<select id="selectUserByNameAndAge" resultType="User">
    select * from user
    <where>
        <if test="name != null and name != ''">
            and name like concat('%', #{name}, '%')
        </if>
        <if test="age != null">
            and age = #{age}
        </if>
    </where>
</select>
2.2 choose、when、otherwise

choose、when、otherwise标签用于根据不同的条件生成不同的SQL语句。例如:

<select id="selectUserByCondition" resultType="User">
    select * from user
    <where>
        <choose>
            <when test="name != null and name != ''">
                and name like concat('%', #{name}, '%')
            </when>
            <when test="age != null">
                and age = #{age}
            </when>
            <otherwise>
                and 1=1
            </otherwise>
        </choose>
    </where>
</select>
2.3 foreach

foreach标签用于循环生成SQL语句。例如:

<delete id="deleteUsersByIds" parameterType="List">
    delete from user where id in
    <foreach collection="list" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>

foreach标签可以用于各种情况,例如:

1. 在WHERE子句中使用IN运算符

假设我们有一个名为ids的整数列表,我们想要使用IN运算符将其用于WHERE子句。我们可以使用foreach标签来生成逗号分隔的整数列表,并将其插入到查询中:

SELECT * FROM users WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
    #{id}
</foreach>

这将生成以下查询:

SELECT * FROM users WHERE id IN (1, 2, 3, 4)

2. 在INSERT语句中使用VALUES子句

假设我们有一个名为users的用户列表,我们想要将它们插入数据库中。我们可以使用foreach标签来生成多个VALUES子句,并将它们插入到INSERT语句中:

INSERT INTO users (name, age) VALUES
<foreach collection="users" item="user" separator=",">
    (#{user.name}, #{user.age})
</foreach>

这将生成以下查询:

INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30),
('Charlie', 35)

3. 在UPDATE语句中使用SET子句

假设我们有一个名为users的用户列表,我们想要更新他们的年龄。我们可以使用foreach标签来生成多个SET子句,并将它们插入到UPDATE语句中:

UPDATE users SET
<foreach collection="users" item="user" separator=",">
    age = #{user.age}
</foreach>
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
    #{id}
</foreach>

这将生成以下查询:

UPDATE users SET
age = 25,
age = 30,
age = 35
WHERE id IN (1, 2, 3)

最佳实践

虽然foreach标签非常有用,但它也可能导致一些性能问题。以下是一些最佳实践,可以帮助您最大限度地利用foreach标签而不会影响性能:

1. 尽量减少循环次数

如果可能,尽量减少循环次数。例如,在INSERT语句中使用批量插入可以大大减少循环次数。

2. 使用缓存

MyBatis有一个缓存机制,可以在多次查询之间缓存查询结果。如果您使用相同的集合进行多次查询,请考虑启用缓存以提高性能。

3. 使用LIMIT和OFFSET

如果您只需要处理集合中的一部分元素,请考虑使用LIMIT和OFFSET来限制查询结果。

其他标签

除了SQL标签和动态SQL标签,MyBatis还支持以下几种标签:

3.1 include

include标签用于引入其他XML文件中定义的SQL片段。例如:

<sql id="userColumns">
    id, name, age
</sql>

<select id="selectUsers" resultType="User">
    select <include refid="userColumns"/> from user
</select>
3.2 where、set、trim等标签

这些标签都是用于拼接SQL语句的辅助标签,可以大大提高代码的可读性和可维护性。

where标签用于动态生成WHERE子句,可以根据条件判断是否生成WHERE子句。以下是一个where标签的示例:

<select id="selectUsers" resultType="User">
  SELECT * FROM users
  <where>
    <if test="id != null">
      AND id = #{id}
    </if>
    <if test="name != null">
      AND name = #{name}
    </if>
  </where>
</select>

set标签用于动态生成SET子句,可以根据条件判断是否生成SET子句。以下是一个set标签的示例:

<update id="updateUser" parameterType="com.example.User">
    UPDATE user
    <set>
        <if test="name != null">
            name = #{name},
        </if>
        <if test="age != null">
            age = #{age},
        </if>
    </set>
    WHERE id = #{id}
</update>

七、Result 标签

Result 标签用于描述查询结果集中的一列与 Java 对象之间的映射关系。Result 标签有以下属性:

1. property:指定映射到 Java 对象中的属性名。

2. column:指定查询结果集中的列名。

3. jdbcType:指定查询结果集中列的数据类型。

4. typeHandler:指定类型处理器,将查询结果集中列的数据类型转换成 Java 对象或将 Java 对象转换成查询结果集中列的数据类型。

5. select、insert、update、delete:仅对存储过程有效,用于指定输出参数类型和输出参数名称。

八、Association 和 Collection 标签

Association 和 Collection 标签分别表示一对一和一对多的关联关系。这些标签都有以下属性:

1. property:指定映射到 Java 对象中的属性名。

2. resultMap:指定结果映射关系。

3. select:仅对延迟加载有效,用于加载关联对象。

以上是 Mybatis 中常用标签及其各属性详解。通过深入理解这些标签及其各属性,开发人员可以更加灵活地使用 Mybatis 进行 SQL 映射。

猜你喜欢

转载自blog.csdn.net/zhengren964/article/details/131660648