mbyatis中的常见面试题,以及在mybatis的文件碰到的各种情况

#号跟$符号的区别

        #号跟$号都是实现动态sql的一种方式,主要区别就是#号会被解析成为一个带问号的占位符,使用#号的参数会加上单引号,而使用$符号的就是把对应的值做一个替换,使用#号可以有效防止sql注入,但是如果在使用字段进行排序时候,要使用$符号

什么是sqlsession

        Sqlsession对应着一次数据库会话,是mybatis中比较核心的一个接口,在接口里面定义了各种操作数据库的方法,在非事务的情况下,每一次操作数据库都会创建不同的sqlsession对象,如果多个请求在同一个事务中,那么就只会一个SqlSession对象

一级缓存

        mybatis是默认开启一级缓存的,每一个sqlsession都有自己的一级缓存,当sqlsession执行插入,更新,删除操作的时候,会清空一级缓存里面的内容,目的是为了防止脏读,当sqlsession关闭的时候,也会清空一级缓存里面的数据,sqlsession对象里面有一个Executor对象,Executor对象里面有一个PerpetualCache对象,一级缓存就是保存在这个对象中

二级缓存

        二级缓存是sqlsessionFactory的缓存,所以由sqlsessionFactory创建出来的sqlsession对象可以共享这个缓存,二级缓存默认是没有开启的,如果需要开启的话,需要在springboot的配置文件中设置mybatis.config.cache-enabled=true,还要在xml文件中加入cache标签,同时需要把实体类序列化(因为二级缓存是可以会保存到硬盘上),这样当sqlsession关闭的时候,就会把一级缓存中的数据写入到二级缓存中,然后在查询数据的时候,是先查二级缓存,如果二级缓存中没有数据,就查一级缓存,如果一级缓存也没有,就去查询数据库

(二级缓存有过期时间,并不是key-value的过期时间,而是整个缓存的过期时间,通过flushInterval来设置,每当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下)

什么是mybatis:

        mybatis是半个对象关系映射框架,它内部封装了jdbc,加载驱动,创建连接这些过程,可以通过xml文件或者注解的方式把将要执行的statement配置起来,然后通过java对象和statement中sql的动态参数映射为一条sql语句,然后mybatis执行该sql,并把结果以java对象的形式返回

mybatis中的优缺点

        支持动态sql,代码复用性比较强,虽然mybatis底层是jdbc,但是跟jdbc相比,代码量少了很多,跟spring可以很好的集成,缺点就是在编写比较复杂的sql语句时,要在xml文件里面编写,但是xml文件里面有很多种标签,如果使用不当会报错,而且mybatis要求我们写SQL语句的能力还是比较深的

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

        dao接口就是我们说的mapper接口,接口中的全限定类名就是映射文件中的namescpe的值,接口中的方法名, 就是xml文件中增删改查标签中的id值,dao接口是没有实现类的,当调用接口中的方法时,接口的全限定类名+方法名会拼接成一个key,可定位唯一的
mappedstatement对象,在mybatis中,每一个增删改查标签都是一个mappedstatement对象
 dao接口中的方法是不能重载的,因为是全限定名+方法名的保存和寻找策略

 dao接口是工作原理是动态代理+反射

 

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

        可以,前提是xml文件要配置namespace

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

        分页有两个:一个是RowBounds,逻辑分页,另外是插件分页:pagehelper,这个是物理分页

        逻辑分页是把全部数据拿出来,在内存进行分页,物理分页是在数据库查询的时候用limit命令来分页
        分页插件的原理是是:使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截要执行的 sql,然后重写 sql语句添加对应的分页参数

        mybatis自带的RowBounds分页跟插件分页都没有用过,我一直用的是在写xml文件的时候,直接用limit进行分页了


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

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

Mybatis动态sql有什么用?执行原理?

Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql语句,用来满足代码复用

执行原理是根据表达式的值,进行逻辑判断,判断是否要进行拼接

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

接口中的方法名要和xml文件中增删改查标签中的id值一致
接口方法的参数类型和mxml中的parameterType的类型相同
接口方法的返回类型和xml中的resultType的类型相同
xml文件中的namespace值是接口的全限定类名。

模糊查询like语句该怎么写?

使用concat函数,like,#号三个配合起来进行模糊查询

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

1,通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
2,通过resultmap标签来映射表中字段名和实体类属性名的对应关系

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

        在新增标签上面加入:useGeneratedKeys="true"  keyProperty="表中主键的字段名",就可以获取自动生成的主键值,然后赋值到对象里面去

在mapper中如何传递多个参数?

        传递多个参数,可以使用位置传参,map传参,对象传参,还有一个@param注解传参


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

        接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和要执行的SQL语句进行绑定, 我们直接调用接口方法就可以执行sql语句了,这样比使用sqlsession接口里面的方法有了更多的选择
        接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上注解,在注解里面写要执行的Sql语句;另外一种就是通过xml文件来绑定,这种情况下,要指定xml文件里面的namespace的值为接口的全限定类名。

        要执行的sql语句比较简单的时候,用注解绑定会好一点, 当SQL语句比较复杂时候就使用xml文件

项目中碰到有关于xml文件的问题:

1.如果不想使用java对象来接收的返回值,可直接使用Map来接收查询出来的值

        在写查询语句的时候,如果有一条数据想以Map的形式返回,那么在mapper接口的返回值可以写Map<String,Object>,如果有多条数据以Map的形式返回,在mapper接口的返回值就写List<Map<String,Object>> ,只要在xml文件中的resultMap值写:java.util.Map,就可以对应以上两种情况了

        如果使用这种方式的话,就有很多需要注意的地方了,那就是resultType="java.util.Map" 这里是不能指定泛型的,所以无论接口的返回值用什么接收,在xml文件中查出来的结果,最终都是以Map<Object,Object>来返回,尽管接口的返回值有指定泛型,例如接口的返回值是:Map<String,String> 但是这个Map的实际泛型是:Map<Object,Object>
        所以当返回的结果里面有long类型,或者大数类型的时候,直接使用Map.get("字段名")有可能会类型转换异常,例如:

5087ec33460d408d87ffe9a8e0584dd0.png

       

         而且在前后端分离的时候,假设接口中的返回值类型是Map<String,Object> 然后通过xml文件查询的结果中有长整数型,那么使用@responseBody注解 传递给前端之后,会出现精度丢失的情况,这个问题不是json工具包的问题,而是由于js存储大数字丢失精度引起。

        当js表达整数时,最多表达15位数字,如果超过15位就会出现精度丢失

        所以需要数字类型改为字符串,转为json,传到前端就不会丢失精度了

013f7b0547da4175b96f2fd2ccf5e3dc.png

        

        因为xml文件中 resultType="java.util.Map" 指定不了泛型,所以在接口的返回值中最好使用Map<String,Object>来接收

2.xml文件中的模糊查询和分页以及排序编写

f08877017a294b90ac780c6fd345bbd2.png

猜你喜欢

转载自blog.csdn.net/qq_26112725/article/details/129847983