MyBatis基础之几道常见面试题详解
(原文链接:http://www.studyshare.cn/blog/details/1178/1
一、开发中到底应该使用resultType还是resultMap?
强制使用resultMap,不要使用resultClass做返回参数,即便类的属性名称和数据库字段一一对应,也需要用resultMap进行定义,反之,每一个表也必然要有一个POJO类与之对应。
原因:
1、如果使用resultType,那么数据库的字段与POJO类字段必须一模一样(前提是不使用别名定义),这种情况下,如果一旦修改了数据库的表字段名称,则势必要修改对应的POJO类的属性名才能完全对应,否则会出错,然而一旦修改POJO的属性名称那业务代码用到该属性的所有地方也必须跟着修改,这就是一种强耦合。
2、数据库字段定义规则是字母+下划线(例:user_name),POJO类属性采用驼峰命名(例:userName)。使用resultType则势必会违反其中一种命名规则。
3、resultType降低了代码可维护性。如果使用resultMap只需要修改xml中字段映射配置,使数据库字段与DO类解耦,方便维护。
java开发工具下载地址及安装教程大全,点这里。
更多深度技术文章,在这里。
二、mybatis有哪几种方式传递入参?各有什么优缺点?
1、使用Map传参
Map<String, Object> params = new HashMap<String, Object>();
params.put("email", email);
params.put("sex", sex);
List<User> getUserList(Map<String, Object> map):
缺点:这种传递参数方式可读性差,导致可维护和可扩展性差,杜绝使用。
2、使用注解传参
List<User> getUserList(@Param("name")String name, @Param("sex")Byte sex);
优点:直观明了,当参数较少一般小于5个的时候,建议使用。
3、使用JavaBean传参
User user = new User();
user.setName(name);
user.setSex(sex);
List<User> getUserList(User user):
优点:代码可读性好,可维护性及扩展性佳,当参数大于5个的时候,建议使用。
三、#{}与${}使用有什么区别?
#{}:预编译,会给传入的值当成一个字符串,自动加上一个单引号,能很大程度防止sql注入。
${}:传值,传入的数据直接显示在sql中,无法防止sql注入。适用于动态报表生成,表名,选取的列是动态的,及order by和in操作。
sql注入举例:
1、xml文件编写一段sql如下:
2、传值代码:
最后执行的sql语句为:select id, userName, realName, sex, mobile, email, note from t_user where a.userName = 'xxx' or 1=1 order by sex,userName
红色部分是被注入的sql。
注意:sql.xml中建议使用#{},参数接收不要使用${},因为${}容易出现sql注入。
四、什么是N+1查询问题?如何解决?
查询方式分两种:嵌套结果与嵌套查询
1、嵌套结果:一个sql语句中将多个表关联一起查询出结果。
2、嵌套查询:用多个sql语句单独去查询每张表,主查询sql先将后续查询所需要的条件查询出来,然后去循环查询后续数据。
N+1查询问题是嵌套查询存在的问题,主查询查询一次表示1,后续查询会根据主查询查出来的结果作为参数条件去查询数据,可能是N次。
如何避免N+1问题?
使用按需加载,即:懒加载。开启懒加载配置:在<select>节点上配置“fetchType=lazy”
在MyBatis核心配置文件中加入如下配置:
<!-- 开启懒加载 ,当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。默认:true -->
<setting name="aggressiveLazyLoading" value="false" />
java开发工具下载地址及安装教程大全,点这里。
更多深度技术文章,在这里。
MyBatis基础之几道常见面试题详解的更多相关文章
- BTA 常问的 Java基础40道常见面试题及详细答案
原文:http://www.ymq.io/2018/03/10/java/ 八种基本数据类型的大小,以及他们的封装类 引用数据类型 Switch能否用string做参数 equals与==的区别 自动 ...
- BTA 常问的 Java基础40道常见面试题及详细答案(山东数漫江湖))
八种基本数据类型的大小,以及他们的封装类 引用数据类型 Switch能否用string做参数 equals与==的区别 自动装箱,常量池 Object有哪些公用方法 Java的四种引用,强弱软虚,用到 ...
- 《Java面试全解析》505道面试题详解
<Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...
- Mybatis常见面试题
Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是 ...
- Mybatis 的常见面试题
背景:好久没用Mybatis了,有些面试题还是要好好准备的. Mybatis 的常见面试题
- 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
- Java基础知识常见面试题汇总第一篇
[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后 ...
- Mybatis常见面试题汇总
Mybatis常见面试题汇总 最近在复习整理Mybatis的相关知识,针对面试中的典型问题,结合相关书籍和网上相关帖子,做如下整理. ================================= ...
- MyBatis 常见面试题总结
1.#{}和${}的区别是什么? 注:这道题是面试官面试我同事的. 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${drive ...
随机推荐
- Assign the task HDU - 3974 (dfs序 + 线段树)
有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...
- Tunnel Warfare HDU - 1540 (线段树不同子树的合并)
在抗日战争期间,华北平原广大地区进行了大规模的隧道战. 一般来说,通过隧道连接的村庄排成一列. 除了两端,每个村庄都与两个相邻的村庄直接相连. 入侵者经常对一些村庄发动袭击并摧毁其中的部分隧道. 八路 ...
- Vue 路由模块化配置
博客地址:https://ainyi.com/77 企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化 分享两个解决方案 -- Vue 路由配置 ...
- h5微信浏览器复制粘贴--ios兼容问题的解决方法(clipboard.js插件)
前段时间在做微信h5的时候,遇到了ios兼容,使用clipboard.js插件完美解决 下载地址:下载地址: https://github.com/zenorocha/clipboard.js cnd ...
- BFS-迷宫问题
问题描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...
- 实测win10 efi启动及centos7双系统引导顺序修改
安装win10 安装win10过程中,系统自动建立esp分区,分区格式为FAT16,目录如下 1,EFI/Boot文件夹保持不动 删除 EFI/Microsoft/boot/ 文件夹下面除BCD文件外 ...
- mybatis 源码分析(二)mapper 初始化
mybatis 的初始化还是相对比较复杂,但是作者在初始化过程中使用了多种设计模式,包括建造者.动态代理.策略.外观等,使得代码的逻辑仍然非常清晰,这一点非常值得我们学习: 一.mapper 初始化主 ...
- 字典更新与K-SVD
字典更新与K-SVD 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 矩阵的奇异值分解 (Singular Value Decomposition, S ...
- Python笔记_初级语法
1.标识符与变量 1.1 标识符 规范 只能由数字,字母,_(下划线)组成 不能以数字开头 不能是关键字 区分大小写 命名约束 下划线分隔法(推荐): 多个单词组成的名称,使用全小写字母书写,中间使用 ...
- Spring学习之旅(七)--SpringMVC视图
在之前的实例中我们只是在 Controller 中返回了 home 字符类型的值,而没有直接生成可以在浏览器中直接渲染的 HTML,这是因为 SpringMVC 将请求处理的逻辑和视图渲染的实现进行了 ...