MyBatis-Plus未集成SQL语句的场景与解决方案
作者:小菜全
MyBatis-Plus 提供了强大的 CRUD 操作和条件构造器,但在某些复杂场景下仍需手动编写 SQL 语句,以下是常见未集成场景及对应的实现方式,需要的朋友可以参考下
复杂多表关联查询
MyBatis-Plus 的 @TableName 和 @TableField 注解主要针对单表操作,多表关联查询需自定义 SQL。
<!-- XML 映射文件示例 -->
<select id="selectUserWithRole" resultType="map">
SELECT u.*, r.role_name
FROM user u
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id
WHERE u.status = 1
</select>对应 Mapper 接口需声明方法:
@Mapper
public interface UserMapper extends BaseMapper<User> {
List<Map<String, Object>> selectUserWithRole();
}存储过程调用
MyBatis-Plus 未直接封装存储过程调用,需通过注解或 XML 实现。
<select id="callCalculateStats" statementType="CALLABLE">
{call calculate_user_stats(#{userId, mode=IN})}
</select>注解方式:
@Select("{call calculate_user_stats(#{userId})}")
void callCalculateStats(@Param("userId") Long userId);动态 SQL 片段复用
虽然 MyBatis-Plus 提供 Wrapper,但复杂动态 SQL 仍需使用 <sql> 和 <include>。
<sql id="baseColumn">
id, name, create_time
</sql>
<select id="selectCustom" resultType="User">
SELECT <include refid="baseColumn"/>
FROM user WHERE ${ew.customSqlSegment}
</select>批量插入优化
MyBatis-Plus 的 saveBatch 默认逐条插入,需手动编写批量语句提升性能。
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO user (name, age) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.age})
</foreach>
</insert>特殊数据库函数
如 PostgreSQL 的 JSONB 操作、Oracle 的 CONNECT BY 等方言功能需自定义 SQL。
<select id="selectJsonData" resultType="map">
SELECT id, info->>'$.address' AS address
FROM user WHERE info @> '{"status":1}'
</select>自定义结果集处理
复杂结果集映射需通过 @ResultMap 或 @Results 注解实现。
@Results({
@Result(property = "id", column = "user_id"),
@Result(property = "details", column = "user_id",
many = @Many(select = "selectUserDetails"))
})
@Select("SELECT id AS user_id FROM user WHERE id = #{id}")
User selectUserWithDetails(Long id);注意事项
- SQL 注入风险:动态 SQL 避免直接拼接参数,使用
#{param}占位符 - 性能监控:复杂 SQL 需通过 EXPLAIN 分析执行计划
- 跨数据库兼容:方言函数建议抽离为数据库厂商判断分支
通过结合 MyBatis-Plus 的快捷方法和自定义 SQL,能覆盖绝大多数业务场景的需求。
以上就是MyBatis-Plus未集成SQL语句的场景与解决方案的详细内容,更多关于MyBatis-Plus未集成SQL语句的资料请关注脚本之家其它相关文章!
