Java开发工程师最新面试题库系列——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 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 resultMap="UserResultMap"> select * from user where user_name = #{userName} and dept_id = #{deptId} </select> 方法3:Map传参法 public User selectUser(Map<String, Object> params); <select 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 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的流式查询有什么作用?

答:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxwz.html