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语句的资料请关注脚本之家其它相关文章!