MyBatis面试题目

MyBatis面试试题

第一部分(简答题)

1、什么是Mybatis?

(1)Mybatis是一个半ORM(对象关系映射)框架,也是持久层框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC
代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和
statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

2、Mybatis的四个核心接口以及用处:

(1) Executor:用于执行CRUD操作;
(2) ParameterHandler:处理SQL的参数;
(3)ResultSetHandler:处理返回结果集;
(4) StatementHandler:用于执行SQL语句;

3、#{}和${}的区别是什么?**

(1)#{}是预编译处理(sql通配符),${}是字符串替换(拼接通配符。
(2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
(3)Mybatis在处理${}时,就是把${}替换成变量的值。
(4)使用#{}可以有效的防止SQL注入,提高系统安全性。

4、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致

<select id=”selectorder” parametertype=int” resultetype=”me.gacl.domain.order”>      
	select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};   
</select> 

第2种: 通过resultMap来映射字段名和实体类属性名的一一对应的关系

<select id="getOrder" parameterType="int" resultMap="orderresultmap">       
	select * from orders where order_id=#{id}   
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”> 
	<!–用id属性来映射主键字段–> 
	<id property=”id” column=”order_id”> 
	<!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–> 
	<result property = “orderno” column =”order_no”/> 
	<result property=”price” column=”order_price” /> 
</reslutMap>

5、模糊查询like语句该怎么写?

第1种:在Java代码中添加sql通配符。

String animalName =%tige%; 
list<name> names =mapper.selectlike(animalName ); 
<select id=”selectlike”> 
	select * from foo where bar like #{value} 
</select>

第2种:在sql语句中拼接通配符,会引起sql注入

String animalName =%tige%; 
 list<name> names = mapper.selectlike(wildcardname); 
 <select id=”selectlike”> 	
 	select * from foo where bar like "%"#{value}"%" 
 </select>

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

如果采用自增长策略,自动生成的键值在insert方法执行完成后可以被设置到传入的参数对象中。 useGeneratedKeys=”true”
keyProperty=”id”

实例:

<insert id=”insertname” usegeneratedkeys=true” keyproperty=”id”>
 insert into names (name) values (#{name}) 
 </insert>
  name name = new name(); 
  name.setName(“fred”); 
  int rows = mapper.insertname(name);
   // 完成后,id已经被设置到对象中 
   system.out.println(“rows inserted =+ rows); 		system.out.println(“generated key value =+ name.getid());

7、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;

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

注意:传递单个参数时,MyBatis会自动进行参数的赋值传递多个参数时,MyBatis会自动封装到Map集合中

第1种:用map集合//DAO层的函数

Public UserselectUser(String name,String area);
//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。 
<select id="selectUser" resultMap="BaseResultMap"> 	
	select * from user_user_t where user_name = #{0} and user_area=#{1} 
</select>

第2种: 使用 @param 注解:

import org.apache.ibatis.annotations.param; 
public interface usermapper { 
User selectuser(@param(“username”) string username, @param(“hashedpassword”) string hashedpassword); 
}

然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):

<select id=”selectuser” resulttype=”user”> 
	select id, username, hashedpassword 
from some_table 
where username = #{username} 
and hashedpassword = #{hashedpassword} 
</select>

9、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理。

(1)Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
(2)Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
(3)其执行原理为:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

10、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>加上动态sql的9个标签,其中<sql>为sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持自增的主键生成策略标签。

11、一对一、一对多的关联查询如何使用?

(1)一对一的关联查询使用<association>标签实例:

<mapper namespace="com.lcb.mapping.userMapper"> 	
	<select id="getClass" parameterType="int" resultMap="ClassesResultMap"> 
		select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id} 
	</select> 
	
	<resultMap type="com.lcb.user.Classes" id="ClassesResultMap"> <!-- 实体类的字段名和数据表的字段名映射 --> 
		<id property="id" column="c_id"/> 
		<result property="name" column="c_name"/> 				
		<association property="teacher" javaType="com.lcb.user.Teacher"> 
			<id property="id" column="t_id"/> 		
			<result property="name" column="t_name"/> 				
		</association> 
	</resultMap>
</mapper>

(2)一对多的关联查询使用<collection>标签

<select id="getClass2" parameterType="int" resultMap="ClassesResultMap2"> 
	select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id} 	
</select> 

<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2"> <id property="id" column="c_id"/> 
	<result property="name" column="c_name"/> 
	<association property="teacher" javaType="com.lcb.user.Teacher"> 
		<id property="id" column="t_id"/> 
		<result property="name" column="t_name"/>
	</association> 
	<collection property="student" ofType="com.lcb.user.Student"> 
		<id property="id" column="s_id"/> 
		<result property="name" column="s_name"/>
	</collection> 
</resultMap>

12、Mybatis的一级、二级缓存:

(Mybatis中提供了一级缓存和二级缓存,其中一级默认存在,不可控制。同一SqlSession范围内的操作共享该缓存,增删改后将清除缓存)
(1)一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或
close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
(2)二级缓存与一级缓存其机制相同,默认也是采用
PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如
Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>
(3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D
操作后,默认该作用域下所有 select 中的缓存将被 clear。

13、Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
举例:select rom student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

14、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

第二部分(填空题)

  1. 在Mybatis数据库操作时,需要编写接口和抽象方法和对应的XML文件 ,其中XML文件中编写是是对应的SQL语句。
  2. MyBatis 是一款优秀的自定义SQL查询、存储过程和高级映射的持久层框架,几乎封装所有的JDBC代码和参数的手动设置以及结果集的检索,通过XML或注解的方式进行配置映射实现数据库操作,大大提高了开发效率。
  3. Mybatis中用于表示输入类型的属性名称:parameterType
  4. 主要用于更新时的MyBatis动态SQL的标签是:Set
  5. 在Mybatis的配置文件中,通过typeAliases标签来设置实体类的别名。
  6. 配置实体包的别名:
<typeAliases>
	<package name=”com.swjd.bean”/>
</typeAliases>
  1. Mybatis中多对一使用association标签。
  2. 在Mybatis中,操作数据库的核心类是SqlSession
  3. 在MyBatis中调用SqlSessionFactoryBuilder的openSession()方法用于获取SQLSession对象。
  4. ORM是什么意思:对象关系映射
发布了2 篇原创文章 · 获赞 0 · 访问量 18

猜你喜欢

转载自blog.csdn.net/iSofu/article/details/105267425