java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis-Plus未集成SQL语句

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);

注意事项

  1. SQL 注入风险:动态 SQL 避免直接拼接参数,使用 #{param} 占位符
  2. 性能监控:复杂 SQL 需通过 EXPLAIN 分析执行计划
  3. 跨数据库兼容:方言函数建议抽离为数据库厂商判断分支

通过结合 MyBatis-Plus 的快捷方法和自定义 SQL,能覆盖绝大多数业务场景的需求。

以上就是MyBatis-Plus未集成SQL语句的场景与解决方案的详细内容,更多关于MyBatis-Plus未集成SQL语句的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文