1)为什么要用MyBatis?
(1)JavaEE的规范,用JDBC
(2)JDBC的问题
代码重复:和业务逻辑无关的代码,十分重复。
结果集处理太复杂:
需要啊自动转化为Pojo对象,十分麻烦。
连接管理:
忘记关闭导致连接被消耗完毕
SQL语句的硬编码:
sql和业务处理的代码放在一起,十分麻烦。
(3)现成的工具框架
Apache: DbUtils
支持数据源
反射
QueryRunner
ResultSetHandler
SpringJDBC: JDBCTemplate
方法封装:
JDBCTemplate
资源管理:
dataSource
结果集的处理:
RowMapper、mapRow
结果集转化为Object
但是需要定义RowMapper,每一张表,不是特别方便--》传入泛型,直接用BaseRowMapper 解决
但是,sql和业务的操作还是耦合在一起的。
条件参数的话,必须用参数传入,无法传入一个对象。
save一个方法,直接保存到数据库。
没有提供缓存等功能。
(4)O对象 R映射 M关系型数据库--》对象与数据库的映射。
(5)Hibernate
hbm.xml
session.save(blog)
问题:
不能指定部分字段
无法自定义SQL,优化困难: SQL是自动生成的。
不支持动态SQL:动态变更表名的话,无法自动变更。
JPA也是对Hibernate的封装
2)MyBatis: 半自动的ORM框架
(1)使用连接池对连接进行管理
(2)SQL和代码分离,集中管理
(3)参数映射和动态SQL
(4)结果集映射
(5)缓存管理:一、二级别管理
(6)重复SQL的提取
(7)插件机制
3)选择什么ORM框架?
1.业务简单的,用Hibernate
2.需要灵活SQL的,用MyBatis
3.对象呢要求高的,可以用JDBC
4.Spring JDBC可以和ORM框架混用
4)MyBatis编程式开发
(1)mybatis和MySQL jar包依赖
(2)全局配置文件mybatis-config.xml
(3)映射器Mapper.xml
(4)Mapper接口
5)4个对象
SqlSessionFactoryBuilder: 创建工厂类。 生成了工厂类对象,就没有作用了,生成完工厂类,就可以丢弃了,生命周期是方法内。
SqlSessionFactory:创建会话,一直存在,需要不断创建SqlSession,是单例模式。
SqlSession:一次会话。每一次请求,一个方法里面存在。
Mapper:SqlSession的getMapper产生的,和SqlSession生命周期一样,存在于事务的方法里面。
6)mybatis-config.xml全局配置文件解析-->Configuration
7)TypeHandler: String--》varchar
Java类型和JDBC类型的映射关系。
8)自定义ObjectFactory--》注册到全局配置文件中来,实现某猫数据量*3
9)插件--》可以拦截四大对象
10)最佳实践
(1)动态sql
(2)批量操作。是根据动态sql,生成符合数据库语法的sql语句。
而不是一个for循环搞,太消耗性能。
默认拼接sql操作最大是4M。
(3)Batch Executor
11)关联查询问题,N+1
12)字段出现变化时
(1)继承
(2)通用Mapper
MyBatis-Plus
========================
========================
1)JDBC的缺点
(1)代码重复
(2)硬编码: 驱动连接地址
(3)连接管理
连接管理需要手动释放
(4)不优雅:
sql和业务代码有耦合。 集中地方维护。
对结果处理,需要new对象,判断类型手动赋值,想要指定类型后自动判断。
2)核心对象
(1)配置类
(2)执行器
(3)应用层的API
(4)代理对象: id查找sql的硬编码
SQL id 方法
namespace 接口类型
statement
动态代理
3)操作流程
SQL语句: 接口类型 + 接口参数
BlogMapper
getBlogById(id)
代理对象去代理接口:MapperProxy
Configuration