mysql.mybatis动态sql_MyBatis 动态SQL

动态SQl是MyBatis的强大特性之一,可以完成对SQL语句的动态组装。

比如说传入一个User对象,要根据这个User中的数据查询用户的完整信息:

如果User对象中只有name属性有值,sql语句是:select * from user_tb  where name=#{name}

如果User对象中只有tel属性有值,sql语句是:select * from user_tb where tel=#{tel}

如果User对象的name、tel都有值,sql语句是:select * from user_tb where name=#{name} and tel=#{tel}

有时候sql语句不是一成不变的,要根据传入的数据动态生成要执行的sql语句,动态sql就适合这种情况。

最好将日志的控制台输出级别设置为DEBUG,这样在控台能看到SQL语句。

MyBatis中的动态sql元素

    相当于java中的if,用于单分支的条件判断

、、   相当于java中的switch...case...default,用于多分支的条件判断,从多个选项中选择一个

  循环,常和sql的in语句搭配使用

、、    辅助元素,用于一些处理sql拼装、特殊字符的问题

   从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询

、的使用

SELECT*FROM user_tb

name=#{name}

AND tel=#{tel}

相当于sql语句中的关键字WHERE。

中的test表示条件,条件成立就把元素体中的字符串拼接到sql语句中,否则不拼接。

tel不进行数学运算,使用字符串类型。

中有成立时,才会在sql语句中添加WHERE关键字,否则不添加。

会自动剔除元素体中多余的AND、OR。

比如传入的User对象只设置了tel,拼接的sql语句是:SELECT  *  FROM  user_tb  WHERE  AND  tel=#{tel},会自动剔除多余的AND。

不使用的写法:

SELECT* FROM user_tb WHERE 1=1

AND name=#{name}

AND tel=#{tel}

会自动去掉多余的AND,但不会自动加上缺少的AND,我们通常在每个中都加上AND,防止把AND写掉了。

的使用

可以定制需要的功能,比如使用达到的效果:

SELECT*FROM user_tb

name=#{name}

AND tel=#{tel}

prefix会在这段字符串之前加上指定的前缀,如果里面的都不满足条件,则不加前缀。

prefixOverrides指定要去除的多余的字符串。

、、的使用

有时候我们只需要从多个选项中选择一个,比如登录教务系统,让你选择角色:数据库管理员、教职工、学生:

SELECT password FROM user_tb WHERE name=#{name}

AND role='admin'

AND role='teacher'

AND role='student'

传入的值是admin、teacher、student,数据库中的role字段也是这几个值,这种传入的值和数据库中存储的值一致的可以直接这样写:

SELECT password FROM user_tb WHERE name=#{name} AND role=#{role}

如果不一致,比如性别,传入的是male、female,数据库中存储的是0、1,就需要使用转换一下。

相当于switch,相当于case,相当于default。

的使用

更新操作传入一个pojo类的对象,但我们并不知道哪些属性是有值的(需要更新的),不能更新全部字段,因为有的字段没有手动赋值,不能用JVM赋的null、0去覆盖数据表中原来的值。

可解决此问题:

UPDATE user_tb

name=#{name},

tel=#{tel},

name=#{name},

where id=#{id}

用于传入pojo类型,更新数据表的多个字段。先判断字段是否有值,有值才更新该字段。

用于更新操作,会自动在这段字符串前面加sql关键字“SET”(里面有为真),并自动去除多余的逗号(一般自己写第一个,然后copy下来改,最后面往往会多一个逗号)。

如果里面的都为假,即没有要更新的字段,不会自动在前面加”SET”,此时这个update语句有语法错误,会报错,所以要保证至少有一个字段需要更新。

test属性的注意点

相等判断:==,!=

逻辑与:只能用and,不能用&&

逻辑或:or、||均可

的使用

用于迭代集合、数组,常配合sql的关键字in使用,用于增删查改的批量操作。

示例:按照手机号随机抽取3位幸运观众(根据手机号码查询用户信息)——批量查。

SELECT*FROM user_tb WHERE tel IN

#{item}

ArrayList telList = new ArrayList<>();

telList.add("110");

telList.add("119");

telList.add("120");

UserMapper mapper= sqlSession.getMapper(UserMapper.class);

List userList =mapper.queryUser(telList);

System.out.println(userList);

collection   要迭代的数据类型,数组=>array,List=>list,Map=>Map的key的数据类型。使用数组容易出错,尽量用List代替数组。

index   本次迭代的下标,指定一个临时变量表示下标

item   本次迭代的元素,指定一个临时变量表示本次迭代的元素

open   拼接这段字符串时以什么开头

close  拼接这段字符串以什么结尾

separator   迭代的元素之间用什么连接(分隔)

collection是必需的,其余均可选。

更严谨的写法:

SELECT*FROM user_tb WHERE tel IN

#{item}

如果传入的是List类型,要使用List对象本身时,约定使用list表示List对象本身。

的使用

模糊查询时可以使用${}连接字符串,但不能防止sql注入。

mysql可以使用concat()连接字符串,oracle可以使用||连接字符串,但只能针对特定的数据库使用,不利于项目移植。

mybatis的元素可以解决以上问题。

SELECT * FROM user_tb WHERE name LIKE #{pattern_name}

定义一个变量,拼接好字符串。

在sql语句中引用该变量的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值