在Java开发过程中,常用的知识点往往被忽视。在使用Spring MVC时,为了满足快速开发的需求,开发者通常会借助代码生成工具进行自动生成。而Spring Boot已经封装了基础的增删改查操作,因此开发者无需手动编写。然而,刚入行的新人可能因为对各种标签的不熟悉而导致接口报错。本文将对MyBatis XML中常用的标签进行汇总,并简单介绍每个标签的功能及其实例。
MyBatis XML常用标签
1. MyBatis XML 配置文件结构
MyBatis 的 XML 配置文件通常包括以下几个主要部分:
<configuration>
: 根元素,包含整个配置的所有内容。<environments>
: 用于定义环境(如开发、测试、生产等)。<mappers>
: 用于定义映射器的路径。
示例:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
2. Mapper XML 文件
每个 Mapper XML 文件用于定义 SQL 语句和其对应的 Java 方法。
<select>
: 查询操作。<insert>
: 插入操作。<update>
: 更新操作。<delete>
: 删除操作。
示例:
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" 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>
3. 参数和返回值
parameterType
: 指定传入参数的类型,可以是基本类型、JavaBean 或集合。resultType
: 指定返回结果的类型,可以是 JavaBean 或其他类型。
4. 动态 SQL
MyBatis 提供了一些标签来支持动态 SQL,例如:
<if>
: 条件判断。<choose>
: 类似于 switch-case。<foreach>
: 遍历集合。
示例:
<select id="findUsers" resultType="com.example.model.User">
SELECT * FROM users
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</select>
5. SQL 片段
可以使用 <sql>
标签定义可重用的 SQL 片段,以便在其他 SQL 语句中引用。
示例:
<sql id="userColumns">
id, name, email
</sql>
<select id="getAllUsers" resultType="com.example.model.User">
SELECT <include refid="userColumns"/> FROM users
</select>
6. 映射关系
MyBatis 支持一对多和多对一的映射关系,可以使用 <resultMap>
来定义复杂的结果映射。
示例:
<resultMap id="userResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<collection property="orders" ofType="com.example.model.Order">
<id property="id" column="order_id"/>
<result property="amount" column="amount"/>
</collection>
</resultMap>
<select id="getUserWithOrders" resultMap="userResultMap" parameterType="int">
SELECT u.id, u.name, u.email, o.id AS order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
7. 缓存
MyBatis 支持一级缓存(SqlSession级别)和二级缓存(Mapper级别),可以通过 <cache>
标签配置。
示例:
<mapper namespace="com.example.mapper.UserMapper">
<cache/>
</mapper>
8. XML 文件的命名约定
- Mapper XML 文件的命名通常与对应的 Mapper 接口文件保持一致,方便查找和管理。
9. 使用注解
除了 XML 配置外,MyBatis 还支持使用注解定义 SQL 语句,这对于简单的 CRUD 操作非常方便。
示例:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
}
其他标签
1. <parameterMap>
用于定义输入参数的映射关系(在现代 MyBatis 中很少使用)。
2. <include>
用于在 SQL 语句中引用定义好的 SQL 片段。
示例:
<select id="getAllUsers" resultType="com.example.model.User">
SELECT <include refid="userColumns"/> FROM users
</select>
3. <trim>
用于动态生成 SQL 语句,可以去掉多余的逗号或关键字。
示例:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="name != null">AND name = #{name}</if>
<if test="email != null">AND email = #{email}</if>
</trim>
4. <where>
自动处理条件语句中的 AND 和 OR,可以简化条件判断的书写。
示例:
<where>
<if test="name != null">AND name = #{name}</if>
<if test="email != null">AND email = #{email}</if>
</where>
5. <set>
用于动态生成更新语句中的 SET 部分,自动去掉多余的逗号。
示例:
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users
<set>
<if test="name != null">name = #{name},</if>
<if test="email != null">email = #{email},</if>
</set>
WHERE id = #{id}
</update>
6. <foreach>
用于遍历集合,生成动态的 SQL 语句,常用于 IN 子句或批量插入。
示例:
<select id="getUsersByIds" resultType="com.example.model.User">
SELECT * FROM users WHERE id IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
7. <choose>
类似于 Java 中的 switch 语句,用于处理多种条件。
示例:
<choose>
<when test="name != null">AND name = #{name}</when>
<when test="email != null">AND email = #{email}</when>
<otherwise>AND status = 'active'</otherwise>
</choose>
8. <if>
用于条件判断,生成动态 SQL 语句。
示例:
<select id="findUsers" resultType="com.example.model.User">
SELECT * FROM users
<where>
<if test="name != null">AND name = #{name}</if>
<if test="email != null">AND email = #{email}</if>
</where>
</select>
9. <bind>
用于绑定变量,方便在 SQL 语句中使用。
示例:
<select id="findUsersByPattern" resultType="com.example.model.User">
<bind name="pattern" value="'%' + name + '%'"/>
SELECT * FROM users WHERE name LIKE #{pattern}
</select>
10. <cache-ref>
用于引用其他命名空间的缓存配置。
示例:
<mapper namespace="com.example.mapper.OrderMapper">
<cache-ref namespace="com.example.mapper.UserMapper"/>
</mapper>
11. <association>
用于处理多对一映射关系。
示例:
<resultMap id="orderResultMap" type="com.example.model.Order">
<id property="id" column="id"/>
<result property="amount" column="amount"/>
<association property="user" javaType="com.example.model.User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
</association>
</resultMap>
12. <collection>
用于处理一对多映射关系。
示例:
<resultMap id="userResultMap" type="com.example.model.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="orders" ofType="com.example.model.Order">
<id property="id" column="order_id"/>
<result property="amount" column="amount"/>
</collection>
</resultMap>