MyBatis

MyBatis是什么

它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持一对一,一对多,动态SQL和缓存等特性,但它的数据库无关性较低。

ORM(Object Relational Mapper)对象关系映射
为了解决Java对象和关系数据库存在的互不匹配的现象的技术,Hibernate和MyBatis。

MyBatis的半自动体现在spl语句需要我们自己手写,但相比JDBC,它提供了输入映射和输出映射,可以很方便地进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,较灵活,极大地提升了开发的效率。

MyBatis底层是用什么实现的?

使用动态代理的方式:通过拦截器方法回调,对目标target方法进行增强。
UserMapper mapper = session.getMapper(UserMapper.class);
只有接口没有实现类,但是getMapper返回的一定是实现了UserMapper接口的子类,MyBatis底层就是通过动态代理生成了一个代理对象,而目标对象就是UserMapper.class。

接口Mapper内的方法能重载吗?

不能,因为MyBatis使用package+Mapper+method全限名作为key,去xml中查找唯一的spl来执行。
进行重载会报错。

简单过程

1、编写全局配置文件mybatis.xml,设置为JDBC事务管理,配置数据库连接池,加载配置文件等。
2、编写mapper.xml映射文件,编写spl语句。无论增删改查我们都要用到的select标签需要设置id,parameterType 参数(输入)类型,resultType 结果(输出)类型
3、加载全局配置文件,生成SqlSessionFactory
4、创建SqlSession,调用mapper映射文件中的SQL语句来执行CRUD操作

MyBatis中#和$的区别

#{}是占位符,即spl预编译,能有效防止spl注入
${}是拼接符,即spl拼接,无法防止spl注入

无论单个参数还是多个参数,一律建议使用注解@Param(“”);
能用 # 就用 # ,不用或少用 $ , 但是又不得不用 $ 的地方,表名作为参数时和order by时要用 $ 。

MyBatis的高级映射

即一对一,一对多,多对多
MyBatis中使用association标签解决一对一关联查询,
使用collection标签解决一对多关联查询,
多对多可以看做两个一对多。

动态spl语句

通过MyBatis提供的各种标签方法实现动态拼接Sql。

用于查找语句的where-if
用于更新语句的set-if
处理数组或集合的foreach标签
相当于if-else if-else的choose-when-otherwise

MyBatis的一级、二级缓存

一级缓存
MyBatis默认一级缓存,一级缓存只是相对于同一个SplSession而言。
我们使用同一个SplSession对象调用一个Mapper时往往只执行一次spl语句,因为一次查询后MyBatis会将其放入缓存,在没有声明刷新并且缓存没有超时的情况下,SplSession都会使用当前缓存的数据,不会再发送到数据库。

二级缓存
因为一级缓存最大范围就是一个SplSession,所以如果多个SplSession需要共享缓存,就要使用到二级缓存。
二级缓存需要手动开启。
二级缓存被多个SplSession所共享,是一个全局变量。
查询的流程是:二级缓存-一级缓存-数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值