myBatis 日记
一级缓存默认开启, 有效范围是在当前sqlsession,
同一个SqlSession对象执行相同的sql并参数也要相同,缓存才有效。
在同一个会话里面,多次执行相同的SQL 语句,会直接从内存取到缓存的结果
一级缓存不足: 使用一级缓存的时候,因为缓存不能跨会话共享,不同的会话之间对于相同的数据可能有不一样的缓存。在有多个会话或者分布式环境下,会存在脏数据的问题。
二级缓存的有效方范围是 Mapper(NameSpace), 多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。
注入的单例 SqlSessionTemplate 内部包含SqlSessionProxy对象, 对每次SqlsessionTemplate的调用被代理为新创建的sqlsession的调用,所以sqlsessiontemplate每次调用都会有一个新的session生成.
SqlSession 持有了一个Executor 对象,用来封装对数据库的操作。
SqlSession 持有了一个Configuration对象,用来保存所有配置信息。
二级缓存范围更广,工作在SqlSession外部(如果启动二级缓存, myBatis在创建Executor时会自动对Executor进行装饰, 装饰器就是CacheingExecutor),而一级缓存存在于sqlsession内层, 所以一级缓存存在于二级缓存之前,
Mybatis基本框架
SimpleExecutor, ReuseExecutor, BatchExecutor 区别
SimpleExecutor:每执行一次update 或select,就开启一个Statement 对象,用完立刻关闭Statement 对象。
ReuseExecutor:执行update 或select,以sql 作为key 查找Statement 对象,存在就使用,不存在就创建,用完后,不关闭Statement 对象,而是放置于Map 内,供下一次使用。简言之,就是重复使用Statement 对象。
BatchExecutor:执行update(没有select,JDBC 批处理不支持select),将所有sql 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement 对象,每个Statement 对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC 批处理相同。
获得Mapper 对象的过程,实质上是获取了一个MapperProxy 的代理对象。
MapperProxy 中有sqlSession、mapperInterface、methodCache。
MapperProxy执行过程
org.apache.ibatis.binding.MapperProxy#invoke
org.apache.ibatis.binding.MapperMethod#execute
org.apache.ibatis.binding.MapperMethod#executeForMany
org.apache.ibatis.session.SqlSession#selectList
MapperMethod 里面主要有两个属性, 一个是SqlCommand , 一个是MethodSignature,这两个都是MapperMethod 的内部类。
根据不同的type 和返回类型:调用convertArgsToSqlCommandParam()将参数转换为SQL 的参数。调用sqlSession 的insert()、update()、delete()、selectOne ()方法,我们以查询为例,会走到selectOne()方法。
MyBatis设计模式
MyBaits 支持哪些数据源类型
UNPOOLED:不带连接池的数据源。
POOLED : 带连接池的数据源, 在PooledDataSource 中维护PooledConnection。
JNDI:使用容器的数据源,比如Tomcat 配置了C3P0。
自定义数据源:实现DataSourceFactory 接口,返回一个DataSource。
当MyBatis 集成到Spring 中的时候,使用Spring 的数据源。
PooledDataSource 的getConnection()方法流程图:
MyBatis 翻页的几种方式和区别?
逻辑翻页:通过RowBounds 对象。
物理翻页:通过改写SQL 语句,可用插件拦截Executor 实现
MyBatis 集成到Spring 的原理是什么?
SqlSessionTemplate 中有内部类SqlSessionInterceptor 对DefaultSqlSession进行代理;
MapperFactoryBean 继承了SqlSessionDaoSupport 获取
SqlSessionTemplate;接口注册到IOC 容器中的beanClass 是MapperFactoryBean。
为什么SqlSessionTemplate 是线程安全的?
其内部类SqlSessionInterceptor 的invoke()方法中的getSqlSession()方法:
如果当前线程已经有存在的SqlSession 对象,会在ThreadLocal 的容器中拿到SqlSessionHolder,获取DefaultSqlSession。
如果没有,则会new 一个SqlSession,并且绑定到SqlSessionHolder,放到ThreadLocal 中。
SqlSessionTemplate 中在同一个事务中使用同一个SqlSession。
调用closeSqlSession()关闭会话时,如果存在事务,减少holder 的引用计数。否则直接关闭SqlSession。
#和$的区别:
1、是否能防止SQL 注入:$方式不会对符号转义,不能防止SQL 注入
2、性能:$方式没有预编译,不会缓存
1、能用#的地方都用#
2、常量的替换,比如排序条件中的字段名称,不用加单引号,可以使用$
myBatis 日记的更多相关文章
- MyBatis日记(五):一对一关系,一对多关系
一对一关系: 首先在数据库中新增地址表(t_address)用于存储人员的地址信息: CREATE TABLE `t_address` ( `id` ) NOT NULL AUTO_INCREMENT ...
- MyBatis日记(四):MyBatis——insert、update、delete、select
MyBatis简单增删改查操作,此处所做操作,皆是在之前创建的MyBatis的Hello world的工程基础上所做操作. 首先在接口文件(personMapper.java)中,添加操作方法: pa ...
- Mybatis日记
SqlSession build: ExecutorType :SIMPLE ,REUSE, BATCH, SIMPLE 为默认执行器: REUSE 为可重用执行器,重用Statement,执行器会缓 ...
- mybatis日记配置Log4j
拷贝log4j-1.2.16.jar到项目lib下 方式一是在src下新建一个log4j.xml文件,其具体内容如下 <?xml version="1.0" encoding ...
- MYbatis调试日记(三)
如何在Mybatis中插入日期类型的数据 直接见代码: xml配置文件 java代码
- mybatis学习日记-day01
Mybatis说明: MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的 ...
- MyBatis学习日记(三):戏说MyBatis配置文件
properties标签 properties标签可以用来加载别的配置文件,比如可以加载数据库的配置文件,jdbc.properties. 下面是jdbc.properties jdbc.driver ...
- MyBatis学习日记(二): MyBatis Say Hello
首先在Eclipse中创建一个maven工程: 在maven工程下的pom.xml文件中添加MyBatis.MySQL.Junit依赖: <project xmlns="http:// ...
- MyBatis学习日记(一):拜见小主——MyBatis
近日学习MyBatis,特将学习过程及一点心得记录于此. MyBatis为何物? MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC ...
随机推荐
- 6套MSP430开发板资料共享 | 免费下载
目录 1-MSP430 开发板I 2-MSP430mini板资料 3-MSP430F149开发板资料 4-KB-1B光盘资料 5-LT-1B型MSP430学习板光盘 6-MSP-EXP430F552 ...
- Sign in with Apple 流程总结
流程图 相关说明 UserId 与用户的 Apple Id 一一对应.在同一个开发帐号下的所有 app 里,获取到的值都一样. IdentityToken identityToken 是一个 Json ...
- WebApi之DOM的基本介绍
1.1.1 什么是DOM 文档对象模型(Document Object Model,简称DOM),是 W3C 组织推荐的处理可扩展标记语言(html或者xhtml)的标准编程接口. W3C 已 ...
- 程序员小哥教你秋招拿大厂offer
快要到秋招了,对于应届生来说,秋招是一个特别重要的机会.对于社招同学来说,金九银十也是一个很好的跳槽窗口. 而我呢,因为是从上海到广州工作,就没有提前先把工作定下来.刚好也趁这个机会出去旅游了两个月. ...
- ent orm笔记4---Code Generation
在前面几篇文章中,我们经常使用的可能就是entc这个命令了,entc这个工具给带来了很多功能,这篇文章主要整理关于ent orm 中Code Generation 之前的例子中有个知识点少整理了,就是 ...
- (Android图片内存优化)Picasso加载图片 教程。。详细版
Picasso 是 Android 上一个强大的图片下载和缓存库. 示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Picasso.with( ...
- ACwing 你能回答这些问题吗(线段树求最大连续字段和)
给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...
- 在centos6.5下搭建lnmp
1.查看环境: [root@localhost /]# cat /etc/redhat-release CentOS release 6.5 (Final) 2.关掉防火墙(需要到国外地址下载软件 ...
- Linux 用户与权限
这些天一直在看Linux的命令但是却没有写文章,因为感觉没有必要,哪些简单的命令,vi cat cd 啥的,是个做开发的就知道,所以就没写; 用户管理 第一个我们知道的用户就是Root 没错哦,这就是 ...
- AP、AC、无线路由器
起因 AP.AC.无线路由器 一直都傻傻的分不清,今天就好好的研究一下他们之间到底有什么联系和区别~ AP 什么是AP? 无线AP(Access Point):即无线接入点,它用于无线网络的无线交换机 ...