mybatis基本操作
Posted gonghaiyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis基本操作相关的知识,希望对你有一定的参考价值。
连接池
我们在实际开发中都会使用连接池。因为它可以减少我们获取连接所消耗的时间。
Mybatis中的连接池
我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自己的连接池技术。在 Mybatis 的 SqlMapConfig.xml 配置文件中, 通过来实现 Mybatis 中连接池的配置。
Mybatis连接池的分类
在 Mybatis 中我们将它的数据源 dataSource 分为以下几类:
可以看出 Mybatis 将它自己的数据源分为三类:
具体结构如下:
相应地, MyBatis 内部分别定义了实现了 java.sql.DataSource 接口的 UnpooledDataSource,PooledDataSource 类来表示 UNPOOLED、 POOLED 类型的数据源。
POOLED连接池
autoCommit
mybatis中的动态sql语句
if标签
注意:标签的test属性中写的是对象的属性名,如果是包装类的对象要使用OGNL表达式的写法。另外要注意where 1=1的作用。
where标签
可以自动处理第一个and。
foreach标签
SQL 语句: select 字段from user where id in (?)
标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
<include refid="defaultUser"></include>
<where>
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
SQL标签
其中标签的 refid 属性的值就是 标签定义 id的取值。
注意:如果引用其它 mapper.xml 的 sql 片段,则在引用时需要加上 namespace,如下:
<include refid="namespace.sql 片段”/>
Mybatis延迟加载
修改IAccountDao映射文件
启动select指向IUserDao中的映射文件,如下标红的部分
在主配置文件中添加标签,开启延迟加载
Mybatis缓存
一级缓存
它指的是Mybatis中SqlSession对象的缓存。当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中
查询是否有,有的话直接拿出来用。
当SqlSession对象消失时,mybatis的一级缓存也就消失了。
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方
法时,就会清空一级缓存。
二级缓存
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存的使用步骤
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在select标签中配置)
mybatis注解使用
- 引入依赖。
- 创建实体类User
- 创建IUserDao接口
- 准备主配置文件,如下:
- 测试。
- 执行分析 对比配置进行分析。
注意,如果同时存在规范路径下的映射文件和注解,解析的会混乱。只能一个类要么全部是注解,要么全部是映射文件。项目中到底是用注释好还是映射文件好,这个没有定论。但基于注解是趋势,个人觉得在简单的查询中用注解,在比较复杂的SQL中使用映射文件的方式。
Mybatis使用注意事项
- 使用Integer,BigDecimal类型时,如果没有查出来就为null。可以通过数据库函数IFNULL(xx,0)来解决,也可以通过下面的方式来解决。
BigDecimal validQuato = xdCreditResultMapper.getClientEffectiveCreditResult(TCLDict.SXZT_ACTIVE, tranDate)
if(validQuato != null){
xxx
}
- 当使用List、Map类时。如果没查到,则返回List对象,且size等于0。
List<Base> list = userDao.queryOrders(queryParams);
logger.info("query result list size:" + (null == list ? "空" : list.size()));
当输入查询条件,queryOrders没有查询结果时,控制台打印出的信息:
2019-02-19 15:07:24,003 INFO(PurchasingRemoteSerciceImpl.java:123) - query result list size:0
- 普通javabean
普通类不会执行new语句,直接赋值。所以如果查不到数据时返回null。
以上是关于mybatis基本操作的主要内容,如果未能解决你的问题,请参考以下文章
SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper