Mybatis的Sql映射文件的配置以及接口的编写详解(增删改查标签的讲解、一对多、多对一、一级二级缓存)

28 篇文章 0 订阅
5 篇文章 0 订阅

Mybatis

初始Mybatis(上篇文章的链接

上一篇文章了解了Mybatis,并且懂得主配置文件的元素属性的基础了解和配置,这篇文章我们学习sql映射文件mapper.xml和接口的编写


内容如图:
在这里插入图片描述


一、Mybatis的强大

  • Mybatis真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单

二、SQL映射文件(mapper.xml文件)

顶级元素介绍(按照定义的顺序)

  • mapper namespace
  • cache 配置给定命名空间的缓存
  • cache-ref 从其他命名空间引入缓存配置
  • resultMap 用来描述数据库结果集和对象的对应关系
  • sql 可以重用的SQL块,也可以被其他语句引用
  • insert 映射插入语句
  • update 映射更新语句
  • delete 映射删除语句
  • select 映射查询语句

mapper元素详解

  • namespace:命名空间
    • namespace和子元素的id联合保证唯一,区别不同的mapper
    • 绑定DAO接口(关键)
      • namespace的命名必须跟某个接口同名
      • 接口中的方法与映射文件中的SQL语句id一 一对应

示例:

userDao接口中有个selectAll方法,那么在同级目录下要创建一个userDao.xml配置文件,其中该文件的mapper的namespace为userDao的完整路径(包名+文件名)
同时在该xml文件中有一个< selelct id=“selectAll”>< /select>元素标签


select元素详解(重点)

select是Mybatis中最常用的元素之一
select语句是很多属性可以详细配置每一条语句

id属性
  • id
    • 命名空间中唯一的标识符
    • 接口中的方法与映射文件中的SQL语句id 一 一对应
parameterType属性
  • parameterType
    • 传入SQL语句的参数类型
    • 基本数据类型
      • int、String、Date等
      • 只能传入一个,通过#{参数名}获取传入的值
      • 当参数参数使用@Param(“别名”)时,使用#{别名}获取
    • 复杂数据类型
      • Java实体类、Map等
      • 通过#{属性名}或者#{map的keyName}即可获取传入的值
resultType属性
  • resultType
    • SQL语句返回值类型的完整类名或别名
    • 基本数据类型
    • 复杂数据类型
resultMap属性
  • resultMap:对外部resultMap的引用
    • 应用场景
      • 数据库字段信息与对象属性不一致(对象属性roleid和数据库role_id)
      • 复杂的联合查询,自由控制映射结果(如多对一等)
        注意:

resultMap和resultType不能同时存在

resultMap自动映射(自动匹配)
  • 如何使用resultMap自动映射呢?
    • 字段名与属性名相匹配

    • <setting name="autoMappingBehavior" value="NONE"/>
      在这里插入图片描述


在这里插入图片描述


举例

  • 首先我们看一下实体类:
    在这里插入图片描述

数据库表字段名展示:

在这里插入图片描述


然后我们在默认不配置setting标签(就是说默认字段属性匹配开启的情况下)配置mapper文件,如下:

在这里插入图片描述


然后我们关闭自动匹配,如下:
在这里插入图片描述


select元素小结

在这里插入图片描述


insert元素详解

  • insert
    • id
    • parameterType
    • 没有返回值参数,直接就是插入成功的记录数
      在这里插入图片描述

示例:

在这里插入图片描述


update元素详解

  • id
  • parameterType
示例:

在这里插入图片描述


update元素详解

  • id
  • parameterType
示例:

在这里插入图片描述


delete元素详解

  • id
  • parameterType
示例:

在这里插入图片描述


resultMap属性

  • id
    • resultMap的唯一标识
  • type
    • Java实体类
id属性

一般对应数据库中该行的主键id,设置该项可提高Mybatis性能(当然也可以用result来映射)

result

映射到JavaBean的某个“简单类型”属性

association
  • 简介
    映射到JavaBean的某个“复杂类型”属性,比如JavaBean类(一对一、多对一)
  • 属性
    • property:映射数据库列的实体对象的属性
    • JavaType:完整Java类名或者别名
    • resultMap:引用外部resultMap
  • 子元素
    • id
    • result
      • property:映射数据库列的实体对象的属性
      • column:数据库列名或者别名
示例(一个用户对应一个角色):
  • 首先改造我们的用户实体类如下:
    在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


collection
  • 简介
    映射到JavaBean的某个“复杂类型”属性,比如集合(一对多、多对多)

  • 属性

    • property:映射数据库列的实体对象的属性
    • ofType:完整Java类名或者别名(集合所包括的类型)
    • resultMap:引用外部resultMap
  • 子元素

    • id
    • result
      • property:映射数据库列的实体对象的属性
      • column:数据库类名或者别名
示例(一个角色对应多个用户):
  • 首先改造角色实体
    在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


  • 测试
    在这里插入图片描述

resultMap自动映射(自动匹配)进阶

上面我们提到了该setting配置的两个值(NONE、PARTIAL),接下来我们来说一下FUll属性
在这里插入图片描述


在上面的一对多的案例下:

我们手动映射字段的情况下(未配置settings下 PARTIAL):
在这里插入图片描述


接下来注释掉手动映射:
在这里插入图片描述


在接下来我们设置<setting name="autoMappingBehavior" value="FULL"/>

在这里插入图片描述


Mybatis的缓存

更多缓存内容可以看mybatis一级缓存和二级缓存

一级缓存

一级缓存的声明周期存在在sqlSession中,
sqlSession关闭,缓存失效

在这里插入图片描述


在这里插入图片描述


二级缓存

注:以下文字来源原文地址

  • eviction:缓存回收策略

LRU:最少使用原则,移除最长时间不使用的对象
FIFO:先进先出原则,按照对象进入缓存顺序进行回收
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用,更积极的移除移除基于垃圾回收器状态和弱引用规则的对象

flushInterval:刷新时间间隔,单位为毫秒,这里配置的100毫秒。如果不配置,那么只有在进行数据库修改操作才会被动刷新缓存区

size:引用额数目,代表缓存最多可以存储的对象个数

readOnly:是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),
如果设置为false,则相同的sql,后面访问的是cache的clone副本。
可以在Mapper的具体方法下设置对二级缓存的访问意愿:

<select id="save" parameterType="XX" flushCache="true"
 useCache="false"> </select>

如果没有去配置flushCache、useCache,那么默认是启用缓存的

flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
useCache默认为true,表示会将本条语句的结果进行二级缓存。 在insert、update、delete语句时:
flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
useCache属性在该情况下没有。update 的时候如果
flushCache=“false”,则当你更新后,查询的数据数据还是老的数据。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


二级缓存测试成功!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Mybatis中,处理多对多关系可以参考一对多关系的解决方法。需要注意的是,如果在映射中存在多个字段具有相同的名称(例如id),则需要为这些列起别名以避免冲突。以下是一个多对多关系的案例讲解: 1、首先,我们需要创建三张表:course、student和student_course。course表存储课程信息,student表存储学生信息,student_course表存储学生和课程之间的关联关系。 2、创建表的SQL语句如下: drop table student_course; drop table course; drop table student; 如果需要可以使用 cascade constraints; create table course (id number primary key,course_code varchar2(30) not null,course_name varchar2(30) not null); create table student (id number primary key,name varchar2(10) not null,gender varchar2(10),major varchar2(10),grade varchar2(10)); create table student_course (id number primary key,student_id number references student(id),course_id number references course(id)); 3、在Mybatis映射文件中,我们需要使用多个resultMap来定义多对多关系的映射。例如,我们可以定义一个学生的resultMap和一个课程的resultMap,并在学生的resultMap中使用collection标签来引用课程的resultMap,从而建立多对多的关系。 4、在业务逻辑中,我们可以通过Mybatis的动态SQL语句来实现多对多关系的操作。例如,通过插入学生和课程的id来向student_course表中插入数据,通过查询student_course表来获取学生所选的课程等等。 总结来说,处理Mybatis中的多对多关系,可以参考一对多关系的解决方法,并使用动态SQL语句和多个resultMap来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Mybatis中多对多映射详解](https://blog.csdn.net/suwu150/article/details/52896466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [SSM框架的学习与应用-Java EE企业级应用开发学习记录(第一天)Mybatis的学习资料](https://download.csdn.net/download/m0_53659738/88235079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吕努力变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值