尚医通项目总结(二)----------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