1、举例说明什么是持久化。
答案:
持久化是将程序数据在持久状态和瞬时状态间转换的机制。JDBC 就是一种持久化机制,文件 IO 也是一种持久化机制。
2、举例说明什么是对象关系映射。
答案:
持久状态的数据一般保存在数据库中,是一种关系模型,如,用户数据保存在 user 表里,userName 字段保存用户的名称,birthday 字段保存用户的出生日期。一条数据库记录对应一个用户。瞬时的数据一般以面向对象的方式被组织,并保存在内存中,如,对应于 user 表,有 User 类,User 类有 userName 属性和 birthday 属性,对应 user 表的 userName 字段和birthday 字段。关系型数据和对象数据间存在着天然的映射关系,这种映射关系称为“对象—关系映射”,又称为 ORM。
3、谈谈 resultType 和 resultMap 的区别和具体的应用场景。
答案:
resultType:将查询结果按照 sql 列名 pojo 属性名一致性映射到 pojo 中。场景:查询用户信息。
resultMap:使用 association 和 collection 完成一对一和一对多高级映射(对结果有特殊的映射要求)。场景:查询订单及关联用户信息,查询用户权限范围模块及模块下的菜单。
4、谈谈 Mybatis 一级缓存和二级缓存的区别。
答案:
一级缓存是 SqlSession 级别的缓存。在操作数据库时需要构造 sqlSession 对象,在对象中有一个数据结构用于存储缓存数据。不同的 sqlSession 之间的缓存数据区域是互相不影响的。也就是只能作用在同一个 sqlSession 中,不同的 sqlSession 中的缓存是互相不能读取的。二级缓存是 mapper 级别的缓存,多个 SqlSession 去操作同一个 Mapper 的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。Mapper 有一个二级缓存区域(按 namespace 分),其它 mapper 也有自己的二级缓存区域(按 namespace 分)。每一个namespace 的 mapper 都有一个二级缓存区域,两个 mapper 的 namespace 如果相同,这两个 mapper 执行 sql 查询到数据将存在相同的二级缓存区域中。
5、说明如何使用 foreach、来完成复杂查询以及它的应用场景。
答案:
对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成,MyBatis 入参为数组类型或者 List、Map,使用 foreach 标签来实现 SQL 条件的迭代。使用 foreach 可指定一个集合,并指定开始和结束的字符,也可加入一个分隔符到迭代器中,并能够智能处理该分隔符,不会出现多余的分隔符。
6、说明 Mybatis 集合参数入参如何处理。
答案:无论 MyBatis 的入参是哪种参数类型,MyBatis 都会将参数放在一个 Map 中:
若入参为 List:默认“list”作为 key,该 List 即为 value
若入参为数组:默认“array”作为 key,该数组即为 value
若入参为 Map:键值不变通过 foreach 标签去实现 SQL 条件的迭代。
7、说出 3 个动态 SQL 的组合及其作用。
答案:
if+set:完成按条件更新操作
if+where:完成多条件查询
if+trim:完成多条件查询或更新操作,可替代 if+set 或 if+where
choose+when+otherwise:完成条件查询(多条件下,选择其一)
foreach:完成复杂查询,主要用于 in 条件查询中,迭代集合。
8、谈谈控制反转和依赖注入的区别和原理。
答案:
控制反转:创建对象实例的控制权从代码控制剥离到 IOC 容器控制。
依赖注入:创建对象实例时,为这个对象注入属性值或其它对象实例。
原理:以文件流读取配置文件,再通过反射创建对象并赋值。
9、什么是 AOP,以及 AOP 涉及的设计模式。
答案:
AOP(面向切面编程),简单地说就是在不改变原程序的基础上为代码段增加新的功能,对代码进行增强处理。它的设计思想来源于代理设计模式中的动态代理。
10、请简述在数据库事务中什么是脏读,并举例说明。
答案:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是