MyBatis 是一个流行的持久化框架,通常用于将 Java 对象映射到数据库表中
1. 基本查询操作
最常见的操作是执行简单的查询,插入,更新和删除。MyBatis 通过映射 XML 配置文件或注解来实现这些操作。
查询操作(SELECT
)
<!-- 查询所有用户 -->
<select id="selectAllUsers" resultType="com.example.User">
SELECT * FROM users
</select>
插入操作(INSERT
)
<!-- 插入用户 -->
<insert id="insertUser" parameterType="com.example.User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
更新操作(UPDATE
)
<!-- 更新用户 -->
<update id="updateUser" parameterType="com.example.User">
UPDATE users
SET name = #{name}, age = #{age}
WHERE id = #{id}
</update>
删除操作(DELETE
)
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
2. 条件查询
在 MyBatis 中,使用 where
子句和 if
标签可以动态生成 SQL。
使用 if
动态 SQL
<select id="selectUser" resultType="com.example.User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
在上述查询中,<if>
标签根据条件动态拼接 WHERE
子句。
3. 分页查询
分页查询常见于大数据集的场景中,MyBatis 可以通过提供 LIMIT
或 ROWNUM
来实现分页查询。
使用 RowBounds
实现分页
List<User> users = sqlSession.selectList("selectAllUsers", null, new RowBounds(0, 10));
在这里,RowBounds(0, 10)
表示从第 0 条记录开始,查询 10 条记录。
使用 MySQL 的 LIMIT
<select id="selectPagedUsers" resultType="com.example.User">
SELECT * FROM users
LIMIT #{offset}, #{limit}
</select>
4. 批量插入和更新
MyBatis 也支持批量操作,适用于需要一次性插入或更新大量记录的情况。
批量插入
<insert id="insertUsers" parameterType="java.util.List">
INSERT INTO users (name, age)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
批量更新
<update id="updateUsers" parameterType="java.util.List">
<foreach collection="list" item="user" open="BEGIN" close="END" separator=";">
UPDATE users SET name = #{user.name}, age = #{user.age} WHERE id = #{user.id}
</foreach>
</update>
5. 连接查询(Join)
MyBatis 支持通过简单的 SQL 查询来进行连接查询。
<select id="selectUserWithOrders" resultMap="userOrderMap">
SELECT u.id, u.name, o.id AS order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
</select>
<resultMap id="userOrderMap" type="com.example.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="orders" ofType="com.example.Order">
<id property="id" column="order_id"/>
<result property="amount" column="amount"/>
</collection>
</resultMap>
在这里,LEFT JOIN
用来连接 users
表和 orders
表,返回一个包含 orders
集合的 User
对象。
6. 自定义函数(SQL)
MyBatis 允许你在 XML 中使用自定义 SQL 函数和条件。
使用 choose
, when
, otherwise
<select id="selectUser" resultType="com.example.User">
SELECT * FROM users
<where>
<choose>
<when test="name != null">AND name = #{name}</when>
<when test="age != null">AND age = #{age}</when>
<otherwise>AND status = 'active'</otherwise>
</choose>
</where>
</select>
<choose>
标签相当于 SQL 中的 CASE WHEN
,根据不同的条件执行不同的 SQL 片段。
使用 trim
删除多余的 SQL
<select id="selectUserWithTrim" resultType="com.example.User">
SELECT * FROM users
<trim prefix="WHERE" prefixOverrides="AND">
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</trim>
</select>
<trim>
标签用来处理 SQL 中的前缀或多余的 AND
、OR
。