Mybatis面试题(基础篇)

目录

一、Mybatis介绍

1、Mybatis是什么?

2、JDBC、Hibernate、Mybatis对比?

二、增删改查

3、Mybatis在做删除操作的时候,返回值是什么类型?

4、Mybatis如何获取主键值?

5、#{}和${}有什么区别?

6、Mybatis如何调用存储过程?

7、Mybatis是怎么处理一对一关系的?比如一个用户对应一个部门

8、那Mybatis是如何处理一对多关系的?比如一个部门下有多个用户

三、动态SQL

9、你常用的动态SQL标签有哪些?

10、刚才你提到foreach标签,标签里有几个常用属性,你知道它们的作用吗?

11、where标签有什么作用?

12、刚才你提到set标签,它的作用是什么?

四、缓存

13、Mybatis有一级二级缓存,你有了解过吗?

14、简单说说一级缓存的执行流程吧

15、如何禁用二级缓存?

16、如何清空(刷新)二级缓存?

五、Mybatis插件

17、你都用过Mybatis的什么插件?

18、简单跟我说说分页插件PageHelper的用法


一、Mybatis介绍

1、Mybatis是什么?

答:

(1)mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。

(2)mybatis避免了几乎所有的JDBC代码(说明了mybatis底层用的就是JDBC,只不过是封装了)和手动设置参数以及获取结果集。

(3)mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。

(4)mybatis是一个半自动的ORM框架。

2、JDBC、Hibernate、Mybatis对比?

答:

传统的JDBC的步骤:

(1)获取数据库连接

(2)打开Statement对象

(3)通过Statement对象执行SQL语句,返回结果集ResultSet对象

(4)再将ResultSet对象遍历,一个一个往pojo对象里set

(5)关闭数据库相关资源

Hibernate虽然不用写SQL语句,但是多表关联的复杂SQL,根据条件变化的SQL,都无法简单的去实现。但是Mybatis最好的是可以写动态SQL。

二、增删改查

3、Mybatis在做删除操作的时候,返回值是什么类型?

答:分两种情况,可以是boolean类型和int类型,如果设置boolean,true为插入成功,false为插入失败。而int代表影响条数。

4、Mybatis如何获取主键值?

答:分两种情况获取,一种是获取自增主键值,另一种是获取非自增主键值。

自增主键:

useGeneratedKeys="true" keyProperty="eid"

非自增:



	select uuid();



insert into ......

5、#{}和${}有什么区别?

答:

        #{}:用的预编译通配符方式,preparedStatement。接收字符串参数时会自动给你加单引号。

        ${}:就是纯字符串拼接的方式,用的Statement,我们传参字符串的时候一定要加上单引号。此方式容易造成SQL注入。

6、Mybatis如何调用存储过程?

答:在标签上加入statementType="CALLABLE"属性即可。

7、Mybatis是怎么处理一对一关系的?比如一个用户对应一个部门

答:有三种方式可以处理。

(1)直接属性名点属性



    

    

    

    

    

    

(2)association自定义映射



    

    

    

    

    

      

      

    

(3)分步查询 + 懒加载



  

  

  

  

  



fetchType = "lazy"

正常查只会查user表,但当你用到其中的部门信息了,他才从库中查出来。

8、那Mybatis是如何处理一对多关系的?比如一个部门下有多个用户

答:有两种方式。

(1)collection自定义映射



  

  

  

    

    

    

    

  

(2)分步查询



  

  

  

三、动态SQL

9、你常用的动态SQL标签有哪些?

答:if、where、trim、set、choose、when、otherwise、foreach、sql。

10、刚才你提到foreach标签,标签里有几个常用属性,你知道它们的作用吗?

答:

foreach:主要用于循环迭代。

collection:要迭代的集合。

item:当前从集合中迭代出的元素。

open:开始字符。

close:结束字符。

separator:元素与元素之间的分隔符。

index:

迭代的是List集合:index表示的当前元素的下标。

迭代的是Map集合:index表示的当前元素的key。

11、where标签有什么作用?

答:一般与if标签配合使用,作用是where标签可以过滤掉条件语句中的第一个and或or关键字。

12、刚才你提到set标签,它的作用是什么?

答:set主要是用于解决修改操作中SQL语句可能多出逗号的问题。

四、缓存

13、Mybatis有一级二级缓存,你有了解过吗?

答:有了解过。

一级缓存SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。

不同的sqlSession之间的缓存数据区域(HashMap)是互不影响的,如上边的图。

二级缓存mapper级别的缓存,多个SqlSession去操作同一个mapper的sql语句,多个SqlSession可以共用二级缓存。二级缓存是跨SqlSession的。

14、简单说说一级缓存的执行流程吧

答:

第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,就从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。

如果sqlSession去执行commit()操作(也就是增删改),清空sqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读

第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

15、如何禁用二级缓存?

答:在statement中设置useCache=false可以禁用当前select语句的二级缓存。

16、如何清空(刷新)二级缓存?

答:

在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。

设置statement配置中的flushCache=”true”属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。

五、Mybatis插件

17、你都用过Mybatis的什么插件?

答:主要用的是逆向工程和分页插件PageHelper。

18、简单跟我说说分页插件PageHelper的用法

答:主要就是在返回值List集合上方加入PageHelper.startPage(2,2);代码,第一个参数是当前页的页数,第二个参数是每页显示多少条。

可以把返回值List放入PageInfo构造中,可以使用API中很多方法,例如isHasPreviousPage()、
getPrePage()、isHasNextPage()、getNextPage()、getPages()。

你可能感兴趣的:(Java基础面试题,mybatis,java,数据库,mybatis面试题,面试)