P60

1.1谈一谈你对Mybatis框架的理解(了解)

MyBatis 是一款优秀的持久层框架,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集过程。MyBatis 可以使用简单的 XML 或注解方式来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2在mybatis中,${} 和 #{} 的区别是什么?(必会)

{} 是在mybatis中是占位符,具有预编译处理功能,将sql中的#{}替换为?号,底层使用PreparedStatement的set方法来赋值,可以有效的防止SQL注入,提高系统安全性
${}是在mybatis是字符串替换,将mql中${}替换成变量的值。

1.3 MyBatis编程步骤是什么样的?(了解)

1、 创建SqlSessionFactory会话工厂
2、 通过SqlSessionFactory创建SqlSession会话对象
3、 通过sqlsession会话对象执行数据库操作
4、 调用session.commit()提交事务
5、 调用session.close()关闭会话

1.4在mybatis中,resultType和ResultMap的区别是什么?(必会)

如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性
如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过resultMap手动建立对象关系映射,resultMap要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来

1.5在Mybatis中你知道的动态SQL的标签有哪些?作用分别是什么?(必会)

  1. if是为了判断传入的值是否符合某种规则,比如是否不为空.
    2. where标签可以用来做动态拼接查询条件,当和if标签配合的时候,不用显示的声明类型where 1 = 1这种无用的条件
    3. foreach标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到sql语句中.
    4. include可以把大量的重复代码整理起来,当使用的时候直接include即可,减少重复代码的编写;
    5. 适用于更新中,当匹配某个条件后,才会对该字段进行跟新操作

    1.6谈一下你对mybatis缓存机制的理解?(了解)

    1. Mybatis有两级缓存,一级缓存是SqlSession会话级别的,默认开启,无法关闭;二级缓存是Mapper级别的,二级缓存默认是没有开启的,但是手动开启<br /> 1. 一级缓存:基础PerpetualCacheHashMap本地缓存,其存储作用域为Session,当Session flushclose之后,Session中的所有Cache就将清空<br /> 2. 二级缓存其存储作用域为Mapper(Namespace),使用二级缓存属性类需要实现Serializable序列化接口<br /> 3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有select中的缓存将被clear.<br />需要在setting全局参数中配置开启二级缓存,如下conf.xml配置:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26807370/1650031133619-1b1c8ebe-ba0c-4114-adb3-5dcc1cb1daa3.png#clientId=u38861367-fd93-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=90&id=ufa88cdeb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=81&originWidth=692&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17813&status=done&style=none&taskId=ueb5c15b4-262c-41b9-9d5c-d99d4ee6d1f&title=&width=768)<br /> 当我们的配置文件配置了cacheEnabled=true时,就会开启二级缓存,二级缓存是mapper级别的,如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓存→数据库。

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

insert 方法总是返回一个int值,这个值代表的是插入的行数。如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。 示例:
image.png

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

1、第一种:多个参数全部写出来
2、第二种:把多个参数封装成一个对象进行传递
3、第三种:把多个参数封装成Map集合进行传递
image.png

1.9MyBatis 实现一对一有几种方式?具体怎么操作的?

有联合查询和级联查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;级联查询是先查一个表,根据这个表里面的结果的外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置

1.10MyBatis 实现一对多有几种方式,怎么操作的?

有联合查询和级联查询。联合查询是几个表联合查询,只查询一次,通过在resultMap 里面的 collection 节点配置一对多的类就可以完成;级联查询是先查一个表,根据这个表里面的结果的外键 id,去再另外一个表里面查询数据,也是通过配置 collection,但另外一个表的查询通过 select 节点配置。