149. MyBatis 中的动态 SQL 是什么,如何使用?
MyBatis 中的动态 SQL 是指可以在 XML 映射文件中编写可适应不同情况的 SQL 语句,它允许 SQL 语句根据传入的参数或查询条件动态构建。这样的特性让开发者可以编写更加灵活和强大的查询,避免了硬编码条件分支,提高了代码的可维护性。
动态 SQL 主要通过以下几种方式实现:
-
<if>
:用于判断条件是否成立,如果成立则拼接 SQL 片段。<select id="findUser" resultType="User">SELECT * FROM usersWHERE 1=1<if test="username != null">AND username = #{username}</if> </select>
-
<choose>
、<when>
和<otherwise>
:类似于 Java 中的 if-else-if 结构,用于选择性的包含 SQL 片段。<select id="findActiveBlogWithTitleLike" resultType="Blog">SELECT * FROM BLOGWHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><otherwise>AND author like #{author}</otherwise></choose> </select>
-
<foreach>
:用于遍历传入的参数集合,生成批量 SQL。<select id="findUserByIds" resultType="User">SELECT * FROM usersWHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach> </select>
-
<set>
:用于动态更新语句,只更新那些变化的字段。<update id="updateUser">UPDATE users<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if></set>WHERE id = #{id} </update>
-
<bind>
:可以用来创建一个变量并将其绑定到上下文,可以在同一个语句中使用。<select id="selectBlogs" resultType="Blog"><bind name="pattern" value="'%' + title + '%'"/>SELECT * FROM BLOGWHERE title LIKE #{pattern} </select>
使用动态 SQL 可以让我们的代码更加灵活,能够应对复杂的查询需求,并且保持 SQL 映射文件的可读性和可维护性。在实际使用中,我们需要注意 SQL 注入的风险,确保所有的输入都经过了适当的处理。
150. 如何在 MyBatis 中实现分页查询?
在 MyBatis 中实现分页查询主要有两种方式:使用内存分页和数据库分页。
1)内存分页
内存分页是指在查询出所有数据后,在 Java 内存中对数据进行分页处理。
优点:实现简单,不需要关心使用的数据库类型。
缺点:当数据量大时,占用内存大,性能低。
示例代码:
List<User> users = sqlSession.selectList("User.selectAll");
// 手动进行分页处理
Page<User> page = new Page<>(users, pageNumber, pageSize);
2)数据库分页
数据库分页是指利用数据库自身提供的分页功能,例如 MySQL 的 LIMIT
语句,Oracle 的 ROWNUM
。
优点:性能高,尤其是在数据量大的情况下。
缺点:需要根据不同的数据库编写不同的 SQL 语句。
3)示例:MySQL 分页查询
SQL Mapper XML:
<select id="selectByPage" resultType="User">SELECT * FROM userORDER BY idLIMIT #{start}, #{pageSize}
</select>
Java 代码:
public Page<User> selectByPage(int pageNumber, int pageSize) {int start = (pageNumber - 1) * pageSize;List<User> users = sqlSession.selectList("User.selectByPage", start, pageSize);int total = sqlSession.selectOne("User.selectTotal");return new Page<>(users, total, pageNumber, pageSize);
}
4)示例:Oracle 分页查询
SQL Mapper XML:
<select id="selectByPage" resultType="User">SELECT * FROM (SELECT t.*, ROWNUM rn FROM (SELECT * FROM user ORDER BY id) t WHERE ROWNUM <= #{end}) WHERE rn >= #{start}
</select>
Java 代码与 MySQL 示例类似,只需要更改 SQL 语句。
在实际应用中,建议使用数据库分页,因为它具有更好的性能。选择哪种分页方式取决于具体的需求和场景。当然,还可以通过 MyBatis 插件如 PageHelper 来简化分页的实现。
编程资料包领取:https://pan.quark.cn/s/601cbea644ff
编程、AI、副业交流:https://t.zsxq.com/19zcqaJ2b
领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。