Java开发工程师最新面试题库系列——Mybatis框架部分(附答案)
Mybatis
Mybatis是什么框架?
答:持久层框架
Mybatis和ORM有什么区别?
答:ORM是对象关系映射的一种设计理念,也就是对象属性对应数据库字段,让开发人员以操作对象的方式操作数据库数据。Mybatis是基于ORM框架实现的持久层框架,但它并是不完全ORM,Mybatis只是将对象与sql语句关联起来了,而不是与数据库数据关联;
Mybatis为什么是半自动ORM映射?
答:Mybatis只是将对象与sql语句关联起来了,而不是与数据库数据关联。因此需要手动编写SQL语句,所以是半自动ORM映射。
Mybatis框架的应用场景?
答:对SQL语句的查询性能要求比较高的地方,例如需要在查询时带上某个索引字段条件,以此来优化查询性能。
Mybatis有哪些优缺点?
答:
1.sql语句与代码分离,存放于xml配置文件中:
优点:便于维护管理,不用在java代码中找这些语句;
缺点: JDBC方式可以用用打断点的方式调试,但是Mybatis不能,需要通过log4j日志输出日志信息帮助调试,然后在配置文件中修改。
2.用逻辑标签控制动态SQL的拼接:
优点:用标签代替编写逻辑代码;
缺点:拼接复杂SQL语句时,没有代码灵活,拼写比较复杂。不要使用变通的手段来应对这种复杂的语句。
3.查询的结果集与java对象自动映射:
优点:保证名称相同,配置好映射关系即可自动映射或者,不配置映射关系,通过配置列名=字段名也可完成自动映射。
缺点:对开发人员所写的SQL依赖很强。
4.编写原声SQL:
优点:接近JDBC,比较灵活。
缺点:对SQL语句依赖程度很高;并且属于半自动,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。
Mybatis和Hibernate有什么区别?
答:
1、Mybatis是半ORM,Hibernate是全ORM
2、Mybatis是对JDBC细粒度的封装,SQL语句还是需要开发人员编写。Hibernate是对JDBC粗粒度的封装,完全不需要开发人员编写SQL。
3、Mybatis更加灵活,在SQL语句编写时更好对数据库性能进行优化。Hibernate分装得比较狠,优化SQL困难。
4、Mybatis移植性相对较差,因为不同的数据库SQL语句是有差异的,Hibernate移植好,不同的数据库采用不同的方言配置即可
5、Mybatis开发周期长,体现在编写SQL语句和结果集映射,Hibernate开发周期短,能够快速开发。
Mybatis有哪几种SQL编写形式?
答:
1、xml静态SQL编写
2、xml动态SQL编写
3、注解@Select标记在方法上 编写SQL
Mybatis支持哪些传参的方法?
答:
方法1:顺序传参法
public User selectUser(String name, int deptId); <select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{0} and dept_id = #{1}
</select>
方法2:@Param注解传参法
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId); <select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>
方法3:Map传参法
public User selectUser(Map<String, Object> params); <select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>
方法4:Java Bean传参法
public User selectUser(Map<String, Object> params); <select id="selectUser" parameterType="com.test.User" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>
Mybatis的$和#传参的区别?
答:${}是将参数与sql语句进行字符串拼接,不可避免的会代码SQL注入问题。安全性差,但可以通过一些手段来规避例如:正则表达式过滤不安全字符。#{}是将参数替换成?,之后与PerpardStatement进行SQL预编译的方式进行参数设置.
Mybatis可以映射到枚举类吗?
答:可以,需要自定义对枚举类的类型转换器。例如写一个类为EnumTypeHandler继承BaseTypeHandler<枚举类型>,重写其中的方法,在getNullableResult方法中更具返回结果做响应的转换操作。
Mybatis怎么封装动态SQL?
答:
Mybatis的trim标签有什么作用?
答: trim标记是一个格式化的标记,可以完成set或者是where标记的功能,它的参数有prefix前缀,prefixOverrides匹配前置去除,suffix后缀,suffixOverrides匹配后缀去除
Mybatis怎么实现分页?
答:
1、使用SQL的LIMIT做分页,分页参数可以使用Mybatis提供的Page封装,传给Mapper。然后使用LIMIT (page-1)*size,size方式查询数据
2、使用PageHelper插件实现
3、使用Mybatis的Interceptor拦截器实现
Mybatis的流式查询有什么作用?
答:
流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。
如果没有流式查询,我们想要从数据库取 1000 万条记录而又没有足够的内存时,就不得不分页查询,而分页查询效率取决于表设计,如果设计的不好,就无法执行高效的分页查询。因此流式查询是一个数据库访问框架必须具备的功能。
流式查询的过程当中,数据库连接是保持打开状态的,因此要注意的是:执行一个流式查询后,数据库访问框架就不负责关闭数据库连接了,需要应用在取完数据后自己关闭。
Mybatis模糊查询LIKE语句应该怎么写?
答:
1、${%field%}:存在SQL注入问题,不推荐
2、"%"#{field}"%"
3、CONCAT('%',#{field},'%')
4、bind标签了解
Mybatis配置文件中的SQL id是否能重复?
答:同一个namespace下是不能重复的
Mybatis如何防止SQL注入?
答:
1、使用#{}来设置参数
2、正则表达式过滤非法字符
Mybatis如何实现主键回填?
答:使用useGeneratedKeys="true",标识开启主键回填,keyProperty="id"指定主键回填设置到哪一个属性。
<insert id="insertBook" useGeneratedKeys="true" keyProperty="id">
insert into t_book (b_name,author) values (#{name},#{author});
</insert>
Mybatis使用了哪些设计模式?
答:
- Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
- 工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
- 单例模式,例如ErrorContext和LogFactory;
- 代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
- 组合模式,例如SqlNode和各个子类ChooseSqlNode等;
- 模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
- 适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
Mybatis的缓存机制有什么作用?
答:做服务器的进程内部缓存,提高查询效率,降低数据库访问频率。Mybatis有三种缓存,一级缓存、二级缓存、第三方缓存EhCache,一级缓存时默认开启的,作用域时SqlSession。二级缓存默认关闭需要在配置中使用enableCache="true"开启,二级缓存时namespace作用域的。第三方缓存需要引入额外Jar包,并且在配置中开启二级缓存开关,配置第三方缓存的核心类。
Mybatis一级缓存和二级缓存有什么区别?
答:
1、作用域不同:
一级缓存的作用域是SqlSession级别的Map,二级缓存是namespace级别的,也叫全局缓存
2、默认配置不同
一级缓存默认开启,二级缓存默认关闭,需要在mybatis.cfg.xml配置文件中开启
<settings>
<setting name="cacheEnabled" value="true"/>
</settings
Mybatis-plus和TK-Mybatis是什么框架?
答:Mybatis的增强框架,帮助开发人员更加简化开发。这些框架提供了大部分的简单SQL语句封装的API,提供了分页插件,简化了配置流程。不过只对单表有好的支持,多表关联查询支持差,一般需要手动编写多表的SQL,不过可以原生和增强一起使用。
Java开发工程师最新面试题库系列——Mybatis框架部分(附答案)的更多相关文章
- Java开发工程师最新面试题库系列——Java基础部分
JAVA基础 面向对象有哪些特征? 答:继承.封装.多态 JDK与JRE的区别是什么? 答:JDK是java开发时所需环境,它包含了Java开发时需要用到的API,JRE是Java的运行时环境,JDK ...
- Java开发工程师最新面试题库系列——Web部分(附答案)
WEB 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 http和https有什么区别? 答:http是超文本传输协议,默认端口是80.https是安全的默认端口是443:http是明文传输, ...
- Java开发工程师最新面试题库系列——Spring部分(附答案)
Spring Spring框架是什么? 答:Spring是轻量级的面向切面和控制反转的框架.初代版本为2002年发布的interface21,Spring框架是为了解决企业级应用开发的复杂性的出现的, ...
- Java开发工程师最新面试题库系列——集合部分(附答案)
集合 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 说说常见的集合有哪些? 答:主要分List.Set.Map.Queue四类,其中包含ArrayList.LinkedList.HashSe ...
- 【转】2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题
腾讯面试(WEB高级应用开发工程师<PHP>)非答案啊!!! 开始正题之前,容博主啰嗦两句吧,呵呵.(你也可跳过直接到红色字体看题!) 腾讯一直是我很敬重的企业,尽管小企鹅在战略上饱受争议 ...
- 2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题 [转]
笔试(45 minute):(本来是四张纸,被我弄丢了一张!无伤大雅,难度级别不会有出入) 注意:由于时间紧迫和水平有限,难免有不足或错误,请指证,虚心学习! [PHP] 写出PHP中至少5个全局变量 ...
- 阿里巴巴-OS事业群-OS手机事业部-系统服务部门招聘Java开发工程师,有意者请进来
我是阿里巴巴-OS事业群-OS手机事业部-系统服务部的开发工程师,正在招聘Java开发工程师. 以下是职位描述: 岗位名称:Java开发工程师 招聘人数:5人 生效日期:2014-03-12 结束日期 ...
- JAVA开发工程师面试(1)
我已经有很长一段时间没有更新博客了,难道是博主我变懒惰了吗?哎,这样可不行啊,我还有好多知识要学习,要和大家分享.以后我需要更加努力,改掉自己的惰性.本人文采不怎么样,只能是把自己所想的说出来,想和大 ...
- Java开发工程师学习路线
贴一个比较出名的Java开发工程师学习路线图 好好学习提升中 这个貌似也不是特别全,算法,设计模式,架构好像都没有
随机推荐
- JavaScript_继承
- JavaScript——面向对象与原型
在最外面使用this,此时this是window作用域下的,因此他指向全局变量 对象冒充: 实例属性不会共享!
- 深入了解gradle和maven的区别
目录 简介 gradle和maven的比较 可扩展性 性能比较 依赖的区别 从maven迁移到gradle 自动转换 转换依赖 转换repositories仓库 控制依赖的版本 多模块项目 profi ...
- java-GUI编程学习总结
狂神说java-GUI编程学习总结 1.简介 2.AWT 2.1.实现如图1-2 (1)面向过程写法 (2)内部类写法 (3)完全改造成面向对象 3.Swing 3.1.鼠标花点 3.2.弹窗 3.3 ...
- Google reCAPTCHA 2 : Protect your site from spam and abuse & Google reCAPTCHA 2官方教程
1
- Android Activity 与 WebView 页面线程不一致 bug
Android Activity 与 WebView 页面线程不一致 bug refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- Web 前端必备的各种跨域方式汇总
Web 前端必备的各种跨域方式汇总 跨域方式汇总 同源策略 协议相同 + 域名相同 + 端口相同 https://www.xgqfrms.xyz/index.html https://www.xgqf ...
- taro ENV & NODE_ENV & process.env
taro ENV & NODE_ENV & process.env https://github.com/NervJS/taro-ui/blob/dev/src/common/util ...
- js form.onformData事件
在表单提交前修改数据,此事件在submit之后 f1.addEventListener("formdata", (e) => { e.formData.append(&quo ...
- 用Qt写了个将视频设置为壁纸的软件
软件功能很简单,使用时占用的资源和播放的视频有关: 依赖于FFplay,Github源码 效果图: