mybatis plus使用 in 语句

记录一下使用mybatis plus 查询时使用in关键字的坑

@Select({"<script>",
        "SELECT round( ifnull( sum( cny_pirce ), 0 ), 2 ) AS total",
        "FROM `data` WHERE id IN ",
        "<foreach item='item' index='index' collection='dataIdListStr' open='(' separator=',' close=')'>",
        "#{item}",
        "</foreach>",
        "</script>"
})
Double getCurrentOrderFee(@Param("dataIdListStr") Integer[] dataIdList);
### 调用存储过程的方式 MyBatis-PlusMyBatis 的增强工具包,支持多种数据库操作功能。虽然它本身并未提供直接执行 `CALL` 语句的功能,但可以通过自定义 SQL 或者继承 `BaseMapper` 接口来实现调用存储过程的需求。 以下是通过 MyBatis-Plus 实现调用存储过程的具体方法: #### 方法一:使用注解方式 可以在 Mapper 接口中通过 `@Select` 注解或者 `@Options` 配置手动编写 SQL 来调用存储过程[^4]。例如: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; public interface UserMapper extends BaseMapper<User> { @Select("{call your_procedure_name(#{param1}, #{param2})}") void callProcedure(@Param("param1") String param1, @Param("param2") Integer param2); } ``` 上述代码中,`your_procedure_name` 替换为实际的存储过程名称,参数列表也需要根据实际情况调整。 --- #### 方法二:XML 文件配置 如果存储过程较为复杂,建议在 XML 映射文件中定义 SQL 片段并绑定到接口上。例如,在 Mapper 接口中声明如下方法: ```java void callComplexProcedure(String inputParameter, Integer outputParameter); ``` 对应的 XML 文件内容可能类似于以下形式: ```xml <mapper namespace="com.example.mp.mappers.UserMapper"> <select id="callComplexProcedure" statementType="CALLABLE"> {call complex_procedure( #{inputParameter,jdbcType=VARCHAR}, #{outputParameter,jdbcType=INTEGER,mode=OUT} )} </select> </mapper> ``` 注意这里的 `statementType="CALLABLE"` 表明这是一个可调用的存储过程。 --- #### 方法三:利用 JdbcTemplate 结合 MyBatis-Plus 对于更复杂的场景,也可以借助 Spring 提供的 `JdbcTemplate` 工具完成存储过程调用。这种方式适用于需要灵活处理输入输出参数的情况。例如: ```java import org.springframework.jdbc.core.CallableStatementCreator; import org.springframework.jdbc.core.JdbcTemplate; import java.sql.Types; public class ProcedureService { private final JdbcTemplate jdbcTemplate; public ProcedureService(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public int executeStoredProcedure(String inputValue) { return jdbcTemplate.execute((CallableStatementCreator) con -> { var cs = con.prepareCall("{call stored_procedure(?)}"); cs.setString(1, inputValue); // 设置 IN 参数 return cs; }, (cs) -> { cs.execute(); return cs.getInt(1); // 获取 OUT 参数 }); } } ``` 此方法适合于需要高度定制化逻辑的应用程序环境。 --- ### 注意事项 1. 存储过程中涉及的表结构应与 MyBatis-Plus 中映射的实体类保持一致。 2. 如果存储过程返回的结果集较大,则需考虑分页查询或其他优化手段以减少内存占用。 3. 对于全局配置项(如逻辑删除),仍可通过标准配置文件设置相关选项[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐州蔡徐坤

又要到饭了兄弟们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值