本篇文章为你整理了SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案()的详细内容,包含有 SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案,希望能帮助你了解 SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案。
@Select(" script select * from user if test=\"id !=null \" where id = #{id} /if /script ")
public List User findUserById(User user);
3、在方法中构建SQL
Dao层接口不写实现,次数使用内部类来生成动态SQL,并传入 @SelectProvider 注释
增改删也有对应的 @InsertProvider、@UpdateProvider、@DeleteProvider 注释
相比于脚本SQL更加清晰,比较直观,但是如果SQL过长的话,拼接会非常麻烦
//使用UserDaoProvider类的findUserById方法来生成sql
@SelectProvider(type = UserDaoProvider.class, method = "findUserById")
public List User findUserById(User user);
class UserDaoProvider {
public String findUserById(User user) {
String sql = "SELECT * FROM user";
if(user.getId()!=null){
sql += " where id = #{id}";
return sql;
4、结构化SQL
SELECT:表示要查询的字段,如果一行写不完,可以在第二行再写一个SELECT,这两个SELECT会智能的进行合并而不会重复
FROM 和 WHERE:跟SELECT一样,可以写多个参数,也可以在多行重复使用,最终会智能合并而不会报错。
这样语句适用于写很长的SQL时,能够保证SQL结构清楚。便于维护,可读性高。
但是这种自动生成的SQL和HIBERNATE一样,在实现一些复杂语句的SQL时会束手无策。所以需要根据现实场景,来考虑使用哪一种动态SQL
上面的例子只是最基本的用法:更多详细用法,可以参考mybatis中文网的专门介绍:
http://www.mybatis.org/mybatis-3/zh/statement-builders.html
//使用UserDaoProvider类的findUserById方法来生成sql
@SelectProvider(type = UserDaoProvider.class, method = "findUserById")
public List User findUserById(User user);
public String findUserById(User user) {
return new SQL(){{
SELECT("id,name");
SELECT("other");
FROM("user");
if(user.getId()!=null){
WHERE("id = #{id}");
if(user.getName()!=null){
WHERE("name = #{name}");
//从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接
}}.toString();
关于动态SQL的List传值错误问题
动态SQL中,有时要对批量数据进行处理,难免会使用list做为参数
1、错误代码
这是一个最简单的list传参,但是在运行时会报传参错误。
这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是 key/value结构的list时,mybatis会自己把它转换成key/value结构,key就是他的名字"list",value就是他的值 list 对象
@SelectProvider(type = UserDaoProvider.class, method = "find")
public List Map find(List list);
class UserDaoProvider {
public String find(List list) {
2、解决错误
要正确传参需要使用key/value结构的map,如下:
@SelectProvider(type = UserDaoProvider.class, method = "find")
public List Map find(List list);
class UserDaoProvider {
public String find(Map map) {
List list = (List) map.get("list");
以上就是SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案()的详细内容,想要了解更多 SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。