Skip to content
Menu
万别客的百宝袋
  • 首页
  • Linux命令|知识
  • 编程语言知识
    • Java
    • Mysql
万别客的百宝袋

Java MyBatis框架的一些知识

Posted on 2024年 9月 4日2024年 9月 4日

<resultMap> 标签

<resultMap> 标签通常在 MyBatis 的映射文件(XML 配置文件)中定义,其基本结构如下:

<resultMap id="resultMapId" type="fullyQualifiedClassName">
    <id property="idColumnName" column="idColumn" />
    <result property="propertyName" column="columnName" />
    <!-- 更多的 <result> 标签 -->
</resultMap>

注意点:type最好从包名下开始,如com.example.fullyQualifiedClassName

组成部分

  1. id: 用于定义唯一标识符的映射。在结果集中,应该只有一个 <id> 标签,因为它表示唯一键。
    • property: Java 对象的属性名。
    • column: 数据库表中的列名。
  2. result: 用于定义非唯一键的映射。
    • property: Java 对象的属性名。
    • column: 数据库表中的列名。

进阶特性

  1. 自动映射:
    • 如果查询结果中的列名与 Java 对象的属性名完全相同,可以使用 <resultMap> 的 autoMapping 属性自动映射这些字段。
  2. 关联查询:
    • 当查询涉及多表连接并且需要将结果映射到关联对象时,可以使用 <association> 标签。
    <resultMap id="userWithRoles" type="User"> <id property="id" column="id" /> <result property="username" column="username" /> <association property="roles" javaType="Role"> <result property="roleId" column="role_id" /> <result property="roleName" column="role_name" /> </association> </resultMap>
  3. 集合映射:
    • 当需要将结果集中的多行数据映射到一个集合属性时,可以使用 <collection> 标签。
    <resultMap id="userWithOrders" type="User"> <id property="id" column="id" /> <result property="username" column="username" /> <collection property="orders" ofType="Order"> <id property="id" column="order_id" /> <result property="orderDate" column="order_date" /> </collection> </resultMap>
  4. 复杂类型映射:
    • 对于复杂类型,如 Java 中的 Date,可以使用 <result> 标签的 typeHandler 属性指定类型处理器。
  5. Discriminator:
    • 用于基于某个字段的值来返回不同类型的结果。这在处理继承结构或多态时非常有用。
    <resultMap id="discriminatorExample" type="com.example.BaseClass"> <discriminator column="type" javaType="int" typeHandler="com.example.IntTypeHandler"> <case value="1" resultType="com.example.SubClass1"/> <case value="2" resultType="com.example.SubClass2"/> </discriminator> </resultMap>

使用示例

假设有一个 User 类和一个 Order 类,你想要执行一个查询,该查询返回用户及其所有订单的信息:

<resultMap id="userWithOrdersResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="username" />
<collection property="orders" ofType="Order">
<id property="id" column="order_id" />
<result property="orderDate" column="order_date" />
</collection>
</resultMap>

在这个例子中,<resultMap> 定义了如何将查询结果映射到 User 对象及其 orders 集合属性。

<trim> 标签

<trim> 标签是一个非常有用的动态 SQL 元素,它允许你构建一个 SQL 语句的片段,其中可以包含多个子元素,这些子元素可以是 <where>、<set>、<foreach> 等。<trim> 标签会自动地根据子元素的存在与否来添加或省略 SQL 语句中的某些部分,如逗号、空格和关键字。

基本用法

<trim> 标签通常用于构建动态 SQL,它有以下几个常用的属性:

  • prefix:在 SQL 片段前添加的文本。
  • prefixOverrides:移除 SQL 片段前多余的文本。
  • suffix:在 SQL 片段后添加的文本。
  • suffixOverrides:移除 SQL 片段后多余的文本。

示例

假设你有一个用户表 users,表结构如下:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    status VARCHAR(10)
);

你想要构建一个动态查询,根据传入的条件动态地生成 SQL 语句。以下是使用 <trim> 标签的一个示例:

<select id="selectUsers" resultType="User">
    SELECT id, username, email, status
    FROM users
    <where>
        <trim suffixOverrides="AND ">
            AND username LIKE CONCAT('%', #{username}, '%')
            <if test="email != null">
                AND email = #{email}
            </if>
            <if test="status != null">
                AND status = #{status}
            </if>
        </trim>
    </where>
</select>

在这个例子中:

  • prefixOverrides="AND " 用于移除最后一个条件前多余的 “AND “。
  • <where> 标签会自动处理 SQL 中的 “WHERE” 关键字,如果 <trim> 中的条件都不满足,”WHERE” 关键字将不会被包含在最终的 SQL 语句中。
  • <if> 标签用于条件判断,只有当测试表达式为真时,相应的 SQL 片段才会被包含在最终的 SQL 语句中。

动态 SQL 示例

假设你调用 selectUsers 方法,并传入 username 为 "John",但不传入 email 和 status,则生成的 SQL 语句如下:

SELECT id, username, email, status
FROM users
WHERE username LIKE CONCAT('%John%')

如果你传入 username 为 "John",email 为 "john@example.com",和 status 为 "active",则生成的 SQL 语句如下:

SELECT id, username, email, status
FROM users
WHERE username LIKE CONCAT('%John%')
AND email = 'john@example.com'
AND status = 'active'

注意事项

  • 使用 <trim> 标签时,要注意正确设置 prefixOverrides 和 suffixOverrides 属性,以避免生成无效的 SQL 语句。
  • <trim> 标签通常与 <where>、<set> 等标签一起使用,以构建动态的 WHERE 子句和 SET 子句。
  • MyBatis 会自动处理 SQL 语句中的空格和逗号,确保生成的 SQL 语句是有效的。
©2026 万别客的百宝袋