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 中一级缓存与二级缓存的区别?
工作机制:
1、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;
2、如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容;
3、不同namespace查出的数据会放在自己对应的缓存中(map)
效果:数据会从二级缓存中获取
查出的数据都会被默认先放在一级缓存中。
只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中
开启全局二级缓存配置:<setting name="cacheEnabled" value="true"/>
- 一切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绑定)