数据库|面试题——Mybatis


文章目录

  • 前言
  • 二、文章正文
    • 1.Mybatis简介以及优缺点?
    • 2.MyBatis 与 Hibernate 有哪些不同?
    • 3.#{}和${}区别?
    • 4.如何实现批量插入、删除、修改操作?
    • 5、有哪些动态sql?他们的作用是什么?
    • 6、在xml映射文件中,有哪些标签?
    • 7、如何实现关联查询?
    • 8、简述下Mybtis的缓存?
    • 9、Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
    • 10、使用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 ... #{item.id, jdbcType=NUMERIC}

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后的一部分;
AND title like #{title}

choose:类似于Java中的Switch语句
AND title like #{title} AND author_name like #{author.name} AND featured = 1

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

set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。比如:
update Author username=#{username}, password=#{password}, email=#{email}, bio=#{bio} where id=#{id}

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

6、在xml映射文件中,有哪些标签? Mybatis 提供了 9 种动态 sql 标签:
trim where set foreach if choose when otherwise bind

7、如何实现关联查询? Myabtis 提供了标签,在定义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方面的一些内容,本文大体罗列了一些常见的Mybatis方面的问题,不足之处欢迎指正。

    推荐阅读