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

相关文章

  • jeefast和Mybatis实现三级联动的示例代码

    jeefast和Mybatis实现三级联动的示例代码

    这篇文章主要介绍了jeefast和Mybatis实现三级联动的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java contains用法示例

    Java contains用法示例

    这篇文章主要介绍了Java contains的用法示例,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-11-11
  • Java最简单的DES加密算法实现案例

    Java最简单的DES加密算法实现案例

    下面小编就为大家带来一篇Java最简单的DES加密算法实现案例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java实现时间戳转代码运行时长

    Java实现时间戳转代码运行时长

    这篇文章主要为大家详细介绍了如何使用Java实现时间戳转代码运行时长功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-06-06
  • 深入浅出的学习Java ThreadLocal

    深入浅出的学习Java ThreadLocal

    本文会基于实际场景介绍ThreadLocal如何使用以及内部实现机制。 具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java C++算法题解leetcode801使序列递增的最小交换次数

    Java C++算法题解leetcode801使序列递增的最小交换次数

    这篇文章主要为大家介绍了Java C++题解leetcode801使序列递增的最小交换次数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Java精确计算BigDecimal类详解

    Java精确计算BigDecimal类详解

    这篇文章主要介绍了Java精确计算BigDecimal类的使用方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 简单了解Spring Bean常用注解的装配

    简单了解Spring Bean常用注解的装配

    这篇文章主要介绍了简单了解Spring Bean常用注解的装配,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • jdk7 中HashMap的知识点总结

    jdk7 中HashMap的知识点总结

    HashMap的原理是老生常谈了,不作仔细解说。一句话概括为HashMap是一个散列表,它存储的内容是键值对(key-value)映射。这篇文章主要总结了关于jdk7 中HashMap的知识点,需要的朋友可以参考借鉴,一起来看看吧。
    2017-01-01
  • spring+srpingmvc+hibernate实现动态ztree生成树状图效果

    spring+srpingmvc+hibernate实现动态ztree生成树状图效果

    这篇文章主要介绍了spring+srpingmvc+hibernate动态ztree生成树状图效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11

最新评论