MyBatis原理

        目前主流的持久层框架:JDBC、Hibernate、Mybatis. 后两者其实都是基于JDBC的封装后的ORM框架,国内基本以Mybatis为主流。

ORM

        ORM代表对象关系映射(Object-Relational Mapping),是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系。ORM允许开发人员使用面向对象的方式来操作数据库,可以不需要直接编写SQL查询语句。

优点缺点
JDBC性能高,使用简单编码量大,硬编码多,开发效率低,需要手动开启和关闭链接
Hibernate开发效率高,代码耦合度低对JDBC高度封装, 对于动态SQL,复杂SQL,联表查询等支持较差,也不能sql优化
Mybatis开发效率较高,代码耦合度低,自动映射,也可以自定义映射,自定义SQL,也能对sql优化手写sql代码量较高,对于开发人员的SQL要求较高,数据库移植性差

JDBC执行顺序:

① 注册驱动和数据库信息

② 获得Connection,并使用它打开Statement对象

③ 通过Statement对象执行SQL语句,并获得结果对象ResultSet

④ 通过代码将ResultSet对象转化为POJOJO对象

⑤ 关闭数据库资源

MyBatis中# 与$ 的区别及SQL注入攻击

 #{}参数占位符,即:预编译;在预处理时,会把参数用占位符"?" 代替变成:select *from user where name = ?;

${}字符串替换符,即:SQL拼接;只是简单的字符串替换,传参 'tom' , 在动态解析时直接在SQL语句末尾拼上参数:select* from user where name = 'tom'; 所以${}会导致SQL注入。

SQL注入:即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

例如:参数为 '0 or 1 = 1', 使用${}拼接后的SQL:select* from user where id = 0 or 1 = 1

MyBatis中的缓存机制

        一级缓存默认是开启的,作用范围为SqlSession。即:同一个SqlSession对象调用同一个Mapper的方法,如果没有声明需要刷新,并且缓存没超时的情况下,一般只执行一次SQL,其他的查询SqlSession都只会取出当前缓存的数据。

        二级缓存需要手动开启作用范围为SqlSessionFactory。在xxxMapper.xml中添加<cache/>标签 或者在对应的Dao类上面增加@CacheNamespace(blocking = true)注解以开启二级缓存。并且执行sqlSession.commit()使得二级缓存生效,其中,POJOJO必须实现Serializable接口。因范围较大,一般不会使用。

MyBatis三剑客

Mybatis-generator (Mybatis-X)

Mybatis-Pagehelper

MyBatis-Plus

Mybatis 执行流程图解

1:获得Mapper接口的动态代理

2:获得MapperMethod对象,并将其进行缓存到methodCache

3:根据SQL指令跳转执行语句 mapperMethod.execute()

4:查询前的缓存处理(mybatis默认的一级缓存localCache)

5:一级缓存没有数据,执行DB查询操作,缓存并返回结果

6:针对ResultSet结果集转换封装为POJO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值