1.什么是MyBatis?
1)Mybatis是一个半ORM框架,他内部封装了JDBC加载驱动,创建连接,创建statement等繁杂的过程,开发者只需要关注如何编写SQL语句,可以严格控制SQL执行性能,灵活性高
2)作为一个半ORM框架,MyBatis可以使用XML或注解来配置和映射原生信息,将pojo映射成数据库中的记录,避免了几乎所有JDBC代码和手动设置参数和获取结果集
3)通过XML或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射为java对象并返回
2.为什么说MyBatis是半自动ORM映射?
MyBatis在查询关联对象或关联集合对象时,需要手动编写sql语句完成
Hibernate是一种全自动ORM映射工具,Hibernate查询关联对象或者关联集合对象时,可以根据对象关系–模型直接获取。
3.MyBatis的优缺点
优点
1)基于SQL语句编程,相当灵活,不会对应用程序数据库的现有设计造成影响,SQL写在XML里,解除了SQL与程序代码的耦合度,便于统一管理,提供XML标签,支持编写动态SQL,并可重用
2)很好的与数据库兼容(因为MyBatis使用JDBC来连接数据库,所以JDBC支持的数据库MyBatis都支持)
3)与JDBC相比,消除了JDBC大量冗余的代码
4)能与Spring很好的集成
5)提供映射标签,支持对象与数据库的字段关系映射
缺点:
1)SQL语句的编写工作量大
2)SQL语句依赖数据库,导致数据库移植性差,不能随意更换数据库
4.通常一个mapper.xml文件,都会对应一个Mapper接口,这个Mapper接口的工作原理是什么?Mapper接口里的方法,参数不同时,方法能重载吗?
Mapper接口的工作原理是JDK动态代理,MyBatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,根据接口的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的SQL,然后将SQL执行结果返回
Mapper接口里方法是不能重载的,因为是使用 接口的全限定名+方法名 的保存和寻找策略,接口全限定名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement
在MyBatis中,每一个SQL标签,比如 <select> <insert> <delete>标签,都会被解析为一个MapperStatement对象
接口的全限定名:映射文件中的namespace的值
接口的方法名:映射文件中MapperStatement对象的id
5.MyBatis的XML映射文件中,不同的XML映射文件,id是否可以重复
如果在映射文件中配置了namespace,则id可以重复,没有配置namespace,则不可以重复
6.MyBatis的延迟加载
MyBatis仅支持accociation关联对象和collection关联集合对象的延迟加载,在MyBatis的核心配置文件中,可以配置是否启用延迟加载
lazyLoadingEnabled=true|false
7.MyBatis的一、二级缓存
一级缓冲:基于SqlSession上的缓存,默认开启。在操作数据库时需要创建SqlSession对象,在SqlSession对象中就有一个HashMap用来存储缓存数据,如果SqlSession执行了增删改操作,并且比较到了数据库,则缓存会刷新
二级缓存:基于mapper上的缓存,同样使用HashMap存储缓存数据
开启二级缓存:现在MyBatis核心配置文件中的setting标签中设置cacheEnabled为true,再在要开启二级缓存的mapper映射文件下添加<cache/>标签,开启缓存,缓存中javabean对象必须实现序列化接口,因为二级缓存未必完全使用内存,有可能占用磁盘文件
在commit或close时将数据放入二级缓存
如果要在加入cache元素的前提下让个别的select语句不使用二级缓存,可通过参数来设置
useCache控制当前sql语句是否启用缓存
flushCache控制当前sql语句执行一次后是否刷新缓存
八、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用<resultMap>标签,逐一定义数据库列名与对象属性名之间的映射关系
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回
九、Mybatis动态sql有什么用?执行原理?有哪些动态sql?
MyBatis动态SQL可以在xml映射文件内,以标签的形式编写动态sql
执行原理:根据表达式的值,完成逻辑判断,并动态拼接sql的功能
有 if|where|choose|set|trim|foreach|bind|when|otherwise
十、xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
resuleMap|sql|include|动态sql的9个标签
其中<sql>为sql片段标签,通过<include>标签引入sql片段
十一、使用MyBatis的mapper接口调用时有哪些要求?
- Mapper中接口的方法名和mapper.xml中的sql的id相同
2)Mapper接口中的输入参数类型和mapper.xml中定义的sql的parameterType的类型相同
3)Mapper接口中的输出参数类型mapper.xml中定义的sql的resultType的类型相同
4)Mapper.xml文件中的namespace必须是mapper接口的类路径
十二、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
1)通过在查询的sql语句中定义字段的别名,让字段名的别名和实体类的属性名相同
2)通过<resultMap>标签来映射字段名和实体类属性名一一对应的关系
十三、如何获取自动生成的(主)键值?
在<insert>中设置以下参数:
useGeneratedKeys 返回数据库帮我们生成的主键
keyProperty 生成的主键用我们对象的那个属性存储