文章目录
前言
提示:还是建议大家先开下目录,自我检查一番
提示:以下是本篇文章正文内容
二、文章正文
1.Mybatis简介以及优缺点?
Mybatis是一种优秀的持久层框架,它内部封装了JDBC,这使得开发过程中只需要关注SQL语句本身即可,灵活性高。它支持自定义sql、存储过程和高级映射,开发可以通过xml或者注解进行编写SQL语句
优点:
- sql语句写在XML文件当中,将代码和sql语句实现了耦合的解除;
- 方便管理,可重用性高;
- 省略了JDBC连接和关闭,简化了开发;
- 提供了多种标签,支持动态SQL;
- 支持对象和数据库中表字段的关系映射。
缺点:
- 即使再简单的接口都需要在xml中编写sql语句或者使用注解编写sql;
- sql语句依赖与数据库,不能随意的更换数据库。
扩展:Mybatis-Plus 这是对Mybatis的一种扩展,官方说法是对Mybatis的增强,简单的单表增删改查省略了sql语句的编写,并且凡是正确的Mybatis写法使用MYBatis-Plus都可以执行成功。感兴趣的朋友可以自行百度。
2.MyBatis 与 Hibernate 有哪些不同?
- Mybatis是一个半ORM框架,需要开发人员自己编写sql语句。
- Mybatis直接编写原生的SQL语句,可以控制sql执行性能,灵活性高。
- 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 执行结果封装为目标对象并返回的?都有哪些映射形式?
- 在xml文件中使用 < ResultMap> 标签定义列名和对象属性名之间的映射关系;
- 在编写sql语句时使用别名
10、使用Mybatis的基本过程?
- 首先编写实体类
- 添加相应的Mybatis依赖,在配置文件中加入Mybatis相关的配置
- 编写对应的DAO层或者mapper层
- 编写对应的XMl文件或者在DAO或者mapper上编写SQL语句。
- 此时就可以编写测试方法进行测试了
简单的Mybatis配置
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml #这里是指定Mapper文件的位置
type-aliases-package: com.example.entity #指定实体类的位置
总结
以上就是今天要讲的关于Mybatis方面的一些内容,本文大体罗列了一些常见的Mybatis方面的问题,不足之处欢迎指正。