Mybatis中的常用标签以及作用
映射文件标签
这些标签用于描述数据库表结构以及 SQL 映射规则。
<mapper>标签
mapper:映射器接口的 XML 文件根元素,定义了 SQL 映射规则。
<resultMap>
resultMap:用于定义结果集和对象之间的映射规则。
基本映射:
<resultMap id="UserMap" type="User">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="email" column="email" />
</resultMap>
嵌套结果映射:
如果查询结果中包含了关联的对象,可以使用嵌套的 resultMap。
<resultMap id="UserDetailMap" type="User">
<id property="id" column="id" />
<result property="username" column="username" />
<association property="address" javaType="Address">
<id property="addressId" column="address_id" />
<result property="street" column="street" />
<result property="city" column="city" />
</association>
</resultMap>
集合映射:
如果查询返回的是对象列表,可以使用 collection 标签
<resultMap id="UserWithOrdersMap" type="User">
<id property="id" column="id" />
<result property="username" column="username" />
<collection property="orders" ofType="Order" column="id" select="selectOrdersByUserId" />
</resultMap>
<sql>
SQL:用于定义可以被其他 SQL 语句引用的片段,以提高 SQL 语句的复用性。
示例:
<sql id="userColumns">
id, username, email
</sql>
<select id="selectUsers" resultType="User">
SELECT <include refid="userColumns" /> FROM users
</select>
<include>
<include> 标签用于引入其他 XML 片段,实现 SQL 代码的复用。通过 <sql> 标签定义可重用的 SQL 代码段,然后通过 <include> 标签引用这些片段。这有助于减少代码冗余,提高代码的可维护性。
示例:
<sql id="userColumns">
${alias}.id, ${alias}.username, ${alias}.email
</sql>
<select id="selectUsers" resultType="User">
SELECT <include refid="userColumns" property="alias=u" />
FROM users u
</select>
跨文件引用: 当需要在不同的 XML 文件中复用 SQL 片段时,可以通过指定命名空间来引用:
<!-- BaseMapper.xml -->
<mapper namespace="com.test.BaseDAO">
<sql id="where">STATUS IN (1, 2, 3, 4)</sql>
</mapper>
<!-- UserMapper.xml -->
<mapper namespace="com.test.UserMapper">
<select id="selectUsers" resultType="User">
SELECT * FROM TEST WHERE <include refid="com.test.BaseDAO.where"/>
</select>
</mapper>
<selectKey>
<selectKey> 标签用于在执行插入操作后获取由数据库自动生成的主键值。这个标签通常用在插入语句(<insert>)内部,以确保在插入数据后立即获取新生成的主键。
<selectKey> 标签可以配置以下属性:
keyProperty:这是必须设置的属性,它指定了Java对象的属性名,该属性将用来接收生成的主键值。resultType:指定返回的主键类型,例如int、String等。keyColumn:指定返回的主键列名,在使用多列主键时非常有用。before:指定是否在插入语句执行前执行selectKey查询。默认值为false,即插入语句执行后执行。after:与before相反,指定是否在插入语句执行后执行selectKey查询。通常与order="AFTER"一起使用。order:指定selectKey查询的执行顺序,可以是BEFORE或AFTER。statementType:指定要执行的语句类型,如PREPARED、STATEMENT等。
示例:
<insert id="insertUser" parameterType="User" useGeneratedKeys="false" keyProperty="id">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT 0
</selectKey>
INSERT INTO users (username, email) VALUES (#{username}, #{email})
</insert>
useGeneratedKeys="false"表示不使用 JDBC 的getGeneratedKeys方法来获取主键,这通常在数据库不支持getGeneratedKeys或需要自定义主键获取逻辑时使用。keyProperty="id"指定了User对象的id属性将用来接收生成的主键值。order="AFTER"表示SELECT 0将在插入语句执行后执行。SELECT 0是 MySQL 特有的 SQL 语句,用来获取最后插入行的自增主键值
<cache>
<cache> 标签用于配置二级缓存,这是一种可以跨 SqlSession 共享的缓存,通常用于提高查询性能,减少数据库的压力。二级缓存的配置通常在映射文件(XML 配置文件)中进行。
以下是 <cache> 标签的一些常用属性:
- type:指定缓存的类型,默认是
org.apache.ibatis.cache.impl.PerpetualCache。如果需要使用第三方缓存,如 Ehcache 或 Redis,可以在这里指定相应的类名。 - eviction:指定缓存的回收策略,常见的有:
- LRU(Least Recently Used):最近最少使用,移除最长时间不使用的对象(默认)。
- FIFO(First In First Out):先进先出,按照对象进入缓存的顺序来移除它们。
- SOFT:软引用,移除基于垃圾收集器状态和软引用规则的对象。
- WEAK:弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象。
- flushInterval:自动刷新缓存的时间间隔,单位为毫秒。如果不配置,那么只有在进行数据库修改操作(如 insert、update、delete)时才会被动刷新缓存区。
- size:缓存存储的对象个数,默认为 1024。
- readOnly:指定缓存是否为只读,如果为
true,则所有相同的 SQL 语句返回的是同一个对象实例(有助于提高性能,但并发操作同一条数据时,可能不安全)。如果设置为false,则相同的 SQL,后面访问的是缓存的克隆副本(通过序列化),不会共享。这会慢一些,但是安全,因此默认是false。 - blocking:启用阻塞缓存,通过在 get/put 方法中加锁,保证只有一个线程操作缓存,基于 Java 重入锁实现。
在 MyBatis 的全局配置文件中,可以通过
<settings>标签开启或关闭二级缓存,如下:
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
然后在具体的映射文件中开启二级缓存:
<mapper namespace="com.example.mapper.UserMapper">
<!-- 缓存配置 -->
<cache eviction="LRU" flushInterval="120000" size="512" readOnly="true"/>
<!-- 其他映射语句 -->
</mapper>
需要注意的是,二级缓存只适用于读操作,对于写操作(如 insert、update、delete),MyBatis 会清空相关 namespace 下的缓存,以保证缓存数据的一致性。此外,如果使用默认缓存,那么结果集对象需要实现 java.io.Serializable 接口。
SQL标签
<insert>、<select>、<update> 和 <delete> 标签分别用于定义插入、查询、更新和删除数据库记录的 SQL 语句。这些标签都位于映射文件中,并且可以配置多种属性来控制 SQL 语句的行为。一下是每个标签的基本用法和一些常见属性:
<insert> 标签
用于插入一条或多条记录到数据库表中。 基本属性:
id:定义执行此插入操作的标识符。parameterType:指定参数对象的类型。useGeneratedKeys:指定是否使用 JDBC 的getGeneratedKeys方法来获取自动生成的主键。keyProperty:指定一个属性名称,用于接收useGeneratedKeys属性生成的主键值。 示例:
<insert id="insertUser" parameterType="User">
INSERT INTO users (id, username, email) VALUES (#{id}, #{username}, #{email})
</insert>
<select> 标签
用于查询数据库,并映射结果到 Java 对象。 基本属性:
id:定义执行此查询操作的标识符。parameterType:指定参数对象的类型。resultType:指定返回的结果类型。resultMap:指定一个resultMap的 ID,用于复杂映射。 示例:
<select id="selectUserById" parameterType="int" resultType="User">
SELECT id, username, email FROM users WHERE id = #{id}
</select>
<update> 标签
用于更新数据库中的记录。 基本属性:
id:定义执行此更新操作的标识符。parameterType:指定参数对象的类型。 示例:
<update id="updateUser" parameterType="User">
UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}
</update>
<delete> 标签
用于删除数据库中的记录。 基本属性:
id:定义执行此删除操作的标识符。parameterType:指定参数对象的类型。 示例:
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
其他常用属性和元素
timeout:指定执行 SQL 语句的超时时间(以秒为单位)。fetchSize:用于控制数据库返回结果集的抓取数量。statementType:指定要执行的语句类型,如PREPARED(预编译)、STATEMENT(普通)。useCache:指定是否使用本地缓存,默认为true。flushCache:指定在执行操作前后是否清空本地缓存,可以设置为true或false。parameterMap:用于定义参数映射。sql:用于定义可重用的 SQL 片段。 通过它们可以灵活地编写各种数据库操作语句。
动态SQL标签
<if>、<choose>、<when>、<otherwise>、<where>、<set> 和 <foreach> 这些动态 SQL 元素提供了更灵活的条件逻辑处理能力,可以根据程序运行时的条件动态构建 SQL 语句。下面是这些元素的使用示例:
<if> 条件判断
<if> 标签用于条件判断,只有当测试表达式为 true 时,其内容才会被包含在最终的 SQL 中。
示例:
<select id="selectUsersIfActive" resultType="User">
SELECT * FROM users
<if test="active">
WHERE active = true
</if>
</select>
<choose>、<when>、<otherwise> 条件选择
这三个标签通常一起使用,用于实现类似于Java中的 switch 语句。<choose> 标签内的多个 <when> 标签定义了不同的条件分支,而 <otherwise> 标签定义了默认分支。
示例:
<select id="selectUsersByStatus" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="status == 'active'">
AND status = 'active'
</when>
<when test="status == 'inactive'">
AND status = 'inactive'
</when>
<otherwise>
AND status IS NULL
</otherwise>
</choose>
</where>
</select>
<where> 自动生成 WHERE 子句
<where> 标签自动生成 WHERE 子句,并处理 AND 或 OR 条件前的多余连接词。
示例:
<update id="updateUser" parameterType="User">
<where>
<if test="id != null">
id = #{id},
</if>
<if test="username != null">
and username = #{username},
</if>
<if test="email != null">
and email = #{email}
</if>
</where>
</update>
<set> 自动生成 SET 子句
<set> 标签用于 UPDATE 语句中,自动生成 SET 子句,并处理多余的逗号。
示例:
<update id="updateUserSelective" parameterType="User">
UPDATE users
<set>
<if test="username != null">
username = #{username},
</if>
<if test="email != null">
email = #{email}
</if>
</set>
WHERE id = #{id}
</update>
<foreach> 循环遍历集合
<foreach> 标签用于循环遍历集合或数组,并生成相应的 SQL 片段。它常用于 IN 子句或批量操作。
示例:
<select id="selectUsersByIdList" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
这些动态 SQL 元素使得 MyBatis 能够更加灵活地根据程序逻辑构建 SQL 语句,从而提高代码的可读性和维护性。
总结
以上所有的标签,在日常的业务场景中通常都是灵活的集合起来使用的,根据不同的业务场景选择组合不同的标签来完成相应的操作,当然Mybatis还有更多的标签,但是那些在日常的业务场景都不太常见。还有几个标签则是你定义mapper的xml文件时自带的,比如