1.什么是Mybatis?
优秀的持久层框架,一个半ORM对象关系映射.支持定制SQL,存储过程,高级映射,避免了JDBC代码手动设置参数和获取结果集
2.什么是ORM?
ORM对象关系映射.解决关系型数据库和JAVA对象POJO的映射关系的技术.
ORM就是描述对象和关系型数据库映射的元数据,将程序中的对象自动持久化到关系型数据库.
3.为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成
4.Mybatis的编程步骤是什么?
创建sqlSessionFactory
通过sqlSessionFactory创建sqlSession对象
通过sqlSession执行数据库操作
调用sqlSession.commit()提交事务
调用sqlSession.close()关闭会话
5.请说说mybatis的工作原理?
工作原理
读取mybatis-config.xml全局配置文件,配置了mybatis的运行环境,例如数据库连接信息
加载映射文件,sql映射文件.需要在mybatis-config.xml中加载.,mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表
构建会话工厂sqlSessionFactory ,通过mybatis的环境等配置信息构建会话工厂
创建会话对象,sqlSession对象,该对象中包含了执行sql语句中的所有方法
Executor执行器 mybatis的底层定义了一个Executor接口来操作数据库.它将sqlsession传递的参数动态生成需要执行的SQL语句,同时负责查询缓存的维护.
MappedStatement对象,在executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息封装.用于存储要映射信息的id,参数等
输入参数映射 可以是Map,List,也可以是POJO,基本数据类型
输出参数映射
6.为什么需要预编译?
预编译是指: 数据库驱动在发送sql语句和参数给DBMS前,对SQL语句进行编译,这样DMBS执行sql语句时,不需要重新编译
数据库管理系统(DBMS)
JDBC 中使用对象 PreparedStatement 来抽象预编译语句.优化sql执行,
预编译阶段可以合并多次操作为一个操作。同时预编译语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个SQL,可以直接使用这个缓存的 PreparedState 对象。
Mybatis默认情况下,将对所有的 SQL进行预编译。
7.Mybatis都有哪些Executor执行器?它们之间的区别是什么?
8.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
AOP默认是 proxy-target-class=false为JDK代理 基于接口实现
JDK动态代理:
利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,
在调用具体方法前调用InvokeHandler来处理。
CGLiB动态代理:
利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
@@@@
mybatis仅支持association关鸾对象和collection关联集合对象的延迟加载,association是一对一, collection是一对多
在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
mybatis的实现原理是:使用建CGLIB创建目标对象的代理对象,当调用目标方法时,调用a.getB().getName()
进入拦截器方法,invoke(),发现a,getB() 为null, 那么就会单独发送事先保存好的查询关联B的sql,a.setB(b) 于是a的对象B就有值了.,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。
9. #{}和${}有什么区别?
#{}占位符,预编译处理
${}拼接符,字符串替换,没有预编译处理,#{}传入参数是以字符串传入的,会将sql中的#{}替换为? 号,调用JDBC的sql注入set方法
变量替换后, #{}对应的变量自动加上单引号, ${}不会添加
#{}有效防止sql注入,安全
#{} 变量替换 在DBMS内, ${}在DBMS外
10.模糊查询like语句该怎么写?
11.在mapper中如何传递多个参数?
使用@Param注解传参. #{}里面的名称对应的是注解@Param括号里面修饰的名称
Map传参 : #{}里面的名称对应的是Map里面的key名称。
JavaBean传参 #{}里面的名称对应的是User类里面的成员属性。
这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性
强,业务逻辑处理方便,推荐使用。
12.Mybatis如何执行批量操作?
13.