Mybatis的Mapper映射文件中常用标签

199 阅读3分钟

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects, 普通的老式 Java 对象) 映射成数据库中的记录。

mybatis.png

在 MyBatis 中,Mapper 映射文件是非常重要的组成部分,它定义了 SQL 查询语句及其与 Java 方法之间的映射关系。下面是一些常用的标签,这些标签用于构建 Mapper 文件:

  1. <select> - 定义查询语句,用于从数据库中检索数据。可以指定返回的结果类型。

    <select id="selectPerson" resultType="com.example.Person">
        SELECT * FROM person WHERE id = #{id}
    </select>
    
  2. <insert> - 定义插入语句,用于向数据库中添加新的记录。可以指定 key 属性来处理自增主键。

    <insert id="insertPerson" parameterType="com.example.Person">
        INSERT INTO person (name, age) VALUES (#{name}, #{age})
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT 0
        </selectKey>
    </insert>
    
  3. <update> - 定义更新语句,用于修改数据库中已存在的记录。

    <update id="updatePerson" parameterType="com.example.Person">
        UPDATE person SET name=#{name}, age=#{age} WHERE id=#{id}
    </update>
    
  4. <delete> - 定义删除语句,用于从数据库中移除记录。

    <delete id="deletePerson" parameterType="int">
        DELETE FROM person WHERE id=#{id}
    </delete>
    
  5. <resultMap> - 定义结果映射,用于更复杂的映射场景,比如关联映射等。可以指定如何将数据库列映射到 Java 对象的属性上。

    <resultMap id="personResultMap" type="com.example.Person">
        <id property="id" column="person_id"/>
        <result property="name" column="person_name"/>
        <result property="age" column="person_age"/>
    </resultMap>
    
  6. <sql> - 定义可重用的 SQL 片段,可以在其他 SQL 语句中引用。

    <sql id="personColumns"> ${alias}.id, ${alias}.name, ${alias}.age </sql>
    
  7. <if> - 用于条件判断,可以根据传入的参数值决定是否包含该 SQL 片段。

    <select id="selectPersonByCriteria" parameterType="map" resultMap="personResultMap">
        SELECT * FROM person
        <where>
            <if test="name != null">AND name = #{name}</if>
            <if test="age != null">AND age = #{age}</if>
        </where>
    </select>
    
  8. <choose>, <when>, <otherwise> - 用于多条件分支选择,类似于 Java 的 switch-case 语句。

  9. <foreach> - 用于循环操作,常用于 IN 子句的动态 SQL 构建。

    <select id="selectPersonsByIds" parameterType="java.util.List" resultType="com.example.Person">
        SELECT * FROM person WHERE id IN
        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
    
  10. <cache> - 为命名空间启用或配置缓存,可以提高查询性能。

当然可以,除了上述提到的标签之外,MyBatis 的 Mapper 映射文件还支持其他一些标签,这些标签可以帮助开发者更灵活地构建 SQL 语句,处理更复杂的业务需求。下面是额外的一些标签:

  1. <include> - 用于引用 <sql> 标签定义的 SQL 片段,避免重复代码。

    <select id="selectPersonWithDetails" resultMap="personResultMap">
        SELECT
            <include refid="personColumns"><property name="alias" value="p"/></include>,
            address.address as address
        FROM person p
        LEFT JOIN address ON p.id = address.person_id
    </select>
    
  2. <trim> - 用于去除或添加某些特定的字符(如前导或尾随的 AND 或 OR),通常用于动态 SQL 语句中。

    <select id="selectPersonByConditions" parameterType="map" resultType="com.example.Person">
        SELECT * FROM person
        <where>
            <trim prefix="(" suffix=")" prefixOverrides="AND |OR ">
                <if test="name != null">AND name = #{name}</if>
                <if test="age != null">OR age = #{age}</if>
            </trim>
        </where>
    </select>
    
  3. <bind> - 用于创建一个变量并绑定到上下文中,通常用于处理正则表达式或其他复杂的字符串操作。

    <select id="selectPersonByNamePattern" parameterType="string" resultType="com.example.Person">
        <bind name="pattern" value="'%' + _parameter + '%'" />
        SELECT * FROM person WHERE name LIKE #{pattern}
    </select>
    
  4. <set> - 用于动态地生成 SET 关键字后面的部分,通常用于更新语句中,当有多个字段需要更新时非常有用。

    <update id="updatePersonSelective" parameterType="com.example.Person">
        UPDATE person
        <set>
            <if test="name != null">name = #{name},</if>
            <if test="age != null">age = #{age}</if>
        </set>
        WHERE id = #{id}
    </update>
    
  5. <collection> - 在 <resultMap> 中使用,用于处理集合类型的属性映射,例如一对多的关系。

    <resultMap id="orderResultMap" type="Order">
        <id property="id" column="order_id"/>
        <result property="date" column="order_date"/>
        <collection property="items" ofType="OrderItem">
            <id property="id" column="item_id"/>
            <result property="quantity" column="quantity"/>
            <result property="price" column="price"/>
        </collection>
    </resultMap>
    
  6. <association> - 在 <resultMap> 中使用,用于处理一对一的关系。

    <resultMap id="userResultMap" type="User">
        <id property="id" column="user_id"/>
        <result property="username" column="username"/>
        <association property="profile" javaType="UserProfile">
            <id property="id" column="profile_id"/>
            <result property="email" column="email"/>
        </association>
    </resultMap>
    
  7. <cache-ref> - 引用另一个命名空间的缓存配置。

    <cache-ref namespace="com.example.mapper.OtherMapper"/>
    
  8. <typeAlias> - 定义类型别名,简化类型引用。

    <typeAlias alias="User" type="com.example.model.User"/>
    
  9. <typeHandler> - 定义类型处理器,用于自定义 Java 类型与数据库类型之间的转换。

    <typeHandler javaType="com.example.MyCustomType" jdbcType="VARCHAR" handler="com.example.MyCustomTypeHandler"/>
    
  10. <parameterMap> - 定义参数映射,虽然现在较少使用,但在某些情况下仍然有用。

    <parameterMap id="userParams" type="map">
        <parameter property="id" javaType="int" jdbcType="INTEGER"/>
        <parameter property="username" javaType="string" jdbcType="VARCHAR"/>
    </parameterMap>
    
  11. <selectKey> - 已经在之前的例子中展示过,用于自动获取插入后的主键值。

  12. <script> - 包含动态 SQL 语句,允许使用任意的 SQL 脚本语言编写 SQL。

    <select id="selectDynamicSql" parameterType="map" resultType="com.example.Person">
        <script>
            SELECT * FROM person
            WHERE 1=1
            <if test="name != null">AND name = #{name}</if>
            <if test="age != null">AND age = #{age}</if>
        </script>
    </select>