mapper的使用

2023-10-26

一、通用mapper概述

它是mybatis的一个插件,单表查询的时候,使用通用mapper会非常的方便。极大地方便开发人员,可以按照需要选择通用方法,还可以自定义通用方法。不过它也有一个非常大的局限性:只支持单表操作,不支持多表查询。

1.导入依赖

SpringBoot项目,我们优先找启动器即可,也就是包含starter的依赖,这个是由通用mapper作者自己写的启动器。

导入通用mapper启动器后,我们能发现其本身就包含了jdbc和mybatis的库。所以这两个的依赖就不用导入了。

2.user实体类与数据表

在通用mapper中,表名默认使用类名,驼峰转下划线。比如说tab_user表,我们在Java中可以使用TabUser这个类表示。但这样显然不太合适,我们一般都是用User实体类,那怎么办呢?

① @Table注解

@Table(name="tab_user"),也可以通过name属性指定该实体类对应的表名。

② @Id、@KeySql注解

@Id用来指定Id,这不用多说,其中@KeySql用来获取自增主键。这是一个什么意思呢?大致理解就是:令MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键。

③ @Column注解

Java中的属性与表字段默认是驼峰匹配,比如说userName就对应着user_name。如果不符合这个原则,就用@Column注解说明表字段名,当然一般给Java实体类属性取名时都会按照驼峰匹配来。

④ @Transient注解

Transient,瞬态的意思,该注解可以忽视Java实体类中的属性,不作为表字段使用。比如说该实体类中比数据表字段多一个属性,就可以使用该注解做一个说明

二、代码编写及测试

1.Mapper层和启动类

mapper层也就是我们以前的dao层。

通用mapper厉害的地方在于,我们不用在mapper中写对应的方法,只需要继承mapper这个接口即可。

在启动类中使用@MapperScan开启mapper包扫描,因为我的mapper都是在com.liuxiaoai.mapper包中的,所以在该注解中说明即可。

注意:和通用mapper相关的包都是以tk开头的,不要弄混了。

2.Controller层和Service层

① Controller层

再次对这些注解做一个回顾:

@RestController就相当于@Controller加上@ResponseBody,前者表明是一个处理器,后者能将响应数据转为json格式。

@Autowired表示引入UserService。

@RequestMapping("user")表示该处理器能接受访问路径为user的请求。

@GetMapping("{id}")表示子路径为id。

@PathVariable("id")表示获取访问路径中输入的子路径参数。

②Service层

引入userMapper,使用通用mapper直接完成查询,它的方法都是见名知义的:

selectByPrimaryKey()即根据主键查询。

3.浏览器测试

访问路径user/1,输入1即查询id为1的数据,若是输入2即查询id为2的数据。

响应的数据为json数据格式,我这里是使用的一个json插件,所以格式看起来很好看。

三、通用mapper之增删改

数据库无外乎就是增删改查,上述讲了查询,再说增删改,当然通用mapper中提供的方法也不少,我这边只说下常用的方法。

1.增加方法

这边的话我用一个user对象作为伪数据来测试,实际项目中应该是前端传来的数据。

通用mapper中有两个增加方法:

insert():即增加的意思。

insertSelective():即为选择性的增加。

这两者有什么区别呢?在于sql语句的不同:

直接增加数据sql语句中增加的字段为所有字段,user对象中没有值则为null。

有选择性增加数据,sql语句红增加的字段为user对象中不为空的字段。

2.修改方法

看方法名的意思,也就是根据主键修改数据。

① 非选择性修改

修改id为1的所有数据,如果user对象中的值为null,数据表中对应的值也被修改成null。

② 选择性修改

如果user对象中的值为null,数据表中对应的值不做修改,保持不变。

3.删除方法

① 根据主键删除

例子中即为删除id为12的数据。

② 根据非主键删除

其中属性之间是and连接,比如上述例子中是查询usernname为liuxiaoai,并且name为“刘小爱”的数据,两者都得满足条件才行。

四、高阶查询example

上述编写过根据id查询数据的方法,直接使用的是selectByPrimaryKey()方法。

如果是多条件查询该怎么办?就需要使用到通用mapper提供的example对象。

① example对象

通用mapper中提供的高阶查询就是通过example对象来完成的。

② 条件查询

example的createCriteria()方法,可以创建Criteria对象,Criteria也就是条件的意思。

通过criteria对象可以设定各种条件,方法都是见名知意的:

比如andEqualTo("sex","1")意思就是sex等于1的条件。比如andGreateThan("age","25")意思就是age大于25的条件。当然criteria对象也可以一直添加条件的,满足链式编程,条件是各种各样的,有很多种。

这边就不详细讲了,基本上我们弄懂了英文单词对应的意思,也就知道其作用了。

example的or方法可以将多个条件以or的形式连接起来,同理也有一个and方法。

③添加排序规则

example的setOrderByClause()方法可以添加排序规则,比如“id desc”就表示按照id降序排序。

其中example在修改和删除方法中也可以使用,用法是类似的,就不再赘述了。

参考自:https://baijiahao.baidu.com/s?id=1675770863842950343&wfr=spider&for=pc 作者:刘小爱

个人理解:Mapper是一个封装了对数据表进行增删改查方法的工具,在Service的实现类中可以通过 BaseMapper.方法名()的方式实现对数据表的基本操作,但是只支持对单表进行操作,当所需具体实现方法不满足需求,例如需要查询多个表时,可以在对应的mapper接口中书写抽象方法,并在对应的.xml文件中书写实现操作所需的SQL语句。

CoursePublishVo getCoursePublishInfo(String courseId);
//mapper接口中自定义的抽象方法
<!--sql语句:根据课程id查询课程最终的确认信息-->
    <select id="getCoursePublishInfo" resultType="com.atguigu.eduservice.entity.vo.CoursePublishVo">
        SELECT ec.id, ec.price, ec.lesson_num AS lessonNum, ec.title,
               et.name AS teacherName,
               es1.title AS subjectLevelOne,
               es2.title AS subjectLevelTwo
        FROM edu_course ec LEFT JOIN edu_course_description ecd ON ec.id=ecd.id
                           LEFT JOIN edu_teacher et ON ec.teacher_id=et.id
                           LEFT JOIN edu_subject es1 ON es1.id=ec.subject_parent_id
                           LEFT JOIN edu_subject es2 ON es2.id=ec.subject_id

        WHERE ec.id=#{courseId}
    </select>

上面是在对应xml文件中书写的SQL具体实现语句。

select id="getCoursePublishInfo",双引号表示内容为实现类中的函数方法名。

resultType="com.atguigu.eduservice.entity.vo.CoursePublishVo”,双引号中内容表示实现类中该方法的返回值类型,其返回的是一个类,要得到这个类的具体包名。

WHERE ec.id=#{courseId},courseId表示getCoursePublishInfo()方法里的参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mapper的使用 的相关文章

随机推荐

  • torch.exp()的使用举例

    参考链接 torch exp input out None 参考链接 exp 代码实验展示 Microsoft Windows 版本 10 0 18363 1256 c 2019 Microsoft Corporation 保留所有权利 C
  • Highcharts的3D饼图上下颠倒及解决办法

    我需要的样式效果 那发现常规的echarts不满足了 就改成了highcharts进行3d图表开发 but在开发的过程中发现了这个现象 来吧 看看问题 第一次进入页面 饼图是正常的 戳这个进去瞅瞅 喵 那你进去就看到这个样子的饼图呢 但是由
  • Spring5框架一:IOC实现的两种方式和底层原理

    1 概念 先了解 原理后面再写 1 spring是一个轻量级的开源的JavaEE框架 引入jar包的数量以及体积都比较小 2 spring框架可以解决企业应用开发的复杂性 3 spring里面有很多组成部分 IOC和AOP两个核心部分 IO
  • OpenVX 的 立即模式(immediate mode)和图模式(graph mode)和示例讲解

    OpenVX 的 立即模式 immediate mode 和图模式 graph mode openvx的执行模型一般分为 立即模式 和 图模式 直接模式非常简单 以vxu 开头的函数类似于opencv 习惯于传统的opencv api的 能
  • 整理gitHub项目JavaGuide-CSDN版

    文章目录 java 基础 基础知识系统总结 重要知识点详解 其他 容器 并发 面试题总结 面试常问知识点 JVM 其他 网络 操作系统 Linux系统 数据结构与算法 数据结构 算法 常见算法问题总结 数据库 MySQL 总结 重要知识点
  • 小程序文件系统之 -- 读写文件

    1 文件写入 获取文件系统管理器 const fs wx getFileSystemManager const writeFile data url gt const filePath wx env USER DATA PATH test
  • JAVA8将集合中的某个字段相加、批量修改某个值、高效率循环、高效便捷遍历map

    1 集合中的某个字段相加 BigDecimal 类型保留两位 Objects为你的list集合 BigDecimal freightSum objects stream map Object getMoney reduce BigDecim
  • 获得python的list中含有重复值的index

    关于怎么获得 我想其实网上有很多答案 list index 获得值的索引值 但是如果list中含有的值一样 例如含有两个11 22 这样每次获得的都是第一个值的位置 那么怎么去解决这个问题呢 下面的程序对这个问题做了一定的解答 usr bi
  • 二维码图片生成,并返回给前端

    GetMapping value qrCode produces MediaType IMAGE PNG VALUE public byte qrCode return demoService qrCode public byte qrCo
  • vscode+ssh连接远程linux系统服务器,并用anaconda管理python环境

    vscode ssh连接远程linux系统服务器 并用anaconda管理python环境 一 vscode连接服务器 1 vscode下载插件 remote SSH 2 连接服务器 3 修改配置 二 将代码拷贝到服务器上与代码同步 1 转
  • 在内部局域网内搭建HTTPs

    在内部局域网内搭建HTTPs 配置环境 Windows版本 Windows Server 2008 R2 Standard Service Pack 1 系统类型 64 位操作系统 内存 4GB 了解HTTPS 为什么需要 HTTPS 多数
  • 使用Python,OpenCV应用EAST文本检测器检测自然场景图像中的文本

    使用Python OpenCV应用EAST文本检测器检测自然场景图像中的文本 1 效果图 2 原理 2 1 为什么自然场景文本检测如此具有挑战性 2 2 替代EAST文本检测实现 3 源码 3 1 text detection py 3 2
  • Mac电脑开机出现带问号的文件夹并且闪烁 apple.com/support -2003F

    文章目录 1 视界 2 背景 2 1 开始 2 2 恐慌 2 3 转机 2 3 1 时间机器 2 3 2 重新安装 3 2 3 磁盘恢复 4 欣喜 5 神转折 6 忐忑 7 凉凉了 8 root账户 9 磁盘管理 10 两天后 11 小结
  • 性能测试-JMeter influxdb grafana性能测试监控平台-食用指南

    目录 influxdb grafana安装 influxdb grafana启动 JMeter性能数据写入influxdb JMeter 后端监听器 grafana配置 influxdb grafana安装 yum install infl
  • FreeRTOS任务基础

    任务特性 没有数量限制 一个优先级下也可以拥有多个任务 支持抢占 FreeRTOS为抢占式内核高优先级可以抢占低优先级的CPU使用权 支持优先级 决定任务运行的先后 每个任务都拥有堆栈导致了RAM使用量增大 抢占需考虑重入问题 任务状态 运
  • 操作系统 实验一 进程调度实验

    操作系统实验一 进程调度实验 题目描述 1 设计一个有N个进程并发的进程调度程序 每个进程由PCB 表示 PCB中包含进程名 优先数 服务时间等信息 2 用链表表示就绪队列 每个进程PCB用结构体结点表示 3 已知各进程的的到达时间等如下
  • vs打开qt的ui文件,报错闪退+已解决

    触发行为 使用vs打开项目 点击ui文件后 数秒后qt designer闪退 报错内容 解决 方法一 鼠标右击 在qt designer 打开后 闪退前 鼠标右击 方法二 打开qt designer 打开最近窗口 扩展 gt qt gt q
  • MapReduce job任务源码提交流程

    waitForCompletion submit 1建立连接 connect 1 创建提交Job的代理 new Cluster getConfiguration 1 判断是本地yarn还是远程 initialize jobTrackAddr
  • linux下go语言代理

    export GO111MODULE on export GOPROXY https goproxy cn
  • mapper的使用

    一 通用mapper概述 它是mybatis的一个插件 单表查询的时候 使用通用mapper会非常的方便 极大地方便开发人员 可以按照需要选择通用方法 还可以自定义通用方法 不过它也有一个非常大的局限性 只支持单表操作 不支持多表查询 1