1.mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。
2.分析原生JDBC代码:
步骤:
1.加载驱动
2.建立连接
3.定义sql
4.预处理statement
5.设参、执行sql,获取结果集
6.遍历处理结果集
7.释放资源
问题:
1.在创建连接的时候存在硬编码 ==>>> 配置文件(全局配置文件)
2.在执行statement时存在硬编码 ==>>> 配置文件(映射文件)
3.频繁开关数据库,性能低下 ==>>> 数据库连接池(全局配置文件)
3.原始dao的开发方式: dao接口 + dao实现类
问题:1、有大量的重复的模板代码
2、存在硬编码
4.Mapper代理的开发方式: 使用的是jdk的代理策略。
步骤:1、先写一个接口
2、再写一个mapper.xml文件去写对应的sql
3、编写的时候注意几个注意事项。
5.全局配置文件
SqlMapConfig.xml的配置内容和顺序如下(顺序不能乱):
Properties(属性)
Settings(全局参数设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境信息集合)
environment(单个环境信息)
transactionManager(事物)
dataSource(数据源)
mappers(映射器)
6.映射文件
1.输入映射:简单类型、pojo类型、包装pojo类型、Map类型
2.输出映射:resultType、resultMap、动态sql
7.其他小结:
1.#{}和${}
#{}表示占位符?,#{}接收简单类型的参数时,里面的名称可以任意
${}表示拼接符,${}接收简单类型的参数时,里面的名称必须是value
${}里面的值会原样输出,不加解析(如果该参数值是字符串,有不会添加引号)
${}存在sql注入的风险,但是有些场景下必须使用,比如排序后面会动态传入排序的列名
2.parameterType和resultType
parameterType指定输入参数的java类型,parameterType只有一个,也就是说入参只有一个。
resultType指定输出结果的java类型(是单条记录的java类型)
3.selectOne和selectList
selectOne查询单个对象
selectList查询集合对象
8.一对一,一对多,多对多映射
<collection>
...
<collection>
...
<association>...<association/>
<collection/>
<collection/>
9.延时加载,也叫懒加载,也叫按需加载
在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能。
10.查询缓存
一级缓存: sqlsession,默认开启
一级缓存,指的就是sqlsession,在sqlsession中有一个数据区域,是map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。
二级缓存: 同一个namespace下的 mapper,需要手动开启
二级缓存,指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是二级缓存区域。二级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。二级缓存中的value,就是查询出的结果对象。
11.整合SSM
1.原始dao开发:
1.lib导入jar包。
2.编写mybatis的文件: sqlMapConfig.xml 和 sqlmap下的XxxMapper.xml
3.编写dao 和 daoImpl: 继承 SqlSessionDaoSupport
4.为了测试,去配置UserDao的bean
5.测试类测试
2.Mapper代理开发:
1.lib导入jar包
2.编写mybatis的文件: sqlMapConfig.xml
3.编写mapper: mapper接口 + mapper.xml,放在同一包下
4.为了测试,单个mapper代理类配置
5.测试类测试
12.逆向工程
mapper已经存在的时候,会追加!!
13.解答之前的一个疑惑
Q: 配置mapperScannerConfigurer 这一部分是如何在整合中被省略掉的??? (我发现fesher/ cloudnote:只要配置了sqlSessionTemplate 就没有 配置mapperScannerConfigurer)
其实这个问题是不正确的,实际是配置mapperScannerConfigurer,从而省去sqlSessionFactory注入与MapperFactoryBean
参考:MyBatis MapperScannerConfigurer
Spring与MyBatis 整合时关于SqlSessionTemplate的用法和映射器的使用(MapperFactoryBean,MapperScannerConfigurer)