MyBatis八股文
1、MyBatis
MyBatis是半自动化ORM框架,它内部封装了JDBC,加载驱动,创建连接,创建statement等繁杂的操作,开发时,只需要关注如何编写SQL语句即可。
MyBatis使用XML和注解来配置和映射原生信息,将POJO映射成数据库中的记录。
2、MyBatis的优缺点
基于SQL语句的编程,相当灵活,不会对应用程序和数据库的现有设计造成任何影响;
与JDBC相比,减少了一半的代码量,消除JDBC大量冗余的代码,不需要手动开关连接;
能够很好的与各种数据库兼容;
能够与Spring很好的集成;
提供映射标签,支持对象和数据库的ORM字段关系映射。
缺点:
SQL语句的编写工作量较大,在字段多,关联表多时,对开发人员编写SQL功底有一定的要求;
SQL语句依赖于数据库,可移植性差。
3、为什么说MyBatis是半自动ORM映射工具,和全自动的区别在哪?
MyBatis是半自动ORM框架,在查询关联对象或者关联集合对象时,需要手动编写SQL来完成;
Hibernate是全自动ORM框架,在查询关联对象或者关联集合对象时,根据对象关系模型直接获取。
4、MyBatis、Hibernate的区别
MyBatis是半自动ORM框架,Hibernate是全自动ORM框架;
Hibernate对SQL语句封装,提供了日志、缓存、级联等特性,提供HQL操作数据库,支持数据库无关性,SQL语句优化比较困难;MyBatis需要手动编写SQL,支持动态SQL,不支持数据库无关性,SQL语句优化比较容易。
MyBatis是轻量级框架,学习门槛低,Hibernate是重量级框架,学习门槛高。
5、JDBC编程有哪些不足,MyBatis是如何解决这些问题的?
1、数据库连接的创建、释放频繁造成系统资源浪费从而影响系统性能;
配置数据库连接池,使用数据库连接池管理数据库连接;
2、SQL语句写在代码中造成代码不易于维护;
将SQL语句配置在mapper.xml文件与java代码分离;
3、向SQL语句传参麻烦;
MyBatis自动将java对象映射到SQL语句;
4、对象结果解析麻烦;
MyBatis自动将java对象映射到SQL语句;
6、MyBatis编程步骤
创建SqlSessionFactory;
通过SqlSessionFactory创建SqlSession;
通过SqlSession执行数据库操作;
调用Session.commit()提交事务;
调用Session.close()关闭会话。
7、#{} 和 ${}的区别?
1、#{}是占位符,预编译处理;
${}是拼接符,字符串替换;
2、#{}传入参数以字符串传入,会将SQL中#{}替换为?;
${}是原值传入;
3、#{}可以防止SQL注入,提高系统安全性;
${}不能防止SQL注入;
4、#{}的变量替换是在DBMS中;
${}的变量替换是在DBMS外。
8、通常一个XML映射文件,都会写一个DAO接口与之对应,那么这个DAO接口的工作原理是什么?DAO接口里的方法、参数不同时,方法能重载吗?
DAO接口即Mapper接口,接口的全类名是XML映射文件的namespace;接口的方法名是xml映射文件的Statement的id值;接口方法中的参数是传递给SQL的参数;当调用接口方法时,接口全类名+方法名拼接字符串作为key,可以唯一定位一个MapperStatement。
9、在Mapper中如何传递多个参数?
1、DAO层函数有多个参数,其对应的xml中,#{0}代表DAO层中的第一个参数,以此类推;
2、在DAO层的参数中加@Param注解,注解内的参数名即为Mapper中的参数名;
3、多个参数封装成Map,以HashMap的形式传递到Mapper中。
10、MyBatis的动态SQL有什么用,执行原理是什么,有哪些动态SQL?
MyBatis动态SQL可以在xml映射文件内,以标签的形式编写SQL,执行原理是根据表达式的值完成逻辑判断,并动态拼接SQL的功能。
11、xml映射文件中,不同的xml映射文件id是否可以重复?
不同的xml映射文件id可以重复;同一的xml映射文件id不可以重复。当调用接口方法时,接口全类名+方法名拼接字符串作为key,可以唯一定位一个MapperStatement。
12、MyBatis实现一对一的方式
联合查询,嵌套查询。
13、MyBatis的一级缓存、二级缓存
一级缓存,默认开启,基于HashMap的本地缓存,存储作用域为Session;
二级缓存:默认关闭,HashMap存储,存储作用域为Mapper,通过序列化接口开启二级缓存。
14、使用MyBatis的Mapper接口调用时有哪些要求?
1、Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
2、Mapper接口的输入参数和mapper.xml中定义的每个sql的parameterType相同;
3、Mapper接口的输入参数和mapper.xml中定义的每个sql的resultType相同;
4、Mapper的类路径和mapper.xml中的namespace相同。