一、MyBatis框架操作数据库:
1.编写MyBatis的主配置文件
2.新增Java实体与数据库表建立映射:
MyBatis属于半自动化的ORM框架,可以将数据库中的数据转换为Java实体,因此需要一个Java实体类与数据库中的表相对应,可以使用Lombok工具,通过注解为Java类的属性自动生成Setter/Getter方法,消除冗余代码。
3.定义用于执行SQL的Mapper:
MyBatis的Mapper配置包括两部分,一是Mapper接口,二是通过XML或者Java注解方式配置的SQL语句。
4.通过MyBatis提供的API执行定义的Mapper
以主配置文件的输入流作为参数调用SqlSessionFactoryBuilder对象的bulid()方法,返回一个SqlSessionFactory对象
调用SqlSessionFactory对象的openSession()方法获取一个与数据库建立连接的SqlSession实例
调用SqlSession的getMapper()方法创建一个动态代理对象
调用代理对象的方法完成与数据库的交互。
MyBatis中还提供了一个SqlSessionManager类(单例:通过静态方法newInstance获取实例),实现了SqlSessionFactory和SqlSession接口,既可以获取SqlSession实例,又可以替代SqlSession完成与数据库的交互。
二、 MyBatis核心组件
Configuration:
描述MyBatis的主配置信息,MyBatis框架在启动时会加载主配置文件,将配置信息转换为Configuration对象。
MappedStatement:
描述Mapper中的SQL配置信息,MyBatis框架启动时,XML文件或者注解配置的SQL信息会被转换为MappedStatement对象注册到Configuration组件中。
SqlSession:
面向用户的API,是MyBatis与数据库交互的接口,是Executor组件的外观。
Executor:
SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
StatementHandler:
封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。
ParameterHandler:
用于处理SQL中的参数占位符,为参数占位符设置值。
ResultSetHandler:
封装了对ResultSet对象的处理逻辑,将结果集转换为Java实体对象。
TypeHandler:
类型处理器,用于处理Java类型与JDBC类型之间的转换。
MyBatis使用上述组件操作数据库的过程:
1.使用SqlSession组件,它是用户层面的API。
2.调用Executor,它是SQL执行器。
3.Executor会使用StatementHandler组件对JDBC的Statement对象进行操作。当Statement类型为CallableStatement和PreparedStatement时,
会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法为Statement对象中的参数占位符设置值。
4.当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler组件从Statement对象中获取ResultSet对象,然后将ResultSet对象转换为Java对象。
三、Configuration详解
Configuration:
描述MyBatis主配置文件的信息,在MyBatis框架启动时注册到Configuration组件中。
MyBatis框架的配置信息有两种:
1.配置MyBatis框架属性的主配置文件
2.配置执行SQL语句的Mapper配置文件(可以直接在Mapper接囗中,通过注解配置,不一定要有Mapper配置文件)。
Configuration类内容主要有三类:
1.定义一系列的属性用来控制MyBatis运行时的行为,属性的值在MyBatis主配置文件中通过标签指定。
2.作为容器存放TypeHandler(类型处理器)、TypeAlias(类型别名)、Mapper接口及Mapper SQL配置信息。
3.作为Executor、StatementHandler、ResultSetHandler、ParameterHandler组件的工厂类,创建这些组件的实例,方便实现插件拦截逻辑。
常见属性:
mapperRegistry:
注册Mapper接口信息,建立Mapper接口的Class对象和MapperProxyFactory对象之间的关系。
interceptorChain:
注册MyBatis插件信息,MyBatis插件实际上是一个拦截器。
typeHandlerRegistry:
注册所有的TypeHandler,并建立Jdbc类型、java类型与TypeHandler之间的对应关系。
languageRegistry:
注册LanguageDriver,LanguageDriver用于解析SQL配置,将配置信息转换为SqlSource对象。
mappedStatements:
MappedStatement对象描述<insert|select|update|delete>等标签或者通过@Select、@Delete、@Update、@Insert等注解配置的SQL信息。
MyBatis将所有的MappedStatement对象注册到该属性中,其中Key为Mapper的Id,Value为MappedStatement对象。
caches:
注册Mapper中配置的所有缓存信息,其中Key为Cache的Id,也就是Mapper的命名空间,Value为Cache对象。
resultMaps:
注册Mapper配置文件中通过<resultMap>
标签配置的ResultMap信息,ResultMap用于建立Java实体属性与数据库字段之间的映射关系,
其中Key为ResultMap的Id,该Id是由Mapper命名空间和<resultMap>
标签的id属性组成的,Value为解析<resultMap>
标签后得到的ResultMap对象。
parameterMaps:
注册Mapper中通过<parameterMap>
标签注册的参数映射信息。Key为ParameterMap的Id,由Mapper命名空间和<parameterMap>
标签的id属性构成,Value为解析<parameterMap>
标签后得到的ParameterMap对象。
keyGenerators:
用于注册KeyGenerator,KeyGenerator是MyBatis的主键生成器,MyBatis中提供了3种KeyGenerator,即Jdbc3KeyGenerator(数据库自增主键)、NoKeyGenerator(无自增主键)、SelectKeyGenerator(通过select语句查询
自增主键)。
loadedResources:
注册所有Mapper XML配置文件路径。
sqlFragments:
注册Mapper中通过标签配置的SQL片段,Key为SQL片段的Id,Value为MyBatis封装的表示XML节点的XNode对象。
mapUnderscoreToCamelCase:
是否开启自动驼峰命名规则的映射,例如数据库名stu_name到经典Java属性名stuName的映射。
四、Executor
Executor:
定义了对数据库的增删改查方法。
接囗实现类:
BaseExecutor:
定义了方法的执行流程及通用的处理逻辑,具体的方法由子类来实现,典型的模板方法模式。
SimpleExecutor:基础的Executor,能够完成基本的增删改查操作。
ResueExecutor:对JDBC中的Statement对象做了缓存,当执行相同的SQL语句时,直接从缓存中取出Statement对象进行复用,避免了频繁创建和销毁Statement对象,从而提升系统性能,这是享元思想的应用。
BatchExecutor:会对调用同一个Mapper执行的update、insert和delete操作,调用Statement对象的批量操作功能。
CachingExecutor:MyBatis支持一级缓存和二级缓存,当MyBatis开启了二级缓存功能时,会使用CachingExecutor对SimpleExecutor、ResueExecutor、BatchExecutor进行装饰,为查询操作增加二级缓存功能,装饰器模式的应用。
接下来以一个案例介绍如何直接使用Executor组件与数据库交互,代码如下:
使用:
1.调用Configuration对象的getMappedStatement()方法获取对应的MappedStatement对象,因为Executor与数据库交互需要Mapper配置信息,
2.获取MappedStatement对象后,根据SQL类型调用Executor对象的query()或者update()方法。