请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Mybatis面试问题集锦

[复制链接]
查看: 47|回复: 0

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
92750
发表于 2020-2-15 11:46 | 显示全部楼层 |阅读模式
1、#{}和${}的区分是什么?

答:mybatis在处置赏罚#{}时,会将sql中的#{}更换为?号,挪用PreparedStatement的set方式来赋值;
mybatis在处置赏罚 $ { } 时,就是把 ${ } 更换成变量的值,完成的是简单的字符串拼接。
补充:在mybatis中操纵#{}可以避免sql注入,进步系统平安性。MyBatis排序时操纵order by 静态参数时必要留意,用$而不是#
2、Xml映照文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

答:还有很多其他的标签,、、、、,加上静态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片断标签,经过标签引入sql片断,为不支持自增的主键天生存谋标签。
3、最好理论中,凡是一个Xml映照文件,城市写一个Dao接口与之对应,请示,这个Dao接口的工作道理是什么?Dao接口里的方式,参数不同时,方式能重载吗?

答:Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映照文件中的namespace的值,接口的方式名,就是映照文件中MappedStatement的id值,接口方式内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当挪用接口方式时,接口全限名+方式名拼接字符串作为key值,可唯必定位一个MappedStatement
举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个、、、标签,城市被分解为一个MappedStatement工具。
Dao接口里的方式,是不能重载的,由因而全限名+方式名的保存和根究计谋。
Dao接口的工作道理是JDK静态代理,Mybatis运转时会操纵JDK静态代理为Dao接口天生代理proxy工具,代理工具proxy会阻挡接口方式,转而履行MappedStatement所代表的sql,然后将sql履行成果返回。
4、Mybatis是怎样举行分页的?分页插件的道理是什么?

答:Mybatis操纵RowBounds工具举行分页,它是针对ResultSet成果集履行的内存分页,而非物理分页,可以在sql内间接钞缮带有物理分页的参数来完成物理分页功用,也可以操纵分页插件来完成物理分页。
分页插件的底子道理是操纵Mybatis供给的插件接口,实现自界说插件,在插件的阻挡方式内阻挡待履行的sql,然后重写sql,按照dialect方言,增加对应的物理分页语句和物理分页参数。
举例:select * from student,阻挡sql后重写为:select t.* from (select * from student)t limit 0,10
5、简述Mybatis的插件运转道理,以及怎样编写一个插件。

答:Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis操纵JDK的静态代理,为必要阻挡的接口天生代理工具以实现接口方式阻挡功用,每当履行这4种接口工具的方式时,就会进入阻挡方式,具体就是InvocationHandler的invoke()方式,固然,只会阻挡那些你指定必要阻挡的方式。
实现Mybatis的Interceptor接口并复写intercept()方式,然后在给插件编写注解,指定要阻挡哪一个接口的哪些方式即可,记着,别忘了在设备文件中设备你编写的插件。
6、Mybatis履行批量插入,能返回数据库主键列表吗?

答:能,JDBC都能,Mybatis固然也能。
7、Mybatis静态sql是做什么的?都有哪些静态sql?能简述一下静态sql的履行道理不?

答:Mybatis静态sql可以让我们在Xml映照文件内,以标签的形式编写静态sql,完成逻辑判定和静态拼接sql的功用,Mybatis供给了9种静态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。
其履行道理为,操纵OGNL从sql参数工具中盘算表达式的值,按照表达式的值静态拼接sql,以此来完成静态sql的功用。
8、Mybatis是怎样将sql履行成果封装为方针工具并返回的?都有哪些映照形式?

答:第一种是操纵标签,逐一界说列名和工具属性名之间的映照关系。第二种是操纵sql列的别名功用,将列别名钞缮为工具属性名,比如T_NAME AS NAME,工具属性名一样平常是name,小写,可是列名不区分巨细写,Mybatis会疏忽列名巨细写,智能找到与之对应工具属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以一般工作。
有了列名与属性名的映照关系后,Mybatis经过反射建立工具,同时操纵反射给工具的属性逐一赋值并返回,那些找不到映照关系的属性,是没法完成赋值的。
9、Mybatis能履行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区分。

答:能,Mybatis不单可以履行一对一、一对多的关联查询,还可以履行多对一,多对多的关联查询,多对一查询,实在就是一对一查询,只必要把selectOne()点窜成selectList()即可;多对多查询,实在就是一对多查询,只必要把selectOne()点窜成selectList()即可。
关联工具查询,有两种实现方式,一种是零丁发送一个sql去查询关联工具,赋给主工具,然后返回主工具。另一种是操纵嵌套查询,嵌套查询的寄义为操纵join查询,一部排列是A工具的属性值,此外一部排列是关联工具B的属性值,优点是只发一个sql查询,便可以把主工具和其关联工具查出来。
那末题目来了,join查询出来100笔记录,怎样肯定主工具是5个,而不是100个?其去反复的道理是标签内的子标签,指定了唯一肯定一笔记录的id列,Mybatis按照列值来完成100笔记录的去反复功用,可以有多个,代表了团结主键的语意。
一样主工具的关联工具,也是按照这个道理去反复的,尽管一样平常情况下,只要主工具会有反复记录,关联工具一样平常不会反复。
举例:下面join查询出来6笔记录,一、二列是Teacher工具列,第三列为Student工具列,Mybatis去反复处置赏罚后,成果为1个教员6个门生,而不是6个教员6个门生。
.......t_id t_name s_id
| 1 | teacher | 38 |
| 1 | teacher | 39 |
| 1 | teacher | 40 |
| 1 | teacher | 41 |
| 1 | teacher | 42 |
| 1 | teacher | 43 |
10、Mybatis能否支持延长加载?假如支持,它的实现道理是什么?

答:Mybatis仅支持association关联工具和collection关联聚集工具的延长加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis设备文件中,可以设备能否启用延长加载lazyLoadingEnabled=true|false。
它的道理是,操纵CGLIB建立方针工具的代理工具,当挪用方针方式时,进入阻挡器方式,比如挪用a.getB().getName(),阻挡器invoke()方式发现a.getB()是null值,那末就会零丁发送事教员存好的查询关联B工具的sql,把B查询上来,然后挪用a.setB(b),因而a的工具b属性就有值了,接着完成a.getB().getName()方式的挪用。这就是延长加载的底子道理。
固然了,不单是Mybatis,几乎全数的包含Hibernate,支持延长加载的道理都是一样的。
11、Mybatis的Xml映照文件中,差此外Xml映照文件,id能否可以反复?

答:差此外Xml映照文件,假如设备了namespace,那末id可以反复;假如没有设备namespace,那末id不能反复;究竟namespace不是必须的,只是最好理论而已。
缘由就是namespace+id是作为Map的key操纵的,假如没有namespace,就剩下id,那末,id反复会致使数据相互覆盖。有了namespace,自然id便可以反复,namespace不同,namespace+id自然也就不同。
12、Mybatis中怎样履行批处置赏罚?

答:操纵BatchExecutor完成批处置赏罚。
13、Mybatis都有哪些Executor履行器?它们之间的区分是什么?

答:Mybatis有三种底子的Executor履行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每履行一次update或select,就开启一个Statement工具,用完立即封闭Statement工具。
ReuseExecutor:履行update或select,以sql作为key查找Statement工具,存在就操纵,不存在就建立,用完后,不封闭Statement工具,而是放置于Map内,供下一次操纵。简言之,就是反复操纵Statement工具。
BatchExecutor:履行update(没有select,JDBC批处置赏罚不支持select),将全数sql都增加到批处置赏罚中(addBatch()),期待同一履行(executeBatch()),它缓存了多个Statement工具,每个Statement工具都是addBatch()终了后,期待逐一履行executeBatch()批处置赏罚。与JDBC批处置赏罚类似。
感化范围:Executor的这些特点,都严酷限制在SqlSession生命周期范围内。
14、Mybatis中怎样指定操纵哪一种Executor履行器?

答:在Mybatis设备文件中,可以指定默许的ExecutorType履行器典范,也可以手动给DefaultSqlSessionFactory的建立SqlSession的方式传递ExecutorType典范参数。
15、Mybatis能否可以映照Enum罗列类?

答:Mybatis可以映照罗列类,不单可以映照罗列类,Mybatis可以映照任何工具到表的一列上。映照方式为自界说一个TypeHandler,实现TypeHandler的setParameter()和getResult()接口方式。TypeHandler有两个感化,一是完成从javaType至jdbcType的转换,二是完成jdbcType至javaType的转换,表现为setParameter()和getResult()两个方式,别离代表设备sql问号占位符参数和获得列查询成果。
16、Mybatis映照文件中,假如A标签经过include援用了B标签的内容,请示,B标签能否界说在A标签的后背,照旧说必须界说在A标签的前面?

答:固然Mybatis分解Xml映照文件是依照顺序分解的,可是,被援用的B标签仍然可以界说在任何地方,Mybatis都可以正确识别。
道理是,Mybatis分解A标签,发现A标签援用了B标签,可是B标签尚未分解到,尚不存在,此时,Mybatis会将A标签标志为未分解状态,然后继续分解余下的标签,包含B标签,待全数标签分解终了,Mybatis会重新分解那些被标志为未分解的标签,此时再分解A标签时,B标签已经存在,A标签也便可以一般分解完成了。
17、简述Mybatis的Xml映照文件和Mybatis内部数据结构之间的映照关系?

答:Mybatis将全数Xml设备信息都封装到All-In-One重量级工具Configuration内部。在Xml映照文件中,标签会被分解为ParameterMap工具,其每个子元素会被分解为ParameterMapping工具。标签会被分解为ResultMap工具,其每个子元素会被分解为ResultMapping工具。每一个、、、标签均会被分解为MappedStatement工具,标签内的sql会被分解为BoundSql工具。
18、为什么说Mybatis是半自动ORM映照工具?它与全自动的区分在那边?

答:Hibernate属于全自动ORM映照工具,操纵Hibernate查询关联工具大要关联聚集工具时,可以按照工具关系模子间接获得,所以它是全自动的。而Mybatis在查询关联工具或关联聚集工具时,必要手动编写sql来完成,所以,称之为半自动ORM映照工具。
转自:https://my.oschina.net/zudajun/blog/747682

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 WAYSFOCUS 影像 你 我 他,中国商业影视一站式解决平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表