Mybatis学习总结
jdbc问题总结如下:
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题
2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变Java代码
3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护
4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便
mybatis是什么:
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,
而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
mybatis四大核心对象:
ParameterHandler:处理SQL的参数对象
ResultSetHandler:处理SQL的返回结果集
StatementHandler:数据库的处理对象,用于执行SQL语句
Executor:MyBatis的执行器,用于执行增删改查操作\
Mybatis插件原理
1.Mybatis的插件借助于责任链的模式进行对拦截的处理
2.使用动态代理对目标对象进行包装,达到拦截的目的
3.作用于Mybatis的作用域对象之上
Mybatis插件接口-Interceptor
1.Intercept方法,插件的核心方法
2.使plugin方法,生成target的代理对象
3.setProperties方法,传递插件所需参数
sqlSession和sqlSessionFactory:
缓存数据的底层数据结构是map,二级缓存是基于namespace
sqlSession一级缓存缓存的是对象,二级缓存缓存的是对象的数据,一级缓存默认开启,二级缓存需要手动开启。在分布式场景下最好使用分布式缓存来代替mybatis缓存,避免脏数据。
#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,
#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
mysql自增主键返回:
在实际编写代码过程中我们可能在插入一条记录到数据库的同时,接下来的业务代码又要用到上次插入的记录的id
mybatis-plus介绍:
mybatis-plus 比mybatis使用起来更加方便,开发效率更高,mybatis-plus有一个baseMapper泛型接口,这个接口封装了实体类对数据库简单的CRUD操作。我们只需要将自己的XXXmapper extends BaseMapper就可以直接使用baseMapper接口提供的一些方法
当然mp 也提供了QueryWapper接口,我们可以封装复杂的查询条件依次来提高开发效率。
mp整合spring
mybatis-plus.config-location引入mp核心配置文件,mybatis-plus.mapper-locations引入mapper.xml,创建mybatis核心对象都由springioc完成,且交给spring的容器进行管理
mybatis里面的设计模式:
1.代理模式:xxxMapper mapper =sqlSession.getMapper(xxxMapper.class); //返回一个该接口的代理对象,底层实现是基于jdk的动态代理
2.工厂模式:sqlSessionFactory.openSession();
3.建造者模式:SqlSessionFactoryBuilder
4.模板方法:BaseExecutor --->BatchExecutor SimpleExecutor 不同子类各自实现抽象的doUpdate方法
5.装饰者模式:例如Cache包中的cache.decorators子包中等各个装饰者的实现;
6.适配器模式:例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
7.迭代器模式:例如迭代器模式PropertyTokenizer实现了Iterator 接口