一 从JDBC到Mybatis
1.JDBC
⑴加载jdbc驱动
⑵建立并获取数据库连接
⑶创建 jdbc statments对象
⑷设置sql语句的传入参数
⑸执行sql语句并获得结果
⑹对查询结果进行转换处理并将处理结果返回
⑺释放资源
2.Mybatis优化
⑴连接获取和释放 减少数据库频繁的开启和关闭
⑵sql统一存取 将sql语句从java类中提取到xml中
⑶传入动态sql 有的时候我们的查询条件不同,有时候一个查询条件,有时候多个查询条件,这时候我们就可以在xml中采用类似jstl标签来解决
⑷结果映射 可以告诉sql处理器我们需要返回什么类型的对象
⑸结果缓存 可以通过缓存来提升性能
3.Mybatis架构分析
⑴接口层
①使用传统的mybatis的api
②采用Mapper接口,常用
⑵数据处理层
①通过传入参数动态构建SQL
②将结果封装成结果集
⑶框架支撑层
①事务管理机制
②连接池管理机制
③缓存机制
④sql语句的配置方式
⑷引导层
配置和启动mybatis的配置信息
二 Mybatis主要构件
⑴SqlSession:表示和数据库交互的会话,SqlSession根据Statement ID, 在mybatis配置对象Configuration中获取到对应的MapperStatement对象,然后调用执行器
⑵Executor:MyBatis执行器,是MyBatis 调度的核心,会根据是否有缓存来从缓存中读取或从数据库读取,并把结果放到缓存中
⑶StatementHandler: 封装了JDBC Statement操作
⑷ParameterHandler: 依靠TypeHandler设置SQL语句中的?为指定参数
⑸ResultSetHandler: 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
⑹TypeHandler: 负责java数据类型和jdbc数据类型之间的映射和转换
⑺MappedStatement: MappedStatement维护了一条<select|update|delete|insert>节点的封装
⑻SqlSource: 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
⑼BoundSql: 表示动态生成的SQL语句以及相应的参数信息
⑽Configuration: MyBatis所有的配置信息都维持在Configuration对象之中
三 Mybatis初始化机制
1.mybaits通过加载xml配置文件,把配置文件组装成内部Configuration对象
2.基于java API 这种方式需要mybatis使用者手动创建Configuration对象,然后set进去
四 Mybatis数据源
⑴unpooled 不使用连接池的数据源
⑵pooled 使用连接池的数据源
⑶jndi 使用jndi的数据源
五 Mybatis事务管理机制
⑴使用JDBC事务管理机制
即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等。
⑵使用MANAGED事务管理机制
通过容器(如JBOSS,Weblogic)来进行事务管理,所有它对事务提交和回滚并不会做任何操作,记住如果我们没有容器,那么对数据库的操作是无效的。
六 一级缓存二级缓存
每当我们使用mybatis开启一次数据库会话,mybaits就会创建一个sqlSession对象。
1.一级缓存(默认开启)
在一次数据库查询完全相同的SQL语句会直接在缓存中读取。如果SqlSession执行了DML操作(增删改),并提交到了数据库,MyBatis会清空SqlSession中的一些缓存,避免脏读。
2.二级缓存
跨SqlSession的缓存,二级缓存是根据namespace来区分,namespace相同缓存在同一区域。
Mybatis的查询顺序是: 二级缓存 ———> 一级缓存 ——> 数据库
七 Mybatis中#和$的区别
#{}是经过预编译的,是安全的;${}是未经过预编译的,是非安全的,存在SQL注入。
有时候可能需要直接插入一个不做任何修改的字符串到SQL语句中。这时候应该使用${}语法,比如,动态SQL中的字段名,如:ORDER BY ${columnName}