1.使用mybatis的好处
1.它封装了底层jdbc的调用细节,并将返回结果转成javabean对象,大大简化了java数据库编程的工作;
2.mybatis将sql语句从代码中分离出来,单独放在xml中管理,程序员自己操作sql这样更加的灵活。
2.${}和#{}的区别
区别:#{}是预编译处理,${}是字符串替换。Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性。
3.当实体类中的字段名和表名字不一致时,该怎么处理?
1.通过查询的sql语句中定义别名,使别名和类名一致。
2.在<resultMap>
通过配置 property 和 column 属性来映射字段名和实体类别名之间的对应关系。
4.在mapper中如何传递多个参数
1.在dao的接口中添加。2.使用@param。
5.MyBatis的实现逻辑
1.在 MyBatis 的初始化过程中,会生成一个 Configuration 全局配置对象,里面包含了所有初始化过程中生成对象
2.根据 Configuration 创建一个 SqlSessionFactory 对象,用于创建 SqlSession “会话”
3.通过 SqlSession 可以获取到 Mapper 接口对应的动态代理对象,去执行数据库的相关操作
4.动态代理对象执行数据库的操作,由 SqlSession 执行相应的方法,在他的内部调用 Executor 执行器去执行数据库的相关操作
5.在 Executor 执行器中,会进行相应的处理,将数据库执行结果返回
6.Mapper接口的工作原理
在 MyBatis 的初始化过程中,每个一个 XML 映射文件中的、
7.Mapper接口的方法,参数不同时,方法能重载吗
Mapper接口里的方法,是不能重载的,因为是全限定名+方法名的保存和寻找策略。
8.如何获取自动生成的键值
不同的数据库,获取自动生成的(主)键值的方式是不同的,MySQL 有两种方式获取自动生成的键值,如下:
1.在
2.在
9.Mybatis动态sql和执行原理
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
Mybatis提供了9种动态sql标签:when|where|if|otherwise|foreach|trim|set|choose|bind。
其执行原理为:在 MyBatis 的初始化过程中的解析 SQL 过程中,会将定义的 SQL 解析成 SqlNode 对象,当需要执行数据库查询前,
需要根据入参对这些 SqlNode 对象进行解析,使用OGNL表达式计算出结果,然后根据结果拼接对应的 SQL 片段,以此完成动态 SQL 的功能。
10.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复
可以重复。Xml映射文件namespace不能为空。namespace+id是作为Map<String, MappedStatement>
的key使用的,不同的Xml映射文件namespace不一样,id是否可以重复。
11.mybatis的一级缓存和二级缓存
当MyBatis 地开启一个 SqlSession 会话时,都会创建一个 Executor 执行器对象
11.1 一级缓存
一级缓存在 Executor 执行器(SimpleExecutor)中有一个 Cache 对象中,默认就是一个 HashMap 存储缓存数据,执行数据库查询操作前,如果在一级缓存中有对应的缓存数据,则直接返回,不会去访问数据库。
默认的缓存区域为SESSION,表示开启一级缓存,可以设置为STATEMENT,执行完查询后会清空一级缓存,所有的数据库更新操作也会清空一级缓存。
缺陷:在多个 SqlSession 会话时,可能导致数据的不一致性,某一个 SqlSession 更新了数据而其他 SqlSession 无法获取到更新后的数据,出现数据不一致性,这种情况是不允许出现了,所以我们通常选择“关闭”一级缓存。
11.2 二级缓存
在 Executor 执行器(CachingExecutor)中有一个 TransactionalCacheManager 对象中,可以在一定程度上解决的一级缓存中多个 SqlSession 会话可能会导致数据不一致的问题,就是将一个 XML 映射文件中定义的缓存对象放在全局对象中,
对于同一个 Mapper 接口都是使用这个 Cache 对象,不管哪个 SqlSession 都是使用该 Cache 对象执行数据库查询操作前,如果在二级缓存中有对应的缓存数据,则直接返回,没有的话则去一级缓存中获取,如果有对应的缓存数据,则直接返回,不会去访问数据库。
缺陷:对于不同的 XML 映射文件,如果某个的 XML 映射文件修改了相应的数据,其他的 XML 映射文件获取到的缓存数据就可能不是最新的,也出现了脏读的问题,当然你可以所有的 XML 映射文件都通过
12.mybatis中有哪些executor执行器
有三类执行器:simpleExecutor,reuseExecutor,bathExecutor。
SimpleExecutor:每执行一次update或者select都会开启一个prepareStatement对象,用完就会关闭。
ReuseExecutor:执行update或者select,以sql作为key查询statement对象,存在就是用,不存在就创建。它用完后没有立刻关闭而是放在一个map<String,Statement>
中,即重复使用mapStatement对象。
BathStatement:执行update将所有的sql都添加到批处理中,等待统一执行,它缓存了多个statement对象,每个statement对象都是addBath()完毕后,等待逐一执行executeBath()。
15. mybatis防止sql注入
1.数据类型检查,sql执行前,要进行数据类型检查。如:日期的日期格式,邮箱的邮箱格式。
2.过滤特殊符号。
3.绑定变量,使用预编译语句
13.mybatis是如何进行分页的,分页的原理
1、借助Sql语句进行分页(物理分页)
2、拦截器分页(物理分页)通过拦截器给sq语句末尾加Eimt语句来查询
3、借助数组进行分页(逻辑分页)
4、RowBounds分页插件实现分页(逻辑分页)
14.mybatis是否支持延迟加载
Mybatis支持延迟加载。支持一对一和一对多。通过配置lazyLoadingEnable=true
实现。它的原理是调用CGLIB创建目标对象的代理对象,当调用目标方法时进入拦截器方法。比如说查询订单信息并且关联用户信息,它会先返回
订单信息,当需要用户信息时再去关联查询用户信息。好处:挺高查询性能,因为单表查询肯定比多表查询快。