目录
一、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的用法
答:
(1)mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
(2)mybatis避免了几乎所有的JDBC代码(说明了mybatis底层用的就是JDBC,只不过是封装了)和手动设置参数以及获取结果集。
(3)mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。
(4)mybatis是一个半自动的ORM框架。
答:
传统的JDBC的步骤:
(1)获取数据库连接
(2)打开Statement对象
(3)通过Statement对象执行SQL语句,返回结果集ResultSet对象
(4)再将ResultSet对象遍历,一个一个往pojo对象里set
(5)关闭数据库相关资源
Hibernate虽然不用写SQL语句,但是多表关联的复杂SQL,根据条件变化的SQL,都无法简单的去实现。但是Mybatis最好的是可以写动态SQL。
答:分两种情况,可以是boolean类型和int类型,如果设置boolean,true为插入成功,false为插入失败。而int代表影响条数。
答:分两种情况获取,一种是获取自增主键值,另一种是获取非自增主键值。
自增主键:
useGeneratedKeys="true" keyProperty="eid"
非自增:
select uuid();
insert into ......
答:
#{}:用的预编译通配符方式,preparedStatement。接收字符串参数时会自动给你加单引号。
${}:就是纯字符串拼接的方式,用的Statement,我们传参字符串的时候一定要加上单引号。此方式容易造成SQL注入。
答:在标签上加入statementType="CALLABLE"属性即可。
答:有三种方式可以处理。
(1)直接属性名点属性
(2)association自定义映射
(3)分步查询 + 懒加载
fetchType = "lazy"
正常查只会查user表,但当你用到其中的部门信息了,他才从库中查出来。
答:有两种方式。
(1)collection自定义映射
(2)分步查询
答:if、where、trim、set、choose、when、otherwise、foreach、sql。
答:
foreach:主要用于循环迭代。
collection:要迭代的集合。
item:当前从集合中迭代出的元素。
open:开始字符。
close:结束字符。
separator:元素与元素之间的分隔符。
index:
迭代的是List集合:index表示的当前元素的下标。
迭代的是Map集合:index表示的当前元素的key。
答:一般与if标签配合使用,作用是where标签可以过滤掉条件语句中的第一个and或or关键字。
答:set主要是用于解决修改操作中SQL语句可能多出逗号的问题。
答:有了解过。
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。
不同的sqlSession之间的缓存数据区域(HashMap)是互不影响的,如上边的图。
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个mapper的sql语句,多个SqlSession可以共用二级缓存。二级缓存是跨SqlSession的。
答:
第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,就从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。
如果sqlSession去执行commit()操作(也就是增删改),清空sqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。
答:在statement中设置useCache=false可以禁用当前select语句的二级缓存。
答:
在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
设置statement配置中的flushCache=”true”属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。
答:主要用的是逆向工程和分页插件PageHelper。
答:主要就是在返回值List集合上方加入PageHelper.startPage(2,2);代码,第一个参数是当前页的页数,第二个参数是每页显示多少条。
可以把返回值List放入PageInfo构造中,可以使用API中很多方法,例如isHasPreviousPage()、
getPrePage()、isHasNextPage()、getNextPage()、getPages()。