MyBatis-Plus未集成SQL语句的场景与解决方案

 更新时间:2025年09月19日 10:22:57   作者:小菜全  
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语句的资料请关注脚本之家其它相关文章!

相关文章

  • SpringSecurity权限控制实现原理解析

    SpringSecurity权限控制实现原理解析

    这篇文章主要介绍了SpringSecurity权限控制实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 详解jeefast和Mybatis实现二级联动的问题

    详解jeefast和Mybatis实现二级联动的问题

    这篇文章主要介绍了详解jeefast和Mybatis实现二级联动的问题,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Springboot+Thymeleaf+Jpa实现登录功能(附源码)

    Springboot+Thymeleaf+Jpa实现登录功能(附源码)

    最近有学习到关于Springboot+Thymeleaf+Jpa的综合运用知识,因此想写一个简单的登录界面来尝试一下,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 本地jvm执行flink程序带web ui的操作

    本地jvm执行flink程序带web ui的操作

    这篇文章主要介绍了本地jvm执行flink程序带web ui的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 如何解决springboot数据库查询时出现的时区差异问题

    如何解决springboot数据库查询时出现的时区差异问题

    这篇文章主要介绍了如何解决springboot数据库查询时出现的时区差异问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • SpringMVC Controller解析ajax参数过程详解

    SpringMVC Controller解析ajax参数过程详解

    这篇文章主要介绍了SpringMVC Controller解析ajax参数过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java swing 创建一个简单的QQ界面教程

    java swing 创建一个简单的QQ界面教程

    这篇文章主要介绍了java swing 创建一个简单的QQ界面教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java 多线程实现在线咨询(udp)

    java 多线程实现在线咨询(udp)

    这篇文章主要介绍了java 多线程实现在线咨询(udp)的示例,帮助大家更好的理解和学习Java 网络编程的相关内容,感兴趣的朋友可以了解下
    2020-11-11
  • javax.validation自定义日期范围校验注解操作

    javax.validation自定义日期范围校验注解操作

    这篇文章主要介绍了javax.validation自定义日期范围校验注解操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java自定义注解的详解

    Java自定义注解的详解

    这篇文章主要介绍了Java自定义注解的详解的相关资料,Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容,需要的朋友可以参考下
    2017-08-08

最新评论