参数
占位符
#{}
:底层使用PreparedStatement
特点: 先进行SQL语句的编译,然后给SQL语句的占位符问号?传值。可以避免SQL注入的风险.会自动在内容外添加''
传参数时,传单个参数是#{}
里面的内容无所谓,传输多个参数时如两个参数会将参数封装成map
,每个参数会对应两个项,arg0 | param1
,arg从0开始,param从1开始,顺序为接口中的参数从左至右(不推荐)
第二种方式,在接口方法中只用 @param
注解为参数进行一个命名,那么就可以在#{}
中书写进行命名的名称
注意:当使用注解的方式的时候,
arg
将会失效,只能使用param
的方式
${}
:底层使用Statement。
特点: 先进行SQL语句的拼接,然后再对SQL语句进行编译。存在SQL注入的风险。不会自动在内容外添加'',一般在需要可变关键字或分表表名拼接时使用,但要注意关键字是由前端固定,不能由用户输入,以防止sql注入发生
Map集合传值
使用map集合给sql语句的占位符传值,{}
中填写字段名或者其他标识符,与map中的key对应
调用sql语句的方法中传入两个参数,第一个为sql语句id,第二个为map集合,key为字段名,value为字段值,若没有该字段则会读取null
key定义要语义化,做到见名知意
普通类传值
{}
中填写普通类中的属性名
调用sql语句的方法中传入两个参数,第一个为sql语句id,第二个为pojo类对象
实际是mybatis使用反射查找 get属性的方法,若没有get方法或者说是get方法的名字跟属性名不对应会出异常
select语句需要添加返回结果类型,或者结果集中存放的数据类型
注:select查询 若table的字段名和返回类型中的属性名不同则不会进行数据存放,得到的属性为null —— 解决可以使用别名 将字段名和属性名不同的 在sql语句中使用as将属性名当作别名