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

163 阅读2分钟

MyBatis

MyBatis是一个优秀的持久层框架,它允许开发者直接使用SQL与数据库进行交互,同时提供了丰富的映射和转换功能,使得开发者可以专注于SQL本身而不是繁琐的JDBC操作。其中,MyBatis Mapper是MyBatis的核心组件之一,负责将SQL查询结果映射到Java对象。

Mybatis的Mapper映射文件基本结构

下面是一个简单的Mapper映射文件示例,其中定义了一个名为UserMapper的接口的映射。

<!-- 查询用户 -->
<select id="selectUser" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

<!-- 插入用户 -->
<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>

<!-- 更新用户 -->
<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>

<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE id = #{id}
</delete>

Mapper映射文件中常用标签及作用

1.<mapper> 标签:mapper元素是Mapper XML文件的根元素,它有一个namespace属性用于指定对应的Mapper接口或命名空间。

这是最外层的标签,用于定义一个命名空间,通常与 Mapper 接口的完全限定名相同。

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 其他标签定义 -->
</mapper>
  1. <select>:用于定义一个查询操作的SQL语句。
<select id="selectUserById" resultMap="userResultMap">
    SELECT * FROM users WHERE id = #{id}
</select>
  1. <insert>:用于定义一个插入操作的SQL语句。
<insert id="insertUser">
    INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
  1. <update>:用于定义一个更新操作的SQL语句。
<update id="updateUser">
    UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
  1. <delete>:用于定义一个删除操作的SQL语句。
<delete id="deleteUser">
    DELETE FROM users WHERE id = #{id}
</delete>
  1. <parameterMap>:已经不再推荐使用,用于定义SQL语句中的参数。
<parameterMap id="userParam" type="com.example.model.User">
    <parameter property="name"/>
    <parameter property="email"/>
</parameterMap>

<insert id="insertUser">
    INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
  1. <resultMap>:用于定义如何从数据库结果集映射到Java对象的复杂语句。
    <id property="id" column="id" />
    <result property="name" column="name" />
    <result property="email" column="email" />
</resultMap>
  1. <sql>, <include>::用于定义可重用的SQL段。用于引用定义的SQL段。搭配使用。
<sql id="userColumns">
    id, name, email
</sql>

<select id="selectAllUsers" resultType="com.example.model.User">
    SELECT <include refid="userColumns" /> FROM users
</select>
    • <where>:用于动态地生成SQL语句的WHERE部分。
<select id="selectUserByUsernameAndSex" resultType="user" parameterType="com.ys.po.User">
    select * from user
    <where>
        <if test="username != null and username != ''">
            AND username = #{username}
        </if>
        <if test="sex != null">
            AND sex = #{sex}
        </if>
    </where>
</select>
  1. <if>:根据条件包含SQL片段。
<select id="selectUserByUsernameAndSex" resultType="user" parameterType="com.ys.po.User">
    select * from user
    <where>
        <if test="username != null and username != ''">
            AND username = #{username}
        </if>
        <if test="sex != null">
            AND sex = #{sex}
        </if>
    </where>
</select>
  1. <choose><when><otherwise>:用于多分支选择。
<select id="selectUserByChoose" resultType="com.ys.po.User" parameterType="com.ys.po.User">
    select * from user
    <where>
        <choose>
            <when test="id != null">
                id = #{id}
            </when>
            <when test="username != null">
                AND username = #{username}
            </when>
            <otherwise>
                AND sex = #{sex}
            </otherwise>
        </choose>
    </where>
</select>
  1. <set>:用于动态地生成SQL语句的SET部分。
<update id="updateUser">
    update user
    <set>
        <if test="username != null">username = #{username},</if>
        <if test="sex != null">sex = #{sex},</if>
    </set>
    where id = #{id}
</update>
  1. <trim>:用于去除SQL语句中的多余空格和括号。
<select id="findActiveBlogLike" resultType="Blog">
    SELECT * FROM BLOG
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
        <if test="state != null">
            state = #{state}
        </if>
        <if test="title != null">
            AND title like #{title}
        </if>
        <if test="author != null and author.name != null">
            AND author_name like #{author.name}
        </if>
    </trim>
</select>
  1. <foreach>:用于遍历集合或数组。
<select id="selectUsersByIdList" resultType="user">
    select * from user
    where id in
    <foreach item="id" collection="list" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>