<mapper> 标签
描述:根元素,用于定义一个 Mapper 接口。
属性:
namespace:指定 Mapper 接口的全限定名。
示例:<mapper namespace="com.example.mapper.UserMapper"> <!-- SQL 语句定义 --> </mapper>
- <select> 标签
描述:用于定义查询 SQL 语句。
属性:
id:唯一标识此 SQL 语句的方法名。
parameterType:输入参数类型。
resultType:输出结果类型。
fetchSize:每次获取的结果集大小。
resultSetType:结果集类型(如 FORWARD_ONLY, SCROLL_INSENSITIVE 等)。
statementType:语句类型(如 STATEMENT, PREPARED, CALLABLE)。
keyProperty:主键属性名。
keyColumn:主键对应的数据库列名。
useCache:是否使用缓存。
timeout:执行 SQL 语句的超时时间(毫秒)。
databaseId:指定数据库 ID。
lang:SQL 语言驱动器。
示例
<select id="selectAllUsers" parameterType="int" resultType="com.example.model.User" fetchSize="100" timeout="5000">
SELECT * FROM users WHERE id = #{id}
</select>
- <insert> 标签
描述:用于定义插入 SQL 语句。
属性:
id:唯一标识此 SQL 语句的方法名。
parameterType:输入参数类型。
useGeneratedKeys:是否使用自动生成的主键。
keyProperty:主键属性名。
keyColumn:主键对应的数据库列名。
statementType:语句类型(如 STATEMENT, PREPARED, CALLABLE)。
timeout:执行 SQL 语句的超时时间(毫秒)。
databaseId:指定数据库 ID。
lang:SQL 语言驱动器。
示例:
<insert id="insertUser" parameterType="com.example.model.User" useGeneratedKeys="true" keyProperty="id" statementType="PREPARED" timeout="5000">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
- <update> 标签
描述:用于定义更新 SQL 语句。
属性:
id:唯一标识此 SQL 语句的方法名。
parameterType:输入参数类型。
statementType:语句类型(如 STATEMENT, PREPARED, CALLABLE)。
timeout:执行 SQL 语句的超时时间(毫秒)。
databaseId:指定数据库 ID。
lang:SQL 语言驱动器。
示例:
<update id="updateUser" parameterType="com.example.model.User" statementType="PREPARED" timeout="5000">
UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
- <delete> 标签
描述:用于定义删除 SQL 语句。
属性:
id:唯一标识此 SQL 语句的方法名。
parameterType:输入参数类型。
statementType:语句类型(如 STATEMENT, PREPARED, CALLABLE)。
timeout:执行 SQL 语句的超时时间(毫秒)。
databaseId:指定数据库 ID。
lang:SQL 语言驱动器。
示例:
<delete id="deleteUser" parameterType="int" statementType="PREPARED" timeout="5000">
DELETE FROM users WHERE id = #{id}
</delete>
- <resultMap> 标签
描述:用于定义复杂的结果映射关系。
属性:
id:唯一标识此 resultMap。
type:结果对象的类型。
autoMapping:是否自动映射列名到属性名。
extends:继承其他 resultMap。
示例:
<resultMap id="userResultMap" type="com.example.model.User" autoMapping="true">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
- <sql> 标签
描述:用于定义可重用的 SQL 片段。
属性:
id:唯一标识此 SQL 片段。
示例:
<sql id="commonColumns">name, age</sql>
- <include> 标签
描述:用于引用 <sql> 标签定义的 SQL 片段。
属性:
refid:引用的 SQL 片段 ID。
示例:
<select id="selectAllUsers" resultType="com.example.model.User">
SELECT <include refid="commonColumns"/> FROM users WHERE id = #{id}
</select>
- <if> 标签
描述:用于条件判断,根据参数值决定是否包含某些 SQL 语句片段。
属性:
test:条件表达式。
示例:
<select id="findUserByName" parameterType="String" resultType="com.example.model.User">
SELECT * FROM users WHERE 1 = 1
<if test="name != null and name != ''">
AND name = #{name}
</if>
</select>
- <choose> / <when> / <otherwise> 标签
描述:用于多条件判断,类似于 switch 语句。
属性:
<choose>:开始标签。
<when>:条件分支。
<otherwise>:默认分支。
示例:
<select id="findUserByCondition" parameterType="com.example.model.User" resultType="com.example.model.User">
SELECT * FROM users WHERE 1 = 1
<choose>
<when test="name != null and name != ''">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND id > 0
</otherwise>
</choose>
</select>
- <foreach> 标签
描述:用于循环遍历集合或数组,生成动态 SQL 语句。
属性:
collection:集合或数组名称。
item:当前项的变量名。
open:开始符号。
close:结束符号。
separator:分隔符。
示例:
<select id="findUsersByIds" parameterType="List<Integer>" resultType="com.example.model.User">
SELECT * FROM users WHERE id IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
- <cache> 标签
描述:用于定义缓存配置。
属性:
type:缓存类型(如 PERPETUAL, FIFO, LRU 等)。
eviction:缓存淘汰策略。
flushInterval:刷新间隔(毫秒)。
size:缓存大小。
readOnly:是否只读。
示例:
<mapper namespace="com.example.mapper.UserMapper">
<cache type="PERPETUAL" eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
<!-- SQL 语句定义 -->
</mapper>
- <discriminator> 标签
区分不同的结果类型:
在多表联合查询或子类继承的情况下,可以根据某个字段的值来区分不同的结果类型。
这个字段通常是一个标识字段,比如表示用户类型的字段。
映射到不同的 Java 类:
根据字段值的不同,可以将查询结果映射到不同的 Java 类上。
这样可以在不修改 SQL 语句的情况下,实现不同类型数据的映射。
属性:
column:指定数据库中的列名。
javaType:指定该列的 Java 类型。
jdbcType:指定该列的 JDBC 类型。
case:定义不同的情况及其映射结果类型
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="com.example.model.NormalUser">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<discriminator javaType="String" column="user_type">
<case value="normal" resultType="com.example.model.NormalUser"/>
<case value="admin" resultType="com.example.model.AdminUser"/>
</discriminator>
</resultMap>
<select id="getUserById" resultMap="userResultMap" parameterType="int">
SELECT id, username, password, user_type FROM users WHERE id = #{id}
</select>
</mapper>
14<set> 标签:
1.动态生成 SET 子句:
根据传入的参数动态生成 SET 子句,只包含需要更新的字段。
避免更新所有字段,即使某些字段没有变化。
2.条件判断:
可以结合 <if> 标签进行条件判断,只有当某个字段有值时才将其包含在 SET 子句中。
3.提高性能:
只更新实际需要更新的字段,减少数据库操作的开销。
<mapper namespace="com.example.mapper.UserMapper">
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users
<set>
<if test="username != null and username != ''">
username = #{username},
</if>
<if test="password != null and password != ''">
password = #{password},
</if>
<if test="email != null and email != ''">
email = #{email}
</if>
</set>
WHERE id = #{id}
</update>
</mapper>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。