MyBatis框架的使用解析!数据库相关API的基本介绍
动态SQL
if
- 根据条件包含where子句的一部分
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = 'ACTIVE'
<where>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
- 紧接着 < where > 的第一个条件不要加AND
choose-when-otherwise
- 不使用所有的条件,只是想从多个条件中选择一个使用
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = 'ACTIVE'
<choose>
<when tset="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
where
- where元素只会在子元素返回内容的情况下才会插入WHRER的子语句
- 若子语句的开头为AND或者OR,where元素会将这些去除
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
trim
- 可以通过自定义trim元素来定制where元素的功能
- 比如和where元素等价的自定义trim元素.会移除所有prefixOverrides属性中指定的内容,并且插入prefix属性中指定的内容:
<trim prefix="WHERE" prefixOverrides="AND |OR">
...
</trim>
prefixOverrides属性会忽略通过管道符分割的文本序列 ,不同的文本序列之间必须要有空格.
- 和set元素等价的自定义trim元素. 覆盖了后缀值设置,并且自定义前缀值:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
set
- 用于动态更新语句的叫作set
- set元素可以用于动态包含需要更新的列,忽略不更新的列
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">
username = #{username},
</if>
<if test="password != null">
password = #{password},
</if>
<if test="email != null">
email = #{email},
</if>
<if test="bio != null">
bio = #{bio}
</if>
</set>
where id = #{id}
</update>
- set元素会动态地进行行首插入SET关键字,并会删掉额外的逗号,这些逗号是在使用条件语句给列赋值时引入的
foreach
- 对集合进行遍历的时候使用foreach, 特别是在构建IN条件语句的时候
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST p
WHERE ID IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
- foreach允许指定一个集合:
- 声明可以在元素体内使用的集合项item和索引index变量
- 指定开头open与结尾close的字符串以及集合项迭代之间的分隔符separator
- foreach不会错误地添加多余的分隔符
- 使用foreach时:
- 可以将任何可迭代对象,比如List,Set,Map对象或者数组对象作为集合参数传递给foreach
- 当使用可迭代对象或者数组时:
- index是当前迭代的序号
- item的值是本次迭代获取到的元素
- 当使用Map对象或者Map.Entry对象的集合
- index是键
- item是值
script
- 要是想要在带注解的接口类中使用动态SQL语句,可以使用script元素
@update({"<script>",
"update Author",
"<set>",
"<if test='username != null'>username=#{username},</if>",
"<if test='password != null'>password=#{password},</if>",
"<if test='email != null'>email=#{email},</if>",
"</set>",
"where id=#{id}",
"</script>"})
})
void updateAuthorValues(Author author);
bind
- 可以使用bind元素在OGNL表达式以外创建一个变量,并绑定到上下文中
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>
多数据库支持
- 如果配置了databaseIdProvider, 就可以在动态代码中使用名为 "_databaseId" 的变量来为不同的数据库构建特定的语句
<insert id="insert">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
<if test="_databaseId == 'oracle'">
select seq_users.nextval from dual
</if>
<if test="_databaseId == 'db2'">
select nextval for seq_users from sysibm.sysdummy1
</if>
</selectKey>
insert into users values (#{id}, #{name})
</insert>
动态SQL中插入脚本语言
- MyBatis 3.2版本开始支持插入脚本语言
- 允许插入一种语言驱动,并基于这种语言来编写动态SQL查询语句
- 通过实现LanguageDriver接口插入语言:
public interface LanguageDriver {
ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType);
SqlSource crateSqlSource(Configuration configuration, String script, Class<?> parameterType);
}
- 实现自定义语言驱动后,可以在mybatis-config.xml文件中设置为默认语言:
<typeAliases>
<typeAliase type="com.oxford.MyLanguageDriver" alias="myLanguage" />
</typeAliases>
<settings>
<setting name="defaultScriptingLanguage" value="myLanguage" />
</settings>
- 也可以使用lang属性为特定的语句指定语言:
<select id="selectBlog" lang="myLanguage">
SELECT * FROM BLOG
</select>
- 或者在mapper接口上使用 @Lang注解:
public interface Mapper {
@Lang(MyLanguageDriver.class)
@Select("SELECT * FROM BLOG")
List<Blog> selectBlog();
}
- MyBatis中的xml文件中的所有xml标签都由默认MyBatis语言提供,是由语言驱动org.apache.ibatis.scripting.xmltags.XmlLanguageDriver, 别名为xml. 提供的.
Java API
- MyBatis的执行方法在SqlSession类中
语句执行方法
- 这些方法被用来执行定义在SQL映射XML文件中的SELECT,INSERT,UPDATE和DELETE语句
- 每一个方法都接收语句的ID以及参数对象
- 参数可以是原始类型(支持自动装箱),包装类,JavaBean,POJO或者Map
selectOne
<T> T selectOne(String statement, Object parameter);
selectList
<E> List<E> selectList(String statement, Object parameter);
- selectOne和selectList的不同点是:
- selectOne必须返回一个对象或者null值, 如果返回值多于一个就会抛出异常
- 如果不清楚返回对象会有多少个,就使用selectList
selectCursor
<T> Cursor<T> selectCursor(String statement, Object parameter);
- 游标Cursor与列表List返回的结果相同,不同的是: 游标借助迭代器实现了数据的惰性加载
try (Cursor<Entity> entities = session.selectCursor(statement, param)) {
for (Entity entity : entities) {
// 处理单个实体
}
}
selectMap
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey);
- selectMap会将返回对象的其中一个属性作为key值,将对象作为value值,从而将多个结果集转为Map类型值
insert
int insert(String statement, Object parameter);
update
int update(String statement, Object parameter);
delete
int delete(String statement, Obejct parameter);
- 如果需要查看某个对象是否存在, 最好的办法就是查询一个count值,使用0或者1
- 由于不是所有语句都需要参数,所以这些方法都具有一个不需要参数的重载形式
- insert, update 和delete方法返回值表示受该语句影响的行数
select高级版本
- 允许限制返回行数的范围
- 提供自定义结果处理逻辑
- 通常是在数据集非常庞大的情形下使用
selectList
<E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);
selectCursor
<T> List<T> selectCursor(String statement, Object parameter, RowBounds rowBounds);
selectMap
<K, V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
select
void select(String statement, Object parameter, ResultHandler<T> handler);
select
void select(String statement Object parameter, RowBounds rowBounds, ResultHandler<T> handler);
- RowBounds参数:
- 指定MyBatis略过指定数量的记录,并限制返回结果的数量
- RowBounds类的offset和limit值只有在构造函数时才能传入,其他时候是不能修改的
int offset = 100;
int limit = 25;
RowBounds rowBounds = new RowBounds(offset, limit);
- ResultHandler参数:
- 允许自定义每行结果的处理过程
- 可以添加到List中,创建Map和Set. 甚至丢弃每个返回值,只保留计算后的统计结果
- ResultHandler接口:
package org.apache.ibatis.session;
public interface ResultHandler<T> {
void handlerResult(ResultContext<? extends T> context);
}
- ResultContext参数:
- 允许访问结果对象和当前已被创建的对象数目
- 提供一个返回值为Boolean的stop方法,可以使用这个stop方法来停止MyBatis加载更多的结果
- 使用ResultHandler要注意两条限制:
- 使用带ResultHandler参数的方法时,收到的数据不会被缓存
- 当使用高级的结果映射集resultMap时 ,MyBatis很可能需要数行结果来构造一个对象.如果这时使用了ResultHandler, 可能会接收到关联association或者集合collection中尚未被完整填充的对象
清除批量更新方法
- 当ExecutorType设置为ExecutorType.BATCH时,可以使用flushStatements清除缓存在JDBC驱动类中的批量更新语句
flushStatements
List<BatchResult> flushStatements();
事务控制方法
- 控制事务作用域的方法有四个,如果已经设置了自动提交或者使用了外部事务管理器, 就不需要使用这些方法
- 如果正在使用Connection实例控制的JDBC事务管理器,就可以使用以下的四个方法:
void commit();
void commit(boolean force);
void rollback();
void rollback(boolean force);
- 默认情况下 ,MyBatis不会自动提交事务,除非发现到调用了插入,更新或删除方法改变了数据库
- 如果没有使用这些方法提交修改,那么就可以在commit和rollback方法参数传入true值来保证事务被正常提交
- 注意: 在自动提交模式或者使用了外部事务管理器的情况下,设置force值对session无效
- 大部分情况下,无需调用rollback(), 因为MyBatis会在没有调用commit() 时完成回滚操作
- 但是,当要在一个可能多次提交或回滚的session中详细控制事务,就要使用到回滚rollback操作
MyBatis框架的使用解析!数据库相关API的基本介绍的更多相关文章
- mybatis框架-SqlSession会话操作数据库的两种方式
1.通过SqlSession实力来直接执行已经映射的sql语句 例如,查询整个用户表中的信息 在UserMapper.xml中编写sql语句 编写测试方法: 注意:这里使用的selectList方法: ...
- cocos2dx中关于Action动作的相关API的具体介绍
//CCMoveBy 创建一个移动的动作 //參数1:移动到目标坐标所需的时间 //參数2:目标坐标 //支持reverse 能够获取其反向动作 //CCMoveTo 一样的 //CCAct ...
- MyBatis框架知识整理
MyBatis框架 一.介绍: MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]! 和数据库打交道的技术有: 原生的JDBC技术---> Spring ...
- 初识Mybatis框架
mybatis框架 主要是对数据库进行操作的 编写sql语句 使我们对数据库的crud操作更加简洁方便!! 1.使用mybatis框架 进行第一个项目 查询数据库 并返回数据 :(简单) (1)搭建 ...
- 01 mybatis框架整体概况(2018.7.10)-
01 mybatis框架整体概况(2018.7.10)- F:\廖雪峰 JavaEE 企业级分布式高级架构师课程\廖雪峰JavaEE一期\第一课(2018.7.10) maven用的是3.39的版本 ...
- SpringBoot框架与MyBatis集成,连接Mysql数据库
SpringBoot是一种用来简化新Spring应用初始搭建及开发过程的框架,它使用特定方式来进行配置,使得开发人员不再需要定义样板化的配置.MyBatis是一个支持普通SQL查询.存储和高级映射的持 ...
- mybatis框架下物理分页的实现(整个工程采用的是springmvc、spring、mybatis框架,数据库是mysql数据库)
(一)关于分页拦截器的简单理解 首先,要开发MyBatis的插件需要实现org.apache.ibatis.plugin.Interceptor接口,这个接口将会要求实现几个方法:intercept( ...
- 在Abp框架中使用Mysql数据库的方法以及相关问题小记
最近发现了一款DDD的框架 看起来不错,据说挺流弊的 刚好最近要弄点小东西,拿来试试也不错 苦于穷逼买不起高配服务器,只好装mysql数据库了 下面说下如何在该框架下使用Mysql数据库 打开项目后, ...
- mybatis框架入门程序:演示通过mybatis实现数据库的查询操作
我们现在工程基于的数据库见“https://www.cnblogs.com/wyhluckdog/p/10147754.html”这篇博文. 1.mybatis下载 mybatis的代码由githua ...
随机推荐
- Ansible_管理机密
一.Ansible Vault 1.什么是Ansible Vault Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件 若要使用Ansible Va ...
- 039.Python使用TCP实现多用户并发
使用TCP实现多用户并发 在前面的实验中,TCP建立连接时,只能允许一个用户连接,当第二个用户建立连接时,发送的信息,服务端是没有办法接受,只有当第一个用户退出时,才能接受到第二个用户的请求,并实现通 ...
- Linux进阶之find命令、xshell速度慢的解决和Linux警告音的关闭
一.Linux警告音关闭方法 1. 修改/etc/inputrc配置文件 set bell-style none #取消该行注释 2. 修改~/.bashrc配置文件 在后面增加: setter ...
- 按时按登录IP记录Linux所有用户操作日志的方法
背景:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...
- linux命令--使用fsck修复文件系统
使用fsck修复文件系统错误 1.问题描述 服务器maint_samba 由于服务器maint_samba (debian操作系统)没有正常关机,在重新启动过程中/dev/sdb1出现文件系统错误,需 ...
- 学习Git的一些总结
Git是以后公司工作必不可少的,所以早点了解使用它是很有必要的 一般国外的开源是GitHub 国内的是码云Gitee 至于git的安装教程,这里就不啰嗦啦,面向百度即可,安装完成鼠标右键会多几个选项: ...
- 处理SpringMVC中遇到的乱码问题
乱码在日常开发写代码中是非常常见的,以前乱码使用的是通过设置一个过滤器解决, 现在可以使用SpringMVC给提供的过滤器,在web.xml设置,这比我们自己写的过滤器强大的的多. 注意:每次修改了x ...
- 痞子衡嵌入式:串行NAND Flash的两大特性导致其在i.MXRT FlexSPI下无法XiP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串行NAND Flash的两大特性导致其在i.MXRT FlexSPI下无法XiP. 在嵌入式世界里,当我们提起XiP设备(支持代码原地 ...
- Deep Learning部署TVM Golang运行时Runtime
Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型.TVM支持来自Te ...
- Jittor框架API
Jittor框架API 这里是Jittor主模块的API文档,可以通过import jittor来获取该模块. classjittor.ExitHooks exc_handler(exc_type, ...