一 Mybatis基础
1.1 mybatis是什么
mybatis是一个半对象关系映射框架,内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动,创建连接等复杂过程。程序员直接编写原生态sql,灵活度高
可以使用xml或注解来配置和映射原生信息,将POJO映射成数据库中的记录
ORM对象关系映射,是一种为了解决关系型数据库与简单java对象的映射关系的技术
1.2 为什么说Mybatis是半自动ORM映射工具?它和全自动的区别在哪里?
Mybatis在查询关联对象或关联对象集合对象时,需要手动编写Sql来完成,所以称之为半自动ORM映射工具
1.3 JDBC编程有哪些不足之处,Mybatis是如何解决的
1 数据库连接创建、释放频繁造成系统资源浪费影响系统性能,在mybatis配置文件中配置数据连接池,使用连接池统一管理数据库连接
2 sql语句写在代码中不易维护,mybatis将sql语句写在mapper文件中与java代码分离
3 向sql语句传参困难,因为sql语句where条件不一定,可能多可能少,占位符需要和参数一一对应。mybatis自动将java对象映射至sql语句
4 mybatis能自动将sql执行结果映射至java对象
1.4 mybatis使用过程?生命周期?
创建sqlsessionfactory
通过sqlsessionfactory创建sqlsession
通过sqlsession获取mapper执行sql
如果是事务可以调用sqlsession.commit提交事务
close关闭事务
Mybatis通常也是spring集成使用,一般由spring管理其生命周期
1.5 在mapper中如何传递多个参数?
顺序传参、@param传参、map传参、Java Bean传参
public User selectUser(String name,int deptID)
where user_name = #{0} and dept_id =#{1}
@param 传参
public User selectUser(@param (“username”)String name,@param (“ID”)int deptID)
where user_name = #{username} and dept_id =#{ID}
Map传参
public User selectUser(Map<String,object>params)
where user_name = #{username} and dept_id =#{ID}
#{Map的key名称}
JavaBean传参
public User selectUser(User user)
where user_name = #{username} and dept_id =#{ID} username和id是其字段名称
1.6 实体类属性和表中字段名不一样,怎么办?
1通过在查询时候SQL语句中定义字段的别名,让字段名别名和实体类的属性名一致
2通过resultmap中的result来映射字段名和实体类名属性一一对应的关系
1.7 #{}和${}的区别
#{}和${}是两种不同的占位符,#{}是预编译的,另一个是字符串替换
#{}可以有效防止sql注入
1.8 模糊查询like语句该怎么写?
可以使用concat函数
select * from person where username like concat("%",#{},"%");
1.9 mybatis能执行一对一,一对多的关联查询吗
支持,还支持多对多,多对一的关联查询
association 和 collection
1.10 Mybatis是否支持延迟加载?原理?
mybatis支持association关联对象和collection关联集合对象的延迟加载,association指的是一对一,collection指的是一对多。在配置文件中,可以配置是否启用延迟加载
原理是使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法
1.11 Mybatis支持动态SQL吗?
mybatis有一些支持动态sql的标签,if、where、foreach、set
choose<when,otherwise> 和java的switch语句有点像
where可以用在所有的查询条件都是动态的情况
set可以用在动态跟新的时候
1.12 mybatis如何进行批量操作
第一种方法 使用foreach标签
使用ececutor.batch
1.13 说一说mybatis的一级、二级缓存
mybatis的一级缓存基于perpetualcache的hashmap本地缓存,其存储作用域为sqlsession,各个sqlsession之间的缓存相互隔离。当session close之后,该sqlsession中的所有cache清除
二级缓存与一级缓存机制相同,也采用的是perpetualcache,hashmap存储,作用域为namespace,可以在多个sqlsession共享,默认不打开二级缓存
2 原理
2.1 说一说Mybatis的工作原理
1.读取mybatis-config.xml的配置文件、加载映射文件、生成一个配置对象
2.构建会话工厂:通过配置信息构建sqlsessionfactory
3.创建会话对象:由工厂创建sqlsession对象,该对象中包含了执行sql语句的所有方法
4.executor:mybatis底层定义了一个excutor接口来操作数据库,根据sqlsession传递的参数动态生成需要执行的sql语句,同时复制查询缓存的维护
5.statementhandler:数据库会话器,串联起参数映射的处理和运行结果映射的处理
6.参数处理:对输入参数的类型进行处理,并预编译
7.处理结果:对返回结果的类型进行处理,根据对象映射规则,返回相应对象
2.2 Mybatis的功能架构是什么样的
架构分为三层:
1 API接口层:接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理
2 数据处理层:负责完成SQL查找、解析、SQL执行和执行结果映射处理等
3 基础支撑层:负责最基础功能的支撑,包括连接管理,事务管理,配置加载和缓存处理
2.3 为什么mapper接口不需要实现类
mapper映射通过动态代理来实现
2.4 mybatis都有哪些执行器
有三种基本的执行器:simpleexcutor、reuserexecutor、batchexecutor
2.5 mybatis是如何进行分页的
mybatis使用Rowbounds对象进行分页
2.6 JDBC的执行步骤
JAVA 数据库连接,是一个用于执行SQL语句的API,通常包括以下步骤:
1.加载数据库驱动
2.建立连接,拿到connection对象
3.创建statement对象
4.执行sql语句
5.处理结果集
6.关闭资源
2.7 什么是SQL注入?如何防止SQL注入
在输入字段中插入专用的SQL语句,从而欺骗数据库执行恶意SQL