那位先生

个人站

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


mybatis

1.使用mybatis的好处

1.它封装了底层jdbc的调用细节,并将返回结果转成javabean对象,大大简化了java数据库编程的工作;
2.mybatis将sql语句从代码中分离出来,单独放在xml中管理,程序员自己操作sql这样更加的灵活。

2.为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时, 需要手动编写sql来完成,所以称之为半自动ORM映射工具。

3.Mybatis和Hibernate有什么不同

相同点:都是Java中的orm框架,屏蔽了jdbc api的底层访问细节,使我们不用与jdbc api打交道就可以完成对数据库的持久化操作。
Mybatis的好处:屏蔽jdbc api的底层调访问细节;将sql语句与代码分离;提供了将结果集自动封装为实体对象和对象的结合的方法。
Hibernate的好处:它是一个全自动的orm映射工具,它可以自动生成sql语句,并执行返回的java结果。
不同点:1.hibernate比mybatis强大,它可以自动生成sql语句;2.mybatis可以写出来复杂的语句,而hibernate不能。mybatis自己在xml中直接操作sql语句,而hibernate不能直接控制sql语句, 因此只能完成一些不太复杂的sql语句,可能无法写出高效率 的sql语句。3.mybatis要比hibernate简单的多,mybatis是面向sql的,不用考虑对象之间的一些复杂映射关系。

4.${}和#{}的区别

区别:#{}是预编译处理,${}是字符串替换。Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性。

5.当实体类中的字段名和表名字不一致时,该怎么处理?

1.通过查询的sql语句中定义别名,使别名和类名一致。2.通过<resultMap>来映射字段名和实体类别名之间的一一对应关系。

6.通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口,就是人们常说的Mapper接口,接口的全限定名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。 Mapper接口是没有实现类的,当调用接口方法时,接口全限定名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement。
Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。
Dao接口里的方法,是不能重载的,因为是全限定名+方法名的保存和寻找策略。

7.Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签

resultMap、parameterMap、sql、include、selectKey,其中sql标签为sql片段标签,通过include标签引入sql片段,selectKey标签为不支持自增的主键生成策略标签; 加上动态sql的9个标签:when|where|if|otherwise|foreach|trim|set|choose|bind。

8.在mapper中如何传递多个参数

1.在dao的接口中添加。2.使用@param。

9.Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
Mybatis提供了9种动态sql标签:when|where|if|otherwise|foreach|trim|set|choose|bind。
其执行原理为:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

10.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。
原因:namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

11.mybatis是如何进行分页的,分页的原理

Mybatis使用rowbounds进行分页。它是针对resultset结果集进行内存分页的,而非物理分页,可以在sql内书写带有物理分页的参数来完成物理分页,也可以使用分页插件来进行物理分页。

12.mybatis的一级缓存和二级缓存

Mybatis的一级缓存是指sqlSession,作用域是sqlsession,mybatis默认开启一级缓存。在同一个sqlSession中,第一次查询会直接查询数据库,第二次以及之后的查询会去查询sqlsession。但是如果两个查询sql之间发生过增删改 它会清空sqlSession,重新查询数据库。
Mybatis的二级缓存是指mapper映射文件,它的作用域是同一个nameSpace下的mapper映射文件的内容,多个sqlSession共享。它需要自己手动配置。同一个nameSpace下的mapper文件,执行相同的sql第一次查询会去查询数据库, 第二次查询则去查询二级缓存,但是如果在两次查询中有调用过增删改则会清空二级缓存。

13.mybatis是否支持延迟加载

Mybatis支持延迟加载。支持一对一和一对多。通过配置lazyLoadingEnable=true 实现。它的原理是调用CGLIB创建目标对象的代理对象,当调用目标方法时进入拦截器方法。比如说查询订单信息并且关联用户信息,它会先返回 订单信息,当需要用户信息时再去关联查询用户信息。好处:挺高查询性能,因为单表查询肯定比多表查询快。

14.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.参考链接

参考文章1 参考文章2

取消

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

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

比五毛钱特效专业哦