mybatis
2022-10-19 07:32:22 0 举报
AI智能生成
mybatis
作者其他创作
大纲/内容
其他细节
#和$
解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。不会有sql注入风险
仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。会有sql注入的风险
ResultType和ResultMap
resultMap,如果查询出来的列名和pojo的属性名不一致,
通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
resultType:只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
prepareStatement和statement的区别?
mybatis提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,
其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。
其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。
N+1问题
解决方式:嵌套结果,嵌套查询
嵌套查询解决N+1问题:配置延迟加载的全局开关,当开启时,所有的关联对象都会延迟加载,默认为false
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
有哪些动态标签
if/choose/forearch/trim,解决需要去掉其他的逗号啥的
批量操作
批量操作:(1)代码里面用 for循环,效率低,打开了,关闭连接
(2)动态sql标签,forearch帮助生成符合数据库语法的语句,语句可能过长,数据库可能会报错
(3)Batch Executor prepareStatement-->ps.addBatch()-->ps.executeBatch()
分页
逻辑分页
是一种假的翻页,是将数据全部加载到内存里,RowBounds,offset,limit
物理分页
1,手动,定义两个参数, select * from blog limit #{curIndex} , #{pageSize}
2,pageHelper 插件
大批量数据查询问题
一,Mysql数据库中一个表里有一千多万条数据,怎么快速的查出第1000万条后的100条数据?
普通分页查询(严重不推荐)
SELECT * FROM `user_operation_log` LIMIT 1000000, 10
第一个参数指定第一个返回记录行的偏移量
第二个参数指定返回记录行的最大数目
第二个参数指定返回记录行的最大数目
1,使用子查询优化
先定位偏移位置的 id,然后再查询数据
SELECT * FROM `user_operation_log` WHERE id >= (SELECT id FROM `user_operation_log` LIMIT 1000000, 1) LIMIT 10
2,采用 id 限定方式
这种方法要求更高些,id必须是连续递增,而且还得计算id的范围,然后使用 between
SELECT * FROM `user_operation_log` WHERE id between 1000000 AND 1000100 LIMIT 100
SELECT * FROM `user_operation_log` WHERE id >= 1000000 LIMIT 100
SELECT * FROM `user_operation_log` WHERE id >= 1000000 LIMIT 100
解决了什么问题?
jdbc原生-->注册 JDBC 驱动, 打开连接,执行查询,处理结果集--》全部都要手动操作,麻烦,而且sql语句写在代码上的
1)需要手动管理资源
2)代码重复
3)业务逻辑与数据操作的代码耦合
3)业务逻辑与数据操作的代码耦合
4)结果集需要手动处理
所以出现orm框架
优点:使用连接池对连接就行管理
sql和代码分离,集中管理
参数映射和动态sql
结果集映射
插件
执行流程
简化版
1,解析配置文件为Configreation类----》2,调用sqlSessionFactoryBuild()---》3,sqlSessionFactory-->sqlSession-->调用extuor--->参数入参--》参数返回
初始化
1,解析配置文件mybatis-config.xml
解析setting/cacheenable标签
2,得到我们config里面的mappers的配置,解析mapper文件
3,解析mapper文件里面的增删改查
4,将我们的增删改查语句放到一个mapperstatement,并且放入到Map里面
key是:namespace+sqlid
value: statement
value: statement
创建会话
1,确认我们的执行器 Simple Reuse,Batch
预编译处理,指的是mysql对于sql的处理
2,判断一个缓存开关(setting cacheEnable)默认
3,如果开启的话,返回的就不是基本执行器,而是缓存执行器cacheingExcutor
4,执行sql逻辑
执行语句
1.根据我们的接口的class对象拿到MapperProxyFactory
2.再拿到一个代理对象
3.所有的接口访问方法都会去调用MapperProxy的invok方法
4.查询mapperstatement,里面有很多信息,包括sql语句
5.如果你开启了缓存,走到CachingExecutor,否则走BaseExcutor
二级缓存默认关闭,config中可以关闭,就算开启,也要通过mapper控制
二级缓存config和mapper有关系 二级缓存跟着namespace
6.一级缓存呢?一级缓存是跟sqlsession有关,默认开启
缓存
一级缓存
默认开启,一级缓存是跟sqlsession有关
二级缓存
跟namespace相关,默认不开启,也不建议使用,因为insert,update,delete操作会清空所在namespace下的全部缓存。
插件
1.Excutor:我要查看mybatis的sql执行过程
2.ParameterHandler我要修改他的参数
3.ResultSetHandler我要拦截返回值
4.StatementHandler我要进行分页
如何写一个插件
子主题
三大组件
子主题
子主题
0 条评论
下一页