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