MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 允许开发者直接编写原生 SQL 查询,并通过参数映射功能,使得数据库操作更加灵活和强大。在处理动态 SQL 时,MyBatis 提供了多种元素和特性来帮助开发者构建灵活的 SQL 语句。
标签
<select id="findActiveUsers" resultType="User">
SELECT * FROM users
WHERE status = 'ACTIVE'
<if test="name != null">
AND name = #{name}
</if>
</select>
, , 标签
<select id="findUserByStatus" 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 = 'PENDING'
</otherwise>
</choose>
</where>
</select>
标签
当需要处理集合(如 List 或数组)时,
<select id="findUsersByIds" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
批量插入
<insert id="insertUsers" parameterType="list">
INSERT INTO users (name, email)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.email})
</foreach>
</insert>
和 、 标签优化 SQL 结构
使用
<select id="findUserByName" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
使用
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="name != null">name = #{name},</if>
<if test="email != null">email = #{email}</if>
</set>
WHERE id = #{id}
</update>
注意: #{}用来作为预编译SQL语句的占位符。这意味着MyBatis会将你传入的参数设置为PreparedStatement的参数,从而防止SQL注入攻击,并允许MyBatis对传入的数据进行适当的类型转换。 $()用于直接在SQL语句中插入内容,它不会被当作预编译参数处理,而是直接替换掉${}及其内部的内容。这可能导致SQL注入风险,特别是在使用用户输入时。