那位先生

个人站

前世五百次回眸,才能换得今生的一次擦肩而过。


mybatis

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 映射文件中的标签, 会被解析成一个 MappedStatement 对象,对应的 id 就是 XML 映射文件配置的 namespace+’.’+statementId,这个 id 跟 Mapper 接口中的方法 进行关联。其中每个 Mapper 接口都会创建一个动态代理对象(JDK 动态代理),代理类会拦截接口的方法,找到对应的 MappedStatement 对象, 然后执行数据库相关操作。

7.Mapper接口的方法,参数不同时,方法能重载吗

Mapper接口里的方法,是不能重载的,因为是全限定名+方法名的保存和寻找策略。

8.如何获取自动生成的键值

不同的数据库,获取自动生成的(主)键值的方式是不同的,MySQL 有两种方式获取自动生成的键值,如下:
1.在 标签中添加useGeneratedKeys=”true”等属性。
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 映射文件都通过来使用同一个 Cache 对象, 不过这样太局限了,且缓存的数据仅仅是保存在了本地内存中,对于当前高并发的环境下是无法满足要求的,所以我们通常不使用MyBatis的缓存

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创建目标对象的代理对象,当调用目标方法时进入拦截器方法。比如说查询订单信息并且关联用户信息,它会先返回 订单信息,当需要用户信息时再去关联查询用户信息。好处:挺高查询性能,因为单表查询肯定比多表查询快。

15.参考链接

参考文章1 参考文章2 参考文章3 参考文章1 参考文章2

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
你说多少就多少

比五毛钱特效专业哦