[mybatis]Mybatis 数据处理
Mybatis 数据处理
1.mybatis 动态SQL
动态SQL包含以下关键字
-
if 判断
-
choose (when, otherwise) 判断
-
trim (where, set) 去空格
-
foreach 循环
-
If
动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。 -
choose, when, otherwise
有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。 -
where标签
在我们拼接Mybatis的SQL的时候往往都会有对where条件的非空判断。如果where后的第一个条件为空,或者不满足第一个条件时,会出现where and...的情况,这会报错,mybatis未解决这样的问题提供了一个标签 即where 标签
where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。
- Trim 标签
trim 属性
prefix:前缀覆盖并增加其内容
suffix:后缀覆盖并增加其内容
prefixOverrides:前缀判断的条件
suffixOverrides:后缀判断的条件
例子:
- set标签
set 元素可以被用于动态包含需要更新的列,而舍去其他的。
update Author
where id=#{id}
这里,set 元素会动态前置 SET 关键字,同时也会消除无关的逗号,因为用了条件语句之后很可能就会在生成的赋值语句的后面留下这些逗号。
若你对等价的自定义 trim 元素的样子感兴趣,那这就应该是它的真面目:
...
- foreach
动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候
- bind
bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:
- Multi-db vendor support
一个配置了“_databaseId”变量的 databaseIdProvider 对于动态代码来说是可用的,这样就可以根据不同的数据库厂商构建特定的语句。
select seq_users.nextval from dual
select nextval for seq_users from sysibm.sysdummy1"
insert into users values (#{id}, #{name})
Spring继承mybatis的配置
- 动态 SQL 中可插拔的脚本语言
MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动(language driver)之后来写基于这种语言的动态 SQL 查询。
可以通过实现下面接口的方式来插入一种语言:
public interface LanguageDriver {
ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
SqlSource createSqlSource(Configuration configuration, XNode script, Class parameterType);
SqlSource createSqlSource(Configuration configuration, String script, Class parameterType);
}
一旦有了自定义的语言驱动,你就可以在 mybatis-config.xml 文件中将它设置为默认语言:
除了设置默认语言,你也可以针对特殊的语句指定特定语言,这可以通过如下的 lang 属性来完成:
或者在你正在使用的映射中加上注解 @Lang 来完成:
public interface Mapper {
@Lang(MyLanguageDriver.class)
@Select("SELECT * FROM BLOG")
List
}
注意 可以将 Apache Velocity 作为动态语言来使用,更多细节请参考 MyBatis-Velocity 项目。
你前面看到的所有 xml 标签都是默认 MyBatis 语言提供的,它是由别名为 xml 语言驱动器 org.apache.ibatis.scripting.xmltags.XmlLanguageDriver 驱动的。
2.Mybatis插入
-
普通数据插入
SELECT LAST_INSERT_ID() AS id
insert into category (name_zh, parent_id,
show_order, delete_status, description
)
values (
#{nameZh,jdbcType=VARCHAR},
#{parentId,jdbcType=SMALLINT},
#{showOrder,jdbcType=SMALLINT},
#{deleteStatus,jdbcType=BIT},
#{description,jdbcType=VARCHAR}
)
-
批量插入
SELECT
LAST_INSERT_ID()
insert into t_train_record (add_time,emp_id,activity_id,flag)
values
(#{item.addTime},#{item.empId},#{item.activityId},#{item.flag})
这里selectKey中order属性的值 Mysql数据库设置成Before Oracle设置成After
3.Mybatis修改
UPDATE STUDENT SET name = "5566" WHERE id IN
#{item}
4.Mybatis删除
DELETE FROM STUDENT WHERE id IN
#{item}

浙公网安备 33010602011771号