美文网首页
MyBatis基础知识

MyBatis基础知识

作者: jiahzhon | 来源:发表于2020-10-15 16:13 被阅读0次

Mybatis 与 Hibernate 有哪些不同

  • Mybatis 和 hibernate不同,它不完全是一个ORM框架,因为MyBaits需要程序员编写sql语句。
  • Mybaits直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁, - 但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
  • Hibernate 对象/关系映射能力强,数据无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

#{}和${}

*#{} : 根据参数的类型进行处理,比如传入String类型,则会为参数加上双引号。#{} 传参在进行SQL预编译时,会把参数部分用一个占位符 ? 代替,这样可以防止 SQL注入。
*${} : 将参数取出不做任何处理,直接放入语句中,就是简单的字符串替换,并且该参数会参加SQL的预编译,需要手动过滤参数防止 SQL注入

例如:
1、#对传入的参数视为字符串,也就是它会预编译,select * from user where user_name=${rookie},比如我传一个rookie,那么传过来就是 select * from user where user_name = ‘rookie’

2、不会将传入的值进行预编译,select * from user where user_name= {rookie},那么传过来的sql就是:select * from user where user_name=rookie;

一级缓存和二级缓存

  • 区别:一级缓存的作用域是一个sqlsession内;二级缓存作用域是针对mapper进行缓存.

  • 一级缓存:

1、第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。

2、如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

3、第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

小结:一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)。

  • 二级缓存

1、MyBatis 一级缓存最大的共享范围就是一个SqlSession内部,那么如果多个 SqlSession 需要共享缓存,则需要开启二级缓存.

2、当二级缓存开启后,同一个命名空间(namespace) 所有的操作语句,都影响着一个共同的 cache,也就是二级缓存被多个 SqlSession 共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

3、不管是不是相同的session,只要mapper的namespace相同,可能共享缓存,要求:如果开启了二级缓存,那么在关闭sqlsession后(close),才会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。

4.二级缓存其中缓存的是数据而不是对象,所以从二级缓存再次查询出得结果的对象与第一次存入的对象是不一样的。

5.还需要将要缓存的pojo实现Serializable接口,为了将缓存数据取出执行反序列化操作。

Snipaste_2020-10-15_15-41-35.png
  • 如何传多个数据


    Snipaste_2020-10-15_15-42-28.png

相关文章

网友评论

      本文标题:MyBatis基础知识

      本文链接:https://www.haomeiwen.com/subject/jrfopktx.html