尚医通项目总结(二)----------Mybatis与Mybatis Plus

  Mybatis是持久层解决方案,它是一个半自动化的ORM框架,底层封装了JDBC,可以简化对数据库的增删改查操作。Mybatis的半自动体现在,在查询关联对象或者关联集合对象时,需要手动编写sql来完成。

  Mybatis-Plus是Mybatis的增强工具,是为简化开发、提高效率而生的。使用mp不用写sql语句也不用写xml文件,直接新建接口继承BaseMapper,使用时直接调用BaseMapper中封装好的方法即可。简单的条件查询可以直接使用封装好的方法,当条件复杂时,可以使用QuerryMapper写条件语句。

  本人目前的面试中没有遇到过与项目结合的问题,都是一些常见的问题,在此列出,以供交流学习。

1.#{} 和 &{}的区别是什么

  #{}是预编译处理,${}是字符串替换。

  Mybatis在处理#{}时,会将sql中的#{}替换为?,调动PreparedStatement的set方法赋值;在处理${}时就是将其替换成变量的值。因此使用#{}可以防止SQL注入,提高系统的安全性,而${}则会造成SQL注入问题。

2.Mybatis的一级、二级缓存

  1)一级缓存:基于PerpetualCache的HashMap本地缓存,其缓存作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。

  2)二级缓存:二级缓存和一级缓存的机制相同,区别在于缓存作用域,其缓存作用域为Mapper(Namespace),并且可以自定义存储源,如Ehcache。默认不打开二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>  

  3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

3.通常一个xml映射文件都会写一个Dao接口与之对应,此Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,可以重载吗?

  Dao 接口,就是人们常说的 Mapper 接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名,就是映射文件中 MappedStatement 的 id 值,接口方法内的参数,就是传递给 sql 的参数。 Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个 MappedStatement ,举例: com.mybatis3.mappers. StudentDao.findStudentById ,可以唯一找到 namespace 为 com.mybatis3.mappers. StudentDao 下面 id = findStudentById 的 MappedStatement 。在 MyBatis 中,每一个 <select> 、 <insert> 、 <update> 、 <delete> 标签,都会被解析为一个 MappedStatement 对象。

  Dao接口里的方法可以重载,但是Mybatis的XML里的ID不允许重复。

  Dao接口方法可以重载,但是需要满足以下条件:

    1.仅有一个有参方法和一个午餐方法

    2.多个有参方法时,参数数量必须一致。且使用相同的@Param,或者使用param1这种。

 

更多问题参考:MyBatis 常见面试总结 | JavaGuide

posted @ 2022-05-31 22:10  啵啵ray  阅读(608)  评论(0编辑  收藏  举报