Q1:Mybatis 的优缺点?
优点
相⽐ JDBC 减少了⼤量代码量,减少冗余代码。
使⽤灵活,SQL 语句写在 XML ⾥,从程序代码中彻底分离,降低了耦合度,便于管理。
提供 XML 标签,⽀持编写动态 SQL 语句。
提供映射标签,⽀持对象与数据库的 ORM 字段映射关系。
缺点
SQL 语句编写⼯作量较⼤,尤其是字段和关联表多时。
SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
Q2:Mybatis 的 XML ⽂件有哪些标签属性?
select 、 insert 、 update 、 delete 标签分别对应查询、添加、更新、删除操作。
parameterType 属性表示参数的数据类型,包括基本数据类型和对应的包装类型、String 和 Java
Bean 类型,当有多个参数时可以使⽤ #{argn} 的形式表示第 n 个参数。除了基本数据类型都要以全
限定类名的形式指定参数类型。
resultType 表示返回的结果类型,包括基本数据类型和对应的包装类型、String 和 Java Bean 类型。
还可以使⽤把返回结果封装为复杂类型的 resultMap 。
Q3:Mybatis 的⼀级缓存是什么?
⼀级缓存是 SqlSession 级别,默认开启且不能关闭。
操作数据库时需要创建 SqlSession 对象,对象中有⼀个 HashMap 存储缓存数据,不同 SqlSession 之
间缓存数据区域互不影响。
⼀级缓存的作⽤域是 SqlSession 范围的,在同⼀个 SqlSession 中执⾏两次相同的 SQL 语句时,第⼀次
执⾏完毕会将结果保存在缓存中,第⼆次查询直接从缓存中获取。
如果 SqlSession 执⾏了 DML 操作(insert、update、delete),Mybatis 必须将缓存清空保证数据有
效性。
Q4:Mybatis的⼆级缓存是什么?
⼆级缓存是Mapper 级别,默认关闭。
使⽤⼆级缓存时多个 SqlSession 使⽤同⼀个 Mapper 的 SQL 语句操作数据库,得到的数据会存在⼆级
缓存区,同样使⽤ HashMap 进⾏数据存储,相⽐于⼀级缓存,⼆级缓存范围更⼤,多个 SqlSession
可以共⽤⼆级缓存,作⽤域是 Mapper 的同⼀个 namespace,不同 SqlSession 两次执⾏相同的
namespace 下的 SQL 语句,参数也相等,则第⼀次执⾏成功后会将数据保存在⼆级缓存中,第⼆次可
直接从⼆级缓存中取出数据。
要使⽤⼆级缓存,需要在全局配置⽂件中配置
,再在对应的映射⽂件中配置⼀个 标签。
Q5:Mybatis #{} 和${} 的区别?
使⽤ ${} 相当于使⽤字符串拼接,存在 SQL 注⼊的⻛险。
使⽤ #{} 相当于使⽤占位符,可以防⽌ SQL 注⼊,不⽀持使⽤占位符的地⽅就只能使⽤ ${} ,典型
情况就是动态参数。
Q6:ORM 是什么?
ORM 即 Object-Relational Mapping ,表示对象关系映射,映射的不只是对象的值还有对象之间的关
系,通过 ORM 就可以把对象映射到关系型数据库中。操作实体类就相当于操作数据库表,可以不再重
点关注 SQL 语句。
Q7:JPA如何使⽤?
只需要持久层接⼝继承 JpaRepository 即可,泛型参数列表中第⼀个参数是实体类类型,第⼆个参数是
主键类型。
运⾏时通过 JdkDynamicAopProxy 的 invoke ⽅法创建了⼀个动态代理对象
SimpleJpaRepository , SimpleJpaRepository 中封装了 JPA 的操作,通过 hibernate (封装了
JDBC)完成数据库操作。
Q8:JPA 实体类相关注解有哪些?
@Entity :表明当前类是⼀个实体类。
@Table :关联实体类和数据库表。
@Column :关联实体类属性和数据库表中字段。
@Id :声明当前属性为数据库表主键对应的属性。
@GeneratedValue : 配置主键⽣成策略。
@OneToMany :配置⼀对多关系,mappedBy 属性值为主表实体类在从表实体类中对应的属性名。
@ManyToOne :配置多对⼀关系,targetEntity 属性值为主表对应实体类的字节码。
@JoinColumn :配置外键关系,name 属性值为外键名称,referencedColumnName 属性值为主表主
键名称。
Q9:对象导航查询是什么?
通过 get ⽅法查询⼀个对象的同时,通过此对象可以查询它的关联对象。
对象导航查询⼀到多默认使⽤延迟加载的形式,