1. mybatis 开启驼峰命名转换
<settings>
<setting name="mapUnderscoreToCamecase" value="true">
</settings>
2.mybatis注解模式配置
MyBatis 注解 SQL 中,最基本的就是@ Select 、@ Insert 、@ Update 和@ Delete四种
@Select ({ ” select id, role name roleName, enabled, create_by createBy, create time createTime ” ” from sys_role ”, ” where id= #{id } ” })
SysRole selectByid(Long id) ;
使用注解方式同样需要考虑表字段和 Java 属性字段映射的问题,
1.使用sql语句的别名实现
2.mapUnderscoreToCamecase在驼峰命名转化模式
3.使用 resultMap 方式
xml中的 resultMap 元素有 个对应的 Java 注解@ Results ,使用这个注解来实现属性 映射,新增 selectByid2 方法,代码如下
@Results({
@Result(property = ” i d ”, column = ” id”, id = true) ,
@Result(property = ” roleName ”, column =”role name ”),
@Result(property =”enabled”, column = ” enabled”),
@Result(property = ” createBy”, column = ” create_by”),
@Result(property = ” createTime”, column = " create_time ”)
} )
@Select (”select id,rolename , enabled, createby , createtime from sys_role where id = #{id )”)
SysRole selectByid2(Long id);
这里的@Result 注解对应着 ML 文件中的<result >元素 ,而参数中写上 id = true 时就对应<id >元素。
使用@ Results 注解的时候,大家可能会担心, 是不是要在每一个方法上都这么写。在 MyBatis 3.3.0 及以前版本中,注解定义的@ Results 不能共用,使用很不方便,确实是要在每 个方法上都写 遍。但从 MyBatis 3.3. 版本开始,@ Results 注解增加了 id 属性,设 置了 id 属性后,就可以通过 id 属性引用同一个@Results 配置了 ,示例代码如下
@Results (id = ” roleResultMap”, value = {
@Result(property = ” id”, column = ” id”, id = true), //其他...
} )
如何引用这个@ Results 呢?新增一个 selectAll 方法,代码如下。
@ResultMap (”roleResultMap”)
@Select("select * from sys_role")
List<Role> selectAll();
使用@ResultMap 注解引用即可,注解的参数值就是上面代码中设置的 id 的值, 当配合 着使用 XML 方式的时候,还可以是 XML中 <resultMap >元素的 id 属性值。
3.动态sql
1.if用法
if 标签有 个必填的属性 test, test 的属性值是一个符合 OGNL 要求的判断表达式,表 达式的结果可以是 tr ue fals ,除此之外所有的非 值都为 true ,只有 false 了方便理解,在表达式中 ,建议只用 true false 作为结果
判断条件 property !=null 或property == null 适用于任何类型的宇段 ,用 于判断属性值是否为空。
判断条件 property ==“ ”或property !=null仅适用于 String 类型的宇段 用于判断是否为空字符串
and 和or 当有多个判断条件时,使用 and和 or 进行连接,嵌 套的判断可以使用小括号分组
对字符串的判断和 Java 中的判断类似,首先需要 判断字段是否为 null ,然后再去判断是否为空(在 OGNL 表达式中 ,这 两个判断的顺序不会 影响判断的结果,也不会有空指针异常)。字符串的判断几乎都包含 null 和空的判断,这两个条件不是必须写在 起,可以根据实际业务决定是否需要空值判断
2.choose用法
if 标签提供了基本的条件判断,但是它无法实现 if. . . else if ... else ... 的逻辑,要想实现这样的逻辑,就需要用到 choose when otherwise 标签。 choose 元素 中包含 when和 otherwise 两个标签,一个 choose 中至少有 when ,有 0个或者1个 otherwise 。
3.where用法
if 条件都不满足的时候, where 元素中没有内容,所以在 SQL 中不会出现 where , 如果 if 条件满足, where 元素的内容就是以 and 开头 的条件, where 会自动去掉开头的 and ,这也能保证 where 条件正确 。这 种情况下生成的 SQL 更干净、更贴切,不会在任何情况下都有 where 1 = 1这样的条件
4.set方法
set 标签的作用:如果该标签包含的元素中有返回值,就插入 set :如果 set 后面的 字符串是 以逗号结尾的,就将这个逗号剔除 。set 标签的用法中 SQL 后面的逗号没有问题了,但是如果 set 元素中没有内容,照样 会出现 SQL 错误,所以为了避免错误产生,类似 id = #{id }这样必然存在的赋值仍然有保留 的必要。从这 点来看, set 标签并没有解决全部的问题,使用时仍然需要注意。
5.trim用法
where set 标签 的功能都可以用 trim 标签来实现,并且在底层就是通过 TrimSqlNode实现的
where 标签对应 trim 的实现如下:
<trim prefix="where" prefixOverrides=”and I or">
。。。。
</trim>
set 标签对应 trim 实现如下:
<trim prefix="set" prefixOverrides=”,">
。。。。
</trim>
trim 标签有如下属性:
prefix :当 trim 元素内包含内容时,会给内容增加 prefix 指定的前缀。
prefixOverrides :当 trim 元素内包含内容时,会把内容中匹配的前缀字符串去掉。
suffix :当 trim 元素内包含内容时,会给内容增加 suffix 指定的后缀。
suffixOverrides :当 trim 元素内包含内容时,会把内容中匹配的后缀字符串去掉。
5.where
collection 必填,值为要选代循环的属性名。这个属性值的情况有很多。
item :变量名,值为从法代对象中取出的每一个值。
index :索引的属性名,在集合数组情况下值为当前索引值 当选代循环的对象是 Map 类型时,这个值为 Map key (键值)。 open:整个循环内容开头的字符串
close 整个循环内容结尾的字符串。
separator :每次循环的分隔符
当结算类型为map时:
当参数是 Map 类型的时候, foreach 标签的index 属性值对应的不是索引值,而是 Map 中的 key ,利用这个 key 可以实现动态 UPDATE
<update id="update">
update sys_role set
<foreach collection="_parameter" item="val" index="key" separator=",">
${key}=#{val}
</foreach>
where id= #{id}
</update>
这里的 key 作为列 ,对应的值作为该列的值 通过 foreach 将需要更新的字段拼接在 SQL 语句中。
6.bind 标签
bind 标签可以使用 OGNL 表达式创建一个变量井将其绑定到上下文中。
<bind name="userNameLike" value=" ' %'+userName+ ' %' ">
and userName like #{userNameLike}
bind 标签的两个属性都是必选项, name 为绑定到上下文的变量名, value OGNL 达式。创建一个 bind 标签的变量后 就可以在下面直接使用,使用 bind 拼接字符串不仅可以避免因更换数据库而修改 SQL ,也能预防止SQL 注入。