MyBatis 读书笔记(三)

MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程。

Mapper仅仅是一个接口,他的运行要依靠动态代理来实现。
在这里插入图片描述
代理模式就如同工程师,客服和客户三者的关系。
动态代理分两种,一种是JDK反射机制提供的代理(缺点是需要自己提供接口),另一种是CGLIB代理。

构建SqlSessionFactory的过程,大体分为两步:
第一步:通过ConfigBuilder解析配置的XML文件,读出配置参数,并且将读取的数据存入Configuration类中。注意,几乎所有的MyBatis配置文件都是存在这里的。
第二步:使用Configuration对象去创建SqlSessionFactory,他是一个接口而不是实现类,我们一般都会使用它的默认实现类,DefaultSqlSessionFactory。

构建Configuration
Configuration不是一个简单的类,MyBatis所有的配置信息都来自于此。作用如下:
读入配置文件,包括基础配置的XML和映射器的XML。
初始化基础配置,比如MyBatis的别名,映射器,ObjectFactory,typeHandler等。
提供单例,为后续创建SessionFactory服务并提供配置的参数。
执行一些重要的对象方法,初始化配置信息。

SqlSession下的四大对象
Mapper执行过程是通过Executor,StatementHandler,ParameterHandler和ResultHandler来完成数据库操作和结果返回的。
Executor代表执行器,用来调度其他三个对象。
StatementHandler的作用是使用数据库Statement执行操作,它是四大对象的核心。
ParameterHandler用于对Sql对参数的处理。
ResultHandler是进行最后数据集(ResultSet)封装返回处理的。

MyBatis-Spring
在Spring环境中MyBatis更加简单了,我们甚至不需要显示的使用SqlSessionFactory,SqlSession等对象。
Spring IOC注入有三种方法,构造方法注入,setter注入,接口注入。IOC是通过反射技术实现的。
在这里插入图片描述
在这里插入图片描述
setter注入更加灵活,因为构造方法会受到构造方法的参数个数,顺序等干扰因素干扰。

Spring AOP是通过动态代理来实现的。在传统的MVC框架中,业务层一般都夹带着数据库事务管理在这里插入图片描述
当程序进入到insertRole方法的时候,Spring就会读取配置的Propagation.Required,他的意思是当前方法如果有事务则加入当前事务,否则就创建新的事务。

事务级别隔离
数据库和事务一样,也有并发的问题,按照数据库的概念分为脏读,读写提交,可重复读和序列化四种。
脏读指的是一个事务读取了另一个事务未提交的数据。
读写提交指的是事务并没有读到最新的数据,因为最新的数据还没有提交。或者说刚看到账户余额有1000,但是被消费掉了500,然后发现余额不足。
可重复读指的是能再次看到被更改的数据。
序列化指的是所有操作都会按顺序执行,不会出现脏读,不可重读和幻读的情况。

这四种性能会一次下降,默认使用读写提交就可以了。MySql采用的是可重复读。

Spring-MyBatis中构建SqlSessionFactory。提供了一个SqlSessionFactoryBean的配置来初始化。
在这里插入图片描述
在MyBatis-Spring中,SqlSession是通过SqlSessionTemplate来实现的,它提供了对SqlSession操作的封装。在这里插入图片描述
MapperScabberConfigurer是用来指定自动扫描来配置我们的映射器的。

事务配置的时候使用声明式配置即可。
在这里插入图片描述
在数据库中使用批量更新有助于提高性能。需要配置打开。

分表,实际工作中,大型公司的账单表可能有上亿条,可以根据年份把数据保存在不同的表上。MyBatis允许我们把表名作为参数传递到SQL中。在这里插入图片描述

分页
MyBatis具有分页功能,它里面有一个类RowBounds,但是他有一个问题就是会在一条SQL中查询所有的结果,然后根据第几条到第几条取出数据。容易使内存溢出。
使用方法:
在这里插入图片描述
这个类的使用场景不多,一般都是通过分页插件去使用。

猜你喜欢

转载自blog.csdn.net/bianhao92115/article/details/86561775
今日推荐