Mybatis
#{}和${}和区别
#{}:
- mybatis在处理的时候会将#{username} 处理成?,用于参数传递时占位
- 当传入的参数是字符串时,会自动加上''将传递的值括起来
- mapper接口方法中的参数与xml文件中是按照参数位置索引对应的,不是根据参数的名称,但是建议最好一致。
${}:
- 字符串拼接
- mapper接口方法中的参数与xml文件中是按照参数位置索引对应的,不是根据参数的名称,但是建议最好一致。
- mybatis在处理的时候会直接拼接在传递的sql上,不会生成占位的?
- 可以用于创建统一的方法,比如对所有表按照id查询。
- select * from ${tableName} where id = #{id} -----> mybatis操作后:select * from student where id = '7dsj'
mybatis获取方法参数
单值:
- 可以通过#{}或${}中间可以是任意名称,但是需要注意${}的具体使用场景。
多个单值:
- mybatis会将所有参数放在一个map中,以两种方式存储
- 以arg0,arg1...为键,参数为值。
- 以param1,param2...为键,参数为值。
- 两种方式目前看来只有索引位起始有差异
- 还是通过#{}或${}以键来访问对应的值
Map(对象同理,只不过获取的是属性):
- 通过#{}或${}以map中的键的方式来获取值
@Param注解
- 命名参数
- 实际上取代了arg0,arg1,...的访问方式,将其名称改为了注解里设置的值,还是可以继续用param1,param2,...
总结:
- 其实一共可以归结为2种情况
- 传递的参数是对象或者Map时,或者值时就用属性名
- 其他情况可以用@Param注解来指定
动态SQL
if:
<if test = "属性名 != null and 属性名 != ''">
字段名 = #{属性名}
</if>
注意:and的问题
where:用来解决没有条件时,忽略where和解决拼接时产生的多余and或者or等此类的情况(只能去掉前面的and或or)
<wherr>
</where>
trim:
- prefix | suffix 将trim标签中内容前面或后面添加指定内容
- prefixOverrides | suffixOverrides 将trim标签中内容前面或者后面的指定内容去掉
- 若标签中没有内容,trim标签也不会起作用,where也不会生成
<trim prefix = "where" suffixOverrides = "and | or">
</trim>
choose、when、otherwise:相当于if...else if...else
<where>
<choose>
<when test = "属性名 != null and 属性名 != ''">
字段名 = #{属性名}
</when>
<when test = "属性名 != null and 属性名 != ''">
字段名 = #{属性名}
</when>
...
<otherwise>
字段名 = xxxx
</otherwise>
</choose>
</where>
foreach:
- collection 集合类型
- 数组用array或者arg0,如果使用@Param指定了名称,也可用自定义的名称
- list用arg0、collection、list。如果使用@Param指定了名称,也可用自定义的名称
- item 循环遍历时的变量名称
- separator 循环体之间的分隔符
- open 内容的开始符号
- close 内容的结束符号
<foreach collection = "array" item = "id" separator = "," open = "(" close = ")">
#{id}
</foreach>
<foreach collection = "list" item = "emp" separator = ",">
(#{emp.name},#{emp.age},#{emp.sex})
</foreach>
sql:
- 用来提取公共常用条件,比如经常查询的字段
- 定义:<sql id = "commonSelect">id,name,sex,address</sql>
- 使用:<include refid = "commonSelect"></include>