面试题——Mybatis


前言

提示:还是建议大家先开下目录,自我检查一番


提示:以下是本篇文章正文内容

二、文章正文

1.Mybatis简介以及优缺点?

Mybatis是一种优秀的持久层框架,它内部封装了JDBC,这使得开发过程中只需要关注SQL语句本身即可,灵活性高。它支持自定义sql、存储过程和高级映射开发可以通过xml或者注解进行编写SQL语句

优点:

  1. sql语句写在XML文件当中,将代码和sql语句实现了耦合的解除;
  2. 方便管理,可重用性高;
  3. 省略了JDBC连接和关闭,简化了开发;
  4. 提供了多种标签,支持动态SQL;
  5. 支持对象和数据库中表字段的关系映射。

缺点:

  1. 即使再简单的接口都需要在xml中编写sql语句或者使用注解编写sql;
  2. sql语句依赖与数据库,不能随意的更换数据库。
    扩展:Mybatis-Plus 这是对Mybatis的一种扩展,官方说法是对Mybatis的增强,简单的单表增删改查省略了sql语句的编写,并且凡是正确的Mybatis写法使用MYBatis-Plus都可以执行成功。感兴趣的朋友可以自行百度。

2.MyBatis 与 Hibernate 有哪些不同?

  1. Mybatis是一个半ORM框架,需要开发人员自己编写sql语句。
  2. Mybatis直接编写原生的SQL语句,可以控制sql执行性能,灵活性高。
  3. Hibernate提供了很多API,对于关系模型要求高的软件开发来说可以提高开发效率。

3.#{}和${}区别?

Mybatis中#{}会被替换成?,而${}会直接替换成变量的值。
#{}可以有效地防止SQL注入。

4.如何实现批量插入、删除、修改操作?

Myabtis 提供了一个标签foreach

insert /delete/update ...
 <foreach item="item" collection="list" separator="," open="(" close=")" index="">
 #{item.id, jdbcType=NUMERIC}
 </foreah>

item:集合中元素迭代时的别名,该参数为必选。
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
open:foreach代码的开始符号,一般是(和close=")“合用。常用在in(),values()时。该参数可选
separator:元素之间的分隔符,例如在in()的时候,separator=”,“会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
close: foreach代码的关闭符号,一般是)和open=”("合用。常用在in(),values()时。该参数可选。
collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = “ids”.如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id”

5、有哪些动态sql?他们的作用是什么?

if
choose (when, otherwise)
trim (where, set)
foreach
if :根据条件判断,是where后的一部分;

<if test="title != null">
    AND title like #{title}
  </if>

choose:类似于Java中的Switch语句

<choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>

通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。比如:

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"   open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

6、在xml映射文件中,有哪些标签?

Mybatis 提供了 9 种动态 sql 标签:

trim
where
set
foreach
if
choose
when
otherwise
bind

7、如何实现关联查询?

Myabtis 提供了标签,在定义ResultMap时可以通过标签实现关联查询

<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>

8、简述下Mybtis的缓存?

Mybatis 默认是开启一级缓存的,一级缓存的存储作用域实在Session中,当Session刷新或者关闭后,缓存将会被清空;
二级缓存默认不开启,二级缓存存储作用域是他的命名空间中,使用时可以在配置文件中那个通过
mybatis.configuration.cache-enabled=true开启,需要注意,使用二级缓存时属性类都需要实现序列化

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

  1. 在xml文件中使用 < ResultMap> 标签定义列名和对象属性名之间的映射关系;
  2. 在编写sql语句时使用别名

10、使用Mybatis的基本过程?

  1. 首先编写实体类
  2. 添加相应的Mybatis依赖,在配置文件中加入Mybatis相关的配置
  3. 编写对应的DAO层或者mapper层
  4. 编写对应的XMl文件或者在DAO或者mapper上编写SQL语句。
  5. 此时就可以编写测试方法进行测试了
    简单的Mybatis配置
mybatis:
  mapper-locations: classpath:mapping/*Mapper.xml #这里是指定Mapper文件的位置
  type-aliases-package: com.example.entity #指定实体类的位置

总结

以上就是今天要讲的关于Mybatis方面的一些内容,本文大体罗列了一些常见的Mybatis方面的问题,不足之处欢迎指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值