MyBatis

明月清风精进不止 2020-01-07

1.简介

MyBatis事一个半自动化的持久层框架

2.mybatis与jdbc和hibernate的比较

jdbc:sql夹在Java代码块里,耦合度高,容易导致硬编码内伤

     维护也不方便,因为直接写死了

hibernate:内部自动生成sql,但是不容易维护优化

     基于全映射的全自动框架,字段过多,而且进行部分映射的时候会相对困难点,致使性能下降。

mybatis:sql和java分开,各自的功能比较清晰。

3.步骤

  1. 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象,包含数据源一些运行环境信息
  2. sql映射文件:配置了每一个sql,以及sql的封装规则等
  3. 把sql映射文件注册在全局配置文件中
  4. 写代码:
    1. 根据全局配置文件得到SqlSessionFactory
    2. 使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查-一个sqlSession就是代表和数据库的一次绘画,用完关闭
    3. 使用sql的唯一标志来告诉MyBatis执行那个sql,sql都是保存在sql映射文件中的

4.参数值的获取

#{}:是以预编译的形式,把餐宿设置到sql语句中,Prepared Statement,防止sql注入

${}:取出的值直接拼装到sql语句中;会有安全问题

在大多情况下,我们取出参数的值都应该去使用#{}

比如分表排序,按照年份分表拆分:

  select * from ${year}_salary where xxx;

  select * from tab_employee order by ${f_name} ${order}

#{}:更丰富的用法:

  规定参数的一些规则

    javaType,jdbcType,mode(存储过程),numericScale,resultMap,typeHander,jdbcTypeName,expression(未来准备支持的功能)

  jabcType通常需要在某种特定的条件下被设置:如:#{email,jdbcType=NULL}

    在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理,比如Oracle(报错)

    JdbcType OTHER,无效的类型,因为mybatis对所有的null都映射的是原声Jdbc的OTHER类型,oracle不能正确处理。

5.缓存机制

MyBatis包含了一i个非常强大的查询缓存特性,缓存可以极大的提升查询效率。

MyBatis系统中默认定义了两级缓存

  1.默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启

  2.二级缓存需要手动开启配置,它是基于namespace级别的缓存

  3.为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过Cache接口来自定义二级缓存

 5.1两级缓存

一级缓存(本地缓存):与数据库同一次会话期间查询到的数据会放在本地缓存中,如若以后需要再次获取相同的数据,直接从缓存中取。

注:一级缓存作为SqlSession级别的缓存,所以一级缓存之间不互通。

  一级缓存失效情况(没有使用到当前以及缓存情况,效果就是,还是需要再向数据库发出查询)

    1.sqlSession不同

    2.SQL Session相同,查询条件不同

    3.SQL Session相同,两次查询之间执行了增删改查

    4.SQL Session相同,手动清除了一级缓存(缓存清空)

二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存

  工作机制:

    1.一个会话,查询一条数据,这个数据就会被放在房前会话的一级缓存中

    2.入股偶会话关闭,一级缓存中的数据就会被保存到二级缓存中,新的会话查询,就可以参照二级缓存中的内容

    3.SQL Session===》Employee Mapper==》Employee

              Department Mapper==》Department

      不同的namespace查出的数据会放在自己对应的缓存中(map)

6.工作原理

MyBatis

相关推荐