MyBatis基础总结

MyBatis的执行流程:

SqlSessionFactoryBuilder(建造者模式)通过XMLConfigBuilder解析Mybatis的全局配置XML文件(全局参数,别名,环境设置,类型转换器,映射器)通过XMLMapperBuilder读取Mapper.xml文件.将信息存入Configuration对象(单例模式)中,然后根据Configuration对象中的配置信息去创建SqlSessionFactory(单例模式),SqlSessionFactory接口有两个实现类,分别是DefaultSqlSessionFactory(单线程,默认)和SqlSessionManager(多线程),默认返回DefaultSqlSessionFactory,有了SqlSessionFactory就可以获取SqlSession,SqlSession是个接口(类似于JDBC中的Connection对象,使用了外观模式),有两个实现类,分别是DefaultSqlSession(单线程,默认)和SqlSessionManager(多线程),默认返回DefaultSqlSession,SqlSession的getMapper(Class)方法会通过JDK动态代理或者CGLIB来生成一个代理实例MapperProxy,代理实例执行SQL时实际是由Executor来执行的,Executor接口的实现类,有SimpleExecutor(默认),ReuseExecutor(重用预处理),BatchExecutor(批量专用),以及CachingExecutor(装饰者模式,装饰其他三种Executor,实现二级缓存,一级缓存在其他三种Executor中实现),默认使用SimpleExecutor来执行doQuery方法或者doUpdate方法,期间会使用StatementHandler(数据库会话器)的prepare()方法预编译SQL,同时设置一些基本运行的参数.然后调用parameterize()方法启用ParameterHandler设置参数,完成预编译,执行SQL语句,最后使用ResultSetHandler封装结果返回给调用者.

处理sql参数和返回sql结果的时候会使用TypeHandler(类型转换器)来进行Java类型与JDBC类型的转换.

创建结果集对象会使用ObjectFactory接口的DefaultObjectFactory实现类来完成.

StatementHandler的实现类有SimpleStatementHandler(对应JDBC的Statement),PreparedStatementHandler(对应JDBC的PreparedStatement,预编译处理),CallableStatementHandler(对应JDBC的CallableStatement,存储过程),RoutingStatementHandler(扮演适配器的角色,会根据上下文环境决定创建哪个StatementHandler对象).

MappedStatement对应Mapper.xml文件中的select,insert,delete,update节点.它存放在Configuration类的一个map成员中.

SqlSource接口的作用是根据上下文和参数解析生成需要的SQL

BoundSql用来封装SQL和参数.

MyBatis核心组件的生命周期

SqlSessionFactoryBuilder的作用就是创建SqlSessionFactory,创建完成后就不再需要,应把它的作用域限制在创建SqlSession的方法之中,不要让其长期存在.

SqlSessionFactory(类似于数据库连接池)的作用就是创建SqlSession,所以一旦创建SqlSessionFactory就要长期保存它,直到不再使用Mybatis应用.

SqlSession(类似于数据库连接)应当存在于一个业务请求当中,使用完成后要保证它被正确关闭.

Mapper是一个接口,由SqlSession创建,它的生命周期最多和SqlSession保持一致,Mapper代表的是一个请求中的业务处理,它应该在一个请求中,一旦处理完了相关业务,就应该废弃它.

MyBatis的配置

<configuration>  <!--配置-->
    <properties>  <!--属性-->    
    <settings>  <!--设置-->
    <typeAliases> <!--类型别名-->
    <typeHandlers>  <!--类型处理器-->
    <objectFactory> <!--对象工厂-->
    <plugins>  <!--插件-->
    <environments> <!--配置环境-->
        <environment>  <!--环境变量-->
            <transactionManager> <!--事务管理器-->
            <dataSource> <!--数据源-->
            </dataSource>
        </environment>
    </environments>
    <mappers>  <!--映射器-->
        <mapper></mapper>
    </mappers>
</configuration>

properties的参数可以使用properties文件在存放,然后在Mybatis中通过<properties resource="jdbc.properties" />来引入properties文件.也可以按照${database.username}的方式引入properties文件的属性到Mybatis配置文件中.

settings常用的配置有:

  • 自动驼峰命名规则映射mapUnderscoreToCamelCase=false
  • 自动映射autoMappingBehavior=PARTIAL只会自动映射没有定义嵌套结果集映射的结果集 NONE取消自动映射 FULL会自动映射全部结果集,无论是否嵌套.
  • 缓存的全局开关cacheEnabled=true
  • 延迟加载的全局开关lazyLoadingEnabled=false
  • 侵略性延迟加载开关aggressiveLazyLoading=(3.4.1版本及之前为true,之后为false) 开启后,调用任意延迟属性,将会导致所有的延迟属性被完整加载.  可以解决级联的N+1问题.
  • 执行器类型defaultExecutorType=SMPLE REUSE BATCH

可以通过<typeAliases>中的<typeAlias>来定义别名,还可以通过TypeAliasRegistry来实现自定义别名.

ObjectFactory对象工厂用来完成创建结果集实例,默认使用DefaultObjectFactory.

MyBatis缓存

一级缓存默认开启,SqlSession级别.

二级缓存只需要在mapxml文件中加入<cache/>,并让对应pojo实现序列化接口,在标签上添加useCache="true"t即可.

MyBatis动态SQL

if,set,where,bind(例如数据库的concat()方法),foreach,trim,choose,otherwise

Mybatis的注解

@Param为参数命名

@Insert实现新增

@Update实现更新

@Delete实现删除

@Select实现查询

@Result实现结果集封装

@Results可以与@Result一起使用,封装多个结果集.

@One实现一对一结果集封装.

@Many实现一对多结果集封装.

@SelectProvider实现动态SQL映射.

MyBatis插件

简述Mybatis的插件运行原理,以及如何编写一个插件?

答:Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

编写插件:实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章