1.什么是MyBatis
1.MyBatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写sql语句。
2.MyBatis可以使用xml或注解来配置和映射原生信息,将POJO映射成数据库中的记录。
3.通过xml文件或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)
2.${}和#{}的区别
${}是字符串替换,MyBatis在处理${}时就是把${}直接替换成变量的值。
#{}是预处理,MyBatis在处理#{}时,会将sql中的#{}替换成?(占位符),调用PrepareStatement的set方法来赋值。使用#{}可以有效防止sql注入,提高系统安全性。
3.Dao接口的工作原理
Dao接口的工作原理的JDK动态代理,MyBatis运行时会使用JDK动态代理为Dao接口生成代理对象proxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql结果返回。
4.MyBatis的Xml映射文件配置
namespace = Dao接口的全限定类名
id = 方法名
使用namespace+id进行唯一定位
5.MyBatis分页插件原理
分页插件的基本原理是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
6.MyBatis是如何将sql执行结果封装为目标对象并返回的?
1.使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
2.数据库命名时列名与对象属性名一致,或使用sql列的别名功能,将列的别名写为对象属性名。有了列名和属性名的映射关系后,MaBatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,无法完成赋值。
7.MyBatis动态sql
MyBatis提供了9种动态sql标签:trim where set foreach if choose when otherwise bind
执行原理:根据表达式的值完成逻辑判断,动态拼接sql
8.使用MyBatis的Dao接口调用时的要求
1.mapper.xml文件中namespace是Dao接口的全限定类名
2.mapper.xml文件中每个sql的id要与Dao接口的方法名一致
3.mapper.xml文件中每个sql的parameter是Dao接口方法的参数类型
4.mapper.xml文件中每个sql的resultType是Dao接口方法的返回值类型
9.在mapper中如何传递多个参数?
1.使用@param注解
例:
//Dao接口
public interface testMapper{
public user test(@param("name" String name,@param(pwd) string pwd));
}
//mapper映射文件
<select id="test" resultType="user">
select * from user_table where name=#{name} and pwd = #{pwd}
</select>
2.将多个参数封装成map
10.MyBatis的接口绑定
接口绑定就是在MyBatis中任意定义接口,然后接口里面的方法和sql语句绑定,我们直接调用接口方法,无需写实现类。
接口绑定实现方法:
1.通过注解绑定
2.通过xml配置文件绑定
11.如何获取自动生成的(主)键值?
在标签中使用 usegeneratedkeys=“true” keyproperty=“id”
示例:
//sql语句:
<insert id="test" usegeneratedkeys="true" keyproperty="id">
insert into (name) values (#{name})
</insert>
//在insert对应的类中直接getId就能获取新增值的id
12.一对一、一对多的关联查询
使用resultMap进行关联映射
13.MyBatis优缺点
优点:
1.基于sql语句编程,灵活,可编写动态sql
2.与JDBC相比,减少了50%以上的代码量,消除了冗余的代码,不需要手动开关连接
3.很好的与更种数据库兼容
4.能够与spring很好的集成
5.支持对象与数据库的ORM字段映射
缺点:
1.sql语句编写工作量大
2.sql语句依赖于数据库,导致数据库移植性差,不能随意更换数据库