1、为什么使用mybites
①、代码重复
②、需要收到管理资源
③、业务逻辑与代码逻辑耦合,不方便维护
④、sql解析不方便,结果集处理复杂
2、现在使用的orm框架有哪些
①、hibernate
提供了一个session对象,提供了save。。。
缺点:不能指定部分字段,无法自定义sql,优化困难,不支持动态修改sql
②、springjdbc
方法封装:定义jdbctemplate
资源管理:初始化一个datasource
结果集的处理:RowMapper
③、DButil,处理结果集
定义一个:BlogHandler
解决了:方法封装,支持数据源,映射结果集
未解决:sql硬编码,参数只能按顺序传入(占位符),没有实现实体类到数据库记录的映射,没有提供缓存的功能
3、什么是orm
object–relation–mapper
数据库表与java中的实体类对应
4、MyBatis
特性:
1、使用连接池对连接进行管理
2、SQL与代码分离,集中管理
3、参数映射和动态SQL
4、结果集的映射
5、缓存管理
6、重复SQL的管理
7、插件机制
5、选择什么orm框架
1、业务简单的项目可以选择hibernate
2、需要灵活的SQL,可以用mybatis
3、对性能要求公安,可以使用jdbc
4、spring JDBC可以和ORM框架混用
二、mybatis编程式开发
SqlSessionFactoryBuilder:解析配置文件–创建工厂类
生命周期(方法局部):创建完SqlSessionFactory,就销毁了
SqlSessionFactory:创建会话
生命周期:单例模式,创建完会一直产生
SqlSession:会话
生命周期:数据库请求过程–请求时生成,调用完成结束
BlogMapper:
配置文件:
1、全局配置文件
< configuration>
< properties>独立出的一部分文件
< settings>设置
< typeAliases>别名,简化我们的拼写
不用全部定义,可以定义一个包,将全路径扫描,及一些预设的一些别名
< typeHandlers>类型处理器,可以自定义,系统包括一些预设的类型
彩蛋,将数据库中的BLOK文件转换为对应的类对象,需要自己程序设置
问题:将数据库保存的json格式转换为类对象???
< objectFactory>对象工厂 写一个objectfactory继承defaultobjectfactory
< plugins>
< environments>定义数据环境
< /transactionManager>事务管理器:jdbc,集成到spring,manager
</ dataSource>数据源
< mappers>映射器
2、mybatis最佳实践这里是引用
①、动态SQL,用于拼接SQL
1.< if>:按照条件查询表
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
- < choose>:条件语句中使用的
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
- trim (where, set)
< /trim>去除末尾,逗号,空格,,,
按条件插入时,不能保证那条记录为最后一个,所以需要将最后一个条件逗号去除,以保证SQL的规范
-
</ foreach>用于生成由逗号分隔的批量数据
问题一:代码中的for和mybatis中的foreach有什么区别?
for循环:每执行一次调用一次数据库连接,浪费性能
foreach:帮助我们生成符合数据库语法的SQL语句,只执行一次数据库连接
缺点:数据量大的时候,数据库一次请求SQL长度是有要求的,会造成数据丢失
最优解:Bath executor
问题二:statement和prepareStatement区别
②、嵌套(关联)查询–N+1/延迟加载
方式:嵌套结果(结果中在 ),嵌套查询(在结果中关联方法 )
如何设置延迟加载(通过代理的方式实现):配置文件中设置
③、翻页
逻辑翻页和物理翻页
逻辑翻页:先从数据库全部取出,后在筛选
物理翻页:将当期页号及查询个数传入数据库查询
④MBG代码生成器
字段发生变化
解决:继承,通用mapper