MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects, 普通的老式 Java 对象) 映射成数据库中的记录。
在 MyBatis 中,Mapper 映射文件是非常重要的组成部分,它定义了 SQL 查询语句及其与 Java 方法之间的映射关系。下面是一些常用的标签,这些标签用于构建 Mapper 文件:
-
<select>- 定义查询语句,用于从数据库中检索数据。可以指定返回的结果类型。<select id="selectPerson" resultType="com.example.Person"> SELECT * FROM person WHERE id = #{id} </select> -
<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> -
<update>- 定义更新语句,用于修改数据库中已存在的记录。<update id="updatePerson" parameterType="com.example.Person"> UPDATE person SET name=#{name}, age=#{age} WHERE id=#{id} </update> -
<delete>- 定义删除语句,用于从数据库中移除记录。<delete id="deletePerson" parameterType="int"> DELETE FROM person WHERE id=#{id} </delete> -
<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> -
<sql>- 定义可重用的 SQL 片段,可以在其他 SQL 语句中引用。<sql id="personColumns"> ${alias}.id, ${alias}.name, ${alias}.age </sql> -
<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> -
<choose>,<when>,<otherwise>- 用于多条件分支选择,类似于 Java 的 switch-case 语句。 -
<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> -
<cache>- 为命名空间启用或配置缓存,可以提高查询性能。
当然可以,除了上述提到的标签之外,MyBatis 的 Mapper 映射文件还支持其他一些标签,这些标签可以帮助开发者更灵活地构建 SQL 语句,处理更复杂的业务需求。下面是额外的一些标签:
-
<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> -
<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> -
<bind>- 用于创建一个变量并绑定到上下文中,通常用于处理正则表达式或其他复杂的字符串操作。<select id="selectPersonByNamePattern" parameterType="string" resultType="com.example.Person"> <bind name="pattern" value="'%' + _parameter + '%'" /> SELECT * FROM person WHERE name LIKE #{pattern} </select> -
<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> -
<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> -
<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> -
<cache-ref>- 引用另一个命名空间的缓存配置。<cache-ref namespace="com.example.mapper.OtherMapper"/> -
<typeAlias>- 定义类型别名,简化类型引用。<typeAlias alias="User" type="com.example.model.User"/> -
<typeHandler>- 定义类型处理器,用于自定义 Java 类型与数据库类型之间的转换。<typeHandler javaType="com.example.MyCustomType" jdbcType="VARCHAR" handler="com.example.MyCustomTypeHandler"/> -
<parameterMap>- 定义参数映射,虽然现在较少使用,但在某些情况下仍然有用。<parameterMap id="userParams" type="map"> <parameter property="id" javaType="int" jdbcType="INTEGER"/> <parameter property="username" javaType="string" jdbcType="VARCHAR"/> </parameterMap> -
<selectKey>- 已经在之前的例子中展示过,用于自动获取插入后的主键值。 -
<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>