2020-MyBatis面试题

MyBatis基本概念

  MyBatis 是一款由 Java 编写的持久层框架,它支持定制化 SQL、存储过程以及高级映射,并且封装了 JDBC 操作的很多细节,使开发者只需要关注 SQL 语句本身,不再去管注册驱动,创建连接等过程。
  MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录,它使用了ORM思想实现了结果集的封装。
  ORM(Object Relational Mapping,对象关系映射),将数据库表和实体类以及实体类的属性对应起来,让我们通过操作实体类就实现操作数据库表,使用过程中需要做到实体类中的数据库表的字段名称保持一致。
  
Mybaits的优点

  1、基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
  2、与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
  3、很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
  4、能够与Spring很好的集成;
  5、提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

MyBatis框架的缺点

  1、SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
  2、SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
  
搭建mybatis开发环境的步骤

  1、下载mybatis的jar包并导入工程
  2、编写mybatis的核心配置文件—工程名-mybatis-config.xml
  3、创建实体类POJO
  4、Dao文件夹下创建 实体类的mapper.java接口和配置实体类的mapper.xml文件
  5、创建测试类,看有没有问题

Mybatis在核心处理类叫什么

  Mybatis在核心处理类叫什么:SqlSession

Mybatis配置一对多

<collection property="topicUsett" column="id" ofType="com.swjd.bean.User" select="selectUser" />

  property:属性名
  column:共同列
  ofType:集合中元素的类型
  select:要连接的查询

Mybatis配置一对一

<association property="topicUser" select="selectUser" column="id" javaType="com.swjd.bean.User"/>

  property:属性名
  select:要连接的查询
  column:共同列
  javaType:集合中元素的类型

关于MyBatis的缓存
  MyBatis的缓存分为一级缓存二级缓存, 一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的, 使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

#{}和${}的区别

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

MyBatis编程步骤

  ① 创建SqlSessionFactory
  ② 通过SqlSessionFactory创建SqlSession
  ③ 通过sqlsession执行数据库操作
  ④ 调用sessionmit()提交事务
  ⑤ 调用session.close()关闭会话

Mybatis是如何进行分页的,分页插件的原理是什么

  Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

Mybatis的标签

  Xml映射文件中,除了常见的select、insert、updae、delete标签之外,还有 resultMap、parameterMap、sql、include、selectKey,加上动态sql的9个标签,其中 sql为sql片段标签,通过 include标签引入sql片段, selectKey为不支持自增的主键生成策略标签。

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

  不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;

使用MyBatis的mapper接口调用时有哪些要求

  1、Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
  2、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;
  3、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
  4、Mapper.xml文件中的namespace即是mapper接口的类路径。

Mybatis动态sql是做什么的,都有哪些动态sqll标签,动态sql的执行原理

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

为什么说Mybatis是半自动ORM映射工具,它与全自动的区别是什么

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

模糊查询like语句该怎么写

  (1)’%${question}%’ 可能引起SQL注入,不推荐
  (2)"%"#{question}"%" 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引号’ ',所以这里 % 需要使用双引号" ",不能使用单引号 ’ ',不然会查不到任何结果。
  (3)CONCAT(’%’,#{question},’%’) 使用CONCAT()函数,推荐
  (4)使用bind标签

<select id="listUserLikeUsername" resultType="com.swjd.bean.User">
  select id,sex,age,username,password from user where username LIKE #{userName}
</select

在mapper中如何传递多个参数

  方法1:顺序传参法
  方法2:@Param注解传参法
  方法3:Map传参法
  方法4:Java Bean传参法

SqlMapConfig.xml中配置有哪些内容

  SqlMapConfig.xml中配置的内容和顺序如下:
  properties(属性)
  settings(配置)
  typeAliases(类型别名)
  typeHandlers(类型处理器)
  objectFactory(对象工厂)
  plugins(插件)
  environments(环境集合属性对象)
  environment(环境子属性对象)
  transactionManager(事务管理)
  dataSource(数据源)
  mappers(映射器)

什么是MyBatis的接口绑定,有哪些实现方式

接口绑定就是

  在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。

接口绑定有两种实现方式

  通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;
通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

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

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

  insert 方法总是返回一个int值 - 这个值代表的是插入的行数。而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。

insert into names (name) values (#{name})

MyBatis的功能架构

Mybatis的功能架构分为三层:
  API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

Mybatis填空题实例

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

#{}${}的区别是什么?
  #{}是预编译处理,${}是字符串替换。

  MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,几乎封装所有的JDBC代码和参数的手动设置以及结果集的检索,通过XML或注解的方式进行配置映射实现数据库操作,大大提高开发效率。

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

模糊查询like语句怎么写?
  第一种,在Java代码中添加sql通配符。
  第二种,在sql语句中添加拼接通配符会引起sql注入。

四个核心接口是:
  Executor用于执行CRUD操作、ParameterHandler用于处理SQL的参数、
  ResultSetHandler处理返回结果集、
  StatementHandler用于执行SQL语句。

更多推荐

2020-MyBatis面试题