Dao 接口即 Mapper 接口 。 接口的全限名 , 就是映射文件中的 namespace 的值;接口的方法名 , 就是映射文件中 Mapper 的 Statement 的 id 值;接口方法内的参数 , 就是传递给 sql 的参数 。
Mapper 接口是没有实现类的 , 当调用接口方法时 , 接口全限名+方法名拼接字符串作为 key 值 , 可唯一定位一个 MapperStatement 。 在 Mybatis 中 , 每一个 <select>、<insert>、<update>、<delete>标签 , 都会被解析为一个MapperStatement 对象 。
举例:com.mybatis3.mappers.StudentDao.findStudentById , 可以唯一找到 namespace 为com.mybatis3.mappers.StudentDao 下面 id 为findStudentById 的 MapperStatement 。
Mapper 接口里的方法 , 是不能重载的 , 因为是使用 全限名+方法名 的保存和寻找策略 。 Mapper 接口的工作原理是 JDK 动态代理 , Mybatis 运行时会使用 JDK动态代理为 Mapper 接口生成代理对象 proxy , 代理对象会拦截接口方法 , 转而执行 MapperStatement 所代表的 sql , 然后将 sql 执行结果返回 。
10.Mybatis 是如何进行分页的?分页插件的原理是什么?
Mybatis 使用 RowBounds 对象进行分页 , 它是针对 ResultSet 结果集执行的内存分页 , 而非物理分页 。 可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能 , 也可以使用分页插件来完成物理分页 。
分页插件的基本原理是使用 Mybatis 提供的插件接口 , 实现自定义插件 , 在插件的拦截方法内拦截待执行的 sql , 然后重写 sql , 根据 dialect 方言 , 添加对应的物理分页语句和物理分页参数 。
11.如何执行批量插入?
首先创建一个简单的 insert 语句:
然后在 java 代码中像下面这样执行批处理插入:
12.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用标签 , 逐一定义数据库列名和对象属性名之间的映射关系 。
第二种是使用 sql 列的别名功能 , 将列的别名书写为对象属性名 。
有了列名与属性名的映射关系后 , Mybatis 通过反射创建对象 , 同时使用反射给对象的属性逐一赋值并返回 , 那些找不到映射关系的属性 , 是无法完成赋值的 。
13.在 mapper 中如何传递多个参数?
1、第一种:
2、第二种:使用 \\@param 注解:
然后就可以在 xml 像下面这样使用(推荐封装为一个 map作为单个参数传递给mapper)
3、第三种:多个参数封装成 map
14.如何获取自动生成的(主)键值?
insert 方法总是返回一个 int 值, 这个值代表的是插入的行数 。
如果采用自增长策略 , 自动生成的键值在 insert 方法执行完后可以被设置到传入 的参数对象中 。
示例:
【钟睒睒|超经典的 25 道 MyBatis 面试题附答案解析!】
15.Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?
Mybatis 动态 sql 可以在 Xml 映射文件内 , 以标签的形式编写动态 sql , 执行原理 是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能 。
Mybatis 提供了 9 种动态 sql 标签:trim | where | set | foreach | if | choose | when | otherwise | bind 。
16.Xml 映射文件中 , 除了常见的 select|insert|updae|delete 标签之外 , 还有哪些标签?
<resultMap>、<parameterMap>、<sql>、<include>、<selectKey> , 加上动态 sql 的 9 个标签 , 其中为 sql 片段标签 , 通过标签引入 sql 片段 , 为不支持自增的主键生成策略标签 。
17.Mybatis 的 Xml 映射文件中 , 不同的 Xml 映射文件 , id 是否可以重复?
不同的 Xml 映射文件 , 如果配置了 namespace , 那么 id 可以重复;如果没有配置 namespace , 那么 id 不能重复;
原因就是 namespace+id 是作为 Map的 key使用的 , 如果没有 namespace , 就剩下 id , 那么 , id 重复会导致数据互相覆盖 。 有了 namespace , 自然 id 就可以重复 , namespace 不同 , namespace+id 自然也就不同 。
18.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
Hibernate 属于全自动 ORM 映射工具 , 使用 Hibernate 查询关联对象或者关联集合对象时 , 可以根据对象关系模型直接获取 , 所以它是全自动的 。 而 Mybatis在查询关联对象或关联集合对象时 , 需要手动编写 sql 来完成 , 所以 , 称之为半自动 ORM 映射工具 。
19.一对一、一对多的关联查询 ?
20.MyBatis 实现一对一有几种方式?具体怎么操作的?
有联合查询和嵌套查询联合查询是几个表联合查询只查询一次 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;
- 量子计算机|我国已经实现“量子霸权”?比起超级计算机,速度快100万亿倍
- 外星人|外星人一定是“人”吗?他们的存在形式或超乎想象!
- 华为watch|?华为新机开售,价格仅1488元,14天超长续航
- 华为|华三很难超越华为的体量
- 显卡|评价量超100万,爆款骁龙870手机重回低价,12+256GB仅2299元
- 纳米|用于长距离、超安全的量子通信的纳米天线
- 创投圈|87项技术专利!Reno7系列首发超感光猫眼镜头,夜拍体验或独一份
- |中国科学家曾首次发现超新星,8个月天空可见,爆炸后影响有多大?
- 超能力|反常?科学家拍到罕见画面:猩猩生吞一只懒猴,人类需要负责?
- 珊瑚|新冠病毒“超级突变”,不别紧张,相信科学!