这些试题太强了,程序员必看,尤其是应届生。

面试 专栏收录该内容
1 篇文章 0 订阅

我问了问身边得大佬,原来他们也说这些有用:

我给大伙展示一下 比较容易混淆得一些题参考一下

1.单选题

(1)MyBatis中用于表示输入类型的属性名称是

A.resultType
B.parameterType
C.collection
D.returnType

正确答案: B

(2)在 MyBatis 中,配置结果映射时,使用( )标签实现1对多的关联

A.many-one
B.one-many
C.association
D.collection

正确答案: D

这种常识得东西就一定不要记错了

(3)在 MyBatis中调用SqlSessionFactoryBuilder的哪个方法用于获取SqlSession对象( )。

A.getSession()
B.openSession()
C.session()
D.showSqlSession()

正确答案: B

(4)MyBatis生命周期说法错误的是

A.SqlSessionFactoryBuilder实例的最佳作用域是方法范围,也就是定义为本地方法变量既可
B.SqlSessionFactory实例的生命周期应该在整个应用的执行期间都存在
C.SqlSession实例时线程不安全的,因此其生命周期应该是请求或方法范围
D.SqlSession实例通常定义为一个类的静态变量

正确答案: D

(5)如何获取自动生成的(主)键值

A.设置resultMap
B.设置useGeneratedKeys
C.设置keyProperty
D.设置Property

正确答案: C

2.多选题

(1)对mybatis描述有误的是?

A.MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架
B.MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面
C.Mybatis是一个全ORM(对象关系映射)框架,它内部封装了JDBC
D.MyBatis 只可以使用 XML来配置和映射原生信息

正确答案: CD

(2)Mybatis是如何将sql执行结果封装为目标对象并返回的

A.id
B.标签
C.使用sql列的别名
D.resultType

正确答案: BC

(3)Mybatis的mapper接口调用时候的要求正确的是:

A. Mapper接口方法名和Mapper.xml中定义的每个SQL的id相同;
B. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sqlparameterType类型相同
C. Mapper接口方法的输入输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
D. Mapper.xml文件中的namespace,就是接口的名字

正确答案: ABC

3.填空题

(1)#{}和KaTeX parse error: Expected 'EOF', got '#' at position 10: {}的区别是什么?#̲{}是_____,{}是_____。

这是比容易混淆得地方;

正确答案: 预编译处理,字符串替换

(2)Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,那么id____;如果没有配置namespace,那么id____;

正确答案: 可以重复,不能重复

(3)MyBatis中提供了一级缓存和二级缓存,其中()默认存在,不可控制,同一SqlSession范围内的操作共享该缓存,增、删、改后将()。

正确答案: 一级缓存 , 清除缓存

(4)四个核心接口是()用于执行CRUD操作、()处理SQL的参数、()处理返回结果集、()用于执行SQL语句。

正确答案: Executor , ParameterHandler ,ResultSetHandler,StatementHandler

4.简答题

1.MyBatis得核心类和接口具体有那些?

答:

SqlSessionFactoryBuilder
读取核心配置文件生成会话工厂的类,初始化Configuration对象。

SqlSessionFactory
新建和管理会话的工厂类

SqlSession
会话对象类(程序最常打交道的对象)

Configuration
对应mybatis-config配置文件的一个对象,里面包含了mybatis配置信息和映射器配置文件信息

MappedStatement
对应着映射器配置文件的每一条statment语句配置

Executor
执行器接口,就像发送器

BoundSql
对应一条sql语句

TypeHandler
类型处理器

ParameterHandler
对入参作处理处理器

ResultHandler
对出参作处理的处理器

答:还有很多其他的标签,、、、、,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

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执行批量插入,能返回数据库主键列表吗?

答:能,JDBC都能,Mybatis当然也能。

6、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的功能。

7、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 |

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

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

面试题看似都很简单,但是想要能正确回答上来,必定是研究过源码且深入的人,而不是仅会使用的人或者用的很熟的人,以上所有面试题及其答案所涉及的内容,在我的Mybatis系列博客中都有详细讲解和原理分析。

9、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

答:不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。

原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

10、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

11、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,支持延迟加载的原理都是一样的。

12、简单的说一下MyBatis的一级缓存和二级缓存?

Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

13.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致

如图所以为方法:

select order_id id, order_no orderno ,order_price price form orders where 	order_id=#{id}; 

第2种: 通过来映射字段名和实体类属性名的一一对应的关系

 <select id="getOrder" parameterType="int" resultMap="orderresultmap">
        select * from orders where order_id=#{id}
    </select>
   <resultMap type=”me.gacl.domain.order” id=”orderresultmap”> 
        <!–用id属性来映射主键字段–> 
        <id property=”id” column=”order_id”> 
        <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–> 
        <result property = “orderno” column =”order_no”/> 
        <result property=”price” column=”order_price” /> 
    </reslutMap>


  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

目录 第1篇 求职准备 第1章 应聘软件开发职位前须知道的那些事 2 1.1 认识职业规划 2 1.1.1 职业规划的意义 2 1.1.2 软件人才的职业规划 3 1.2 应聘过程 4 1.2.1 掌握基本的应聘流程 4 1.2.2 面试资料的准备 5 1.2.3 简历的写法及应注意的问题 5 1.2.4 求职信的写法及应注意的问题 8 1.2.5 面试的准备 9 1.3 面试的方式 10 1.3.1 笔试 10 1.3.2 电话面试 11 1.3.3 面试 12 1.4 小结 13 第2篇 Java基础知识 第2章 Java程序基础( 教学视频:43分钟) 16 2.1 开发和运行环境 16 面试题001 JDK和JRE的区别是什么?它们各自有什么作用 16 面试题002 如何利用JDK编译和运行应用程序 17 面试题003 环境变量CLASSPATH的作用是什么 19 面试题004 如何为Java程序动态的指定类搜索路径 20 2.2 Java语言概述 20 面试题005 Java与C++程序在编译和运行上有什么区别 21 面试题006 什么是JVM及其工作原理 21 面试题007 Java程序为什么无须delete语句进行内存回收 23 2.3 生成、部署和配置 24 面试题008 如何利用命名提示符把Java程序打包成jar文件 24 面试题009 关于Java Web项目的生成、部署和配置问题 26 面试题010 EJB项目的生成和部署问题 27 2.4 小结 28 第3章 Java语法基础( 教学视频:103分钟) 29 3.1 基础类型和语法 29 面试题011 变量及其作用范围 29 面试题012 Java的变量分哪两种大的数据类型 30 面试题013 Java包含哪些基本数据类型及其包装类 32 面试题014 如何理解Java中的装箱和拆箱 33 面试题015 Java的引用和C++的指针有什么区别 34 面试题016 请简述Java中的main()方法 35 面试题017 Java中equal和==的区别是什么 36 面试题018 Java提供了哪几种循环结构?它们各自的特点是什么 38 面试题019 Java中的三元运算符是什么 39 面试题020 Java中的注释有哪些 40 3.2 对象和类型 41 面试题021 类和对象有什么区别 41 面试题022 Java中如何使用继承来重用代码 43 面试题023 简述Java中的多态 44 面试题024 请介绍Java中静态成员的特点 46 面试题025 简述Java派生类中的构造方法如何为父类传递参数 47 面试题026 简述接口和抽象类的区别 48 面试题027 简述一下内部类的实质是什么 50 3.3 包和访问控制 52 面试题028 包应该如何被创建及使用 53 面试题029 说明private、protected、public和default的区别 54 3.4 小结 55 第4章 数据类型及类型转换( 教学视频:63分钟) 56 4.1 整型数据 56 面试题030 int和Integer有什么区别 56 面试题031 int的取值范围 57 面试题032 如何用八进制和十六进制来表示整型数据 58 面试题033 long的取值范围 59 4.2 实型数据 59 面试题034 float和double的取值范围各是多少 59 面试题035 实型与整型的相互转换 60 面试题036 如何用BigDecimal类进行精确运算 61 4.3 布尔型数据 63 面试题037 Java可以用非0来代表true吗 63 面试题038 boolean和它的包装类的区别在哪里 64 4.4 字符型数据 65 面试题039 char的取值范围 65 面试题040 char能否存储汉字 66 面试题041 如何使用转义字符 67 4.5 String型数据 68 面试题042 字符串字面量是否自动生成一个String对象 68 面试题043 字符串对象池的作用是什么 69 面试题044 StringBuffer和StringBuilder存在的作用是什么 71 面试题045 如何输出反转过后的字符串 72 面试题046 如何使用指定的字符集创造String对象 73 4.6 小结 74 第5章 数组和集合的使用( 教学视频:54分钟) 75 5.1 Java的数组 75 面试题047 如何理解数组在Java中作为一个类 75 面试题048 new Object[5]语句是否创建了5个对象 77 面试题049 如何拷贝数组的数据 78 面试题050 二维数组的长度是否固定 79 5.2 集合框架 80 面试题051 什么是集合 80 面试题052 迭代器是什么 8
©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值