1,核心对象的生命周期
SqlSessionFactoryBuilder(方法局部[ Method ]):只是用来构建SqlSessionFactory的,构建完了它就没用了,所以它的生命周期在方法的局部
SqlSessionFactory(应用级别[ Application ]):用来创建SqlSession的,每次应用程序访问数据库都需要创建一个会话,所以它应该存在于引用的这个生命周期中,创建SqlSession只需要一个实例来做就好了,否则会产生混乱和浪费资源,所以我们采用单例模式。
SqlSession(请求和操作[ request/method ]):是一个会话,因为它不是线程安全,不能在线程间共享,所以我们在请求开始的时候创建它,在结束的时候要及时关闭它。
Mapper(方法[ method ]):实际上是一个代理对象,是从SqlSession中获取的。
2,核心配置文件
1,根标签:configuration:对应着Mybtis最重要的类Configuration。它贯穿mybatis执行的每一个流程
tips:Mybatis全局配置文件的里面标签顺序是固定的,否则会报错。
2,一级属性标签:
* properties:配置参数信息,比如最常见的数据库连接信息。
* settings:mybatis中的一些核心配置。
cacheEnabled:是否使用缓存,默认 true。
lazyLoadingEbabled:控制全局是否使用延迟加载 (association、collection)。当有 特殊关联关系需要单独配置时,可以使 用 fetchType 属性来覆盖此配置。
aggressiveLazyLoading:开启时,无论调用什么方法加载某个对 象,都会加载该对象的所有属性,关闭 之后只会按需加载。默认 false。
defaultExecutorType:有三种执行器:SIMPLE 为普通执行器; REUSE 执行器会重用与处理语句; BATCH 执行器将重用语句并执行批量 更新。
logImpl:指定 MyBatis 所用日志的具体实现,未 指定时将自动查找。
* typeAliases:类型的别名,比如mapper文件中,参数类型和返回类型都可能用到我们的bean,这时候我们给bean指定一个别名,就可以不用写那么多,Mybatis里面有系统预定义的别名,在TypeAliasRegistry中。
* typeHandlers:因为java类型和数据库类型是不一致的,通过typeHandlers我们可以实现java对象类型与数据库类型的转换。Mybatis内置了很多TypeHandler,他们全部注册在TypeHandlerRegistry中,他们都继承了BaseTypeHandler。
* objectFactory:数据库返回结果转为实体对象的时候,我们调用DefaultObjectFactory的instantiateClass()方法来创建对象,是通过反射来实现的,如果想要修改对象工厂在初始化实体类的行为,就可以通过继承DefaultObjectFactory来实现。
* plugins:mybatis的预留插件接口。可以拦截这四大对象的这些方法。
Executor:update,query,flushStatements,commit,rollback,getTransaction,close,isClosed
ParameterHandler:getParameterObject,setParameters
ResultSetHandler:handleResultSets,handleOutputParameters
StatementHandler:prepare,parameterize,batch,update,query
* environments、environment:environments管理数据库环境,例如开发环境,测试环境,每一个environment代表一个数据源,里面有一个事务管理器,一个数据源
transactionManager:如果配置的是JDBC,则会使用jdbc的事务相关操作,commit rollback,如果配置的是MANAGED,则会把事务交给容器来管理。
dataSource:在跟spring集成的时候,事务和数据源都会交给spring管理。
* mappers:映射器,配置 SQL 映射文件的位置,告知 MyBatis 去哪里加载 SQL 映射文件。
3,Mybatis实践
3.1 动态标签
主要有四类,if,choose(when,otherwise),trim(where,set),foreach。
if:需要判断的时候,条件写在test中。
choose(when,otherwise):需要选择一个条件。
3.2 批量操作
3.3 翻页
逻辑翻页(利用RowBounds,里面主要有offset和limit参数)和物理翻页(数据库sql层面的分页,插件如PageHelper)
3.4 通用Mapper
当我们的表字段发生变化时,我们就需要重新生成mapper,实体类等文件,如果文件已经被修改过,维护会很麻烦。
解决方法:
1,因为Mybatis的mapper是可以继承的,所以我们可以针对一个mapper生成两个文件,一个是mbg生成的,另一个继承它,我们维护修改的都在这里面改,那么如果表字段发生变化我们只需要改变mgb生成的那个就好。缺点就是文件数量过多。(只能继承statement,不能继承sql,resultMap等标签)。
3,编写通用mapper接口,使用泛型,将实体类作为参数传给它。这个接口中定义大量的基础方法,没有的我们就在自己的mapper里面写就行。
3.5 Mybatis-Plus
是原生的Mybatis的一个增强工具,可以在使用原生的mybatis的所有功能上,使用plus特有的功能。
核心功能有:
通用CRUD:定义好mapper接口后,只需要继承BaseMapper<?>接口,就可以获得通用的增删改查功能。
条件构造器:通过EntityWrapper<T>,可以用于拼接sql语句,并且支持排序,分组查询等复杂sql。
代码生成器:支持一系列的策略配置和全局配置,另外Mybatis-plus也有分页的功能