mybatis_基础知识点(面试)

参考文档:https://www.jianshu.com/p/e8f294f6704b?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin

1.如何防止sql注入?

  使用#{}方式进行取值:采用的是参数预编译的方式,参数的位置使用?进行替代,不会出现sql注入的问题
  使用${}方式进行取值:采用的是直接跟sql语句进行拼接的方式  

  如果我们的sql语句中的某些值不支持参数预编译,那么就必须要使用${}的方式来取值了。

2、如何理解Mybatis?(Mybatis是什么)

  Mybatis内部封装了jdbc,开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

  mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

3、Mybatis 中一级缓存与二级缓存的区别?

  一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。
  二级缓存 二级缓存是mapper级别的,Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。

  工作机制:

         1、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;
         2、如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容;
         3、不同namespace查出的数据会放在自己对应的缓存中(map)
             效果:数据会从二级缓存中获取
        查出的数据都会被默认先放在一级缓存中。
        只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中

    开启全局二级缓存配置:<setting name="cacheEnabled" value="true"/>

4.什么是SqlSession?
  • 一切Mybatis配置都是为了创建SqlSession进行SQL查询;
  • 归根结底程序代码中我们屏蔽了各种配置映射,只显式调用使用Mapper接口,那么接口实现类的获得是通过SqlSession.getMapper()获得;
  • 那么mapper接口实现类的获得是通过mybatis-config.xml->SqlSessionFactoryBuilder->SqlSessionFacotry->SqlSession->mapper;

  sqlSession级别的缓存。(相当于一个方法内的缓存),每一次会话都对应自己的一级缓存,作用范围比较小,一旦会话关闭就查询不到了;

5、使用 MyBatis 的 mapper 接口调用时有哪些要求?

  A. Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同
  B. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
  C. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同
  D. Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径

6、简述一下Mybatis 的编程步骤

  A.创建 SqlSessionFactory
  B.通过 SqlSessionFactory 创建 SqlSession
  C.通过 sqlsession 执行数据库操作
  D.调用 session.commit()提交事务
  E.调用 session.close()关闭会话

7、MyBatis中接口绑定有几种实现方式,是怎么实现的?

  A.通过注解绑定,在接口的方法上面加上 @Select@Update等注解里面包含Sql语句来绑定(Sql语句比较简单的时候,推荐注解绑定)
  B.通过xml里面写SQL来绑定, 指定xml映射文件里面的namespace必须为接口的全路径名(SQL语句比较复杂的时候,推荐xml绑定)

 

 

 

 

 

posted @ 2020-11-26 14:06  c++c鸟  阅读(211)  评论(0编辑  收藏  举报