通用返回_Springboot项目整合通用mapper

1.简介

  • 什么是通用mapper

什么是通用mapper,用一句话概括就是,它就是一个辅助mybatis开发的组件,它不是替代mybatis,而是使mybatis更方便的开发。通用mapper提供极其方便的单表的增删改查,可以按照自己的需要使用通用方法,还能很方便开发自己的通用方法。

  • 为什么使用通用,apper

原生Mybatis痛点

  1. mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
  2. 需要自己实现sql分页,select * from table where . . . limit 1,3。自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
  3. 数据库可移植性差:如果项目更换数据库,比如oracle-->mysql,mapper.xml中的sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。
  4. 生成的代码量过大。
  5. 批量操作,批量插入,批量更新,需要自写。

2.SpringBoot项目中整合通用Mapper

  • 引入jar包
<!--        引入通用mapper--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version></dependency>
  • 启动类上加上@MapperScan扫描注解
@SpringBootApplication
@MapperScan("com.sangon.springdemo.mapper")
@EnableScheduling
public class TimedTaskApplication {public static void main(String[] args) {SpringApplication.run(TimedTaskApplication.class, args);}
}

2f8f45d8ed9123a2a07d4e708c628229.png

注意导入的包是tk.......

  • 实体类
@Data
@Table(name = "student")
public class Student {@Idprivate String id;private String name;private Integer age;
}

@Table注解

注解中的name属性绑定的是数据库中对应的表名称

@Id注解

在字段上加上此注解说明此字段为主键

  • 编写mapper
public interface StudentMapper extends Mapper<Student> {
}

新建接口StudentMapper继承Mapper<T>,泛型中就是Student实体类。

3.通用mapper的增删改查

  • 查询

controller层

@RequestMapping(value = "/getStudent", method = RequestMethod.GET)public Student getStudentById(@RequestParam String id){return timedTaskService.getStudentById(id);}

service层

/*** description: 根据主键id查询数据(使用通用mapper)** @param id* @return com.sangon.springdemo.entity.Student*/public Student getStudentById(String id);

impl:

@Autowiredprivate StudentMapper studentMapper;@Overridepublic Student getStudentById(String id) {Student student = studentMapper.selectByPrimaryKey(id);return student;}

studentMapper.selectByPrimaryKey(id),根据主键id查询Student信息

  • 新增

controller层

@RequestMapping(value = "/insertStudent", method = RequestMethod.POST)public void insertStudent(@RequestParam String name, @RequestParam Integer age){timedTaskService.insertStudent(name, age);}

service层

/*** description: 插入学生信息** @param name* @param age* @return void*/public void insertStudent(String name, Integer age);

impl:

@Autowiredprivate StudentMapper studentMapper;
@Overridepublic void insertStudent(String name, Integer age) {Student student = new Student();student.setId(UUIDUtils.getUuid());student.setName(name);student.setAge(age);studentMapper.insert(student);//studentMapper.insertSelective(student);}

studentMapper.insert(student); 使用insert方法将学生信息插入数据

insert(): 插入

insertSelective(): 选择性插入

两个方法的区别:

使用插入时当字段值为空就将值为null插入数据,这个字段还是会参与插入

age字段为空,插入时的sql语句中该字段还是会参与

95f8967e81473470262f6cd5f88da17c.png

使用选择性插入时字段是不会参与插入的

age字段为空,插入时的sql语句中该字段是不会参与的

b3241b879daaedaf513a395d123e2ec5.png
  • 修改

controller层

    @RequestMapping(value = "/updateStudent", method = RequestMethod.PUT)public void updateStudent(@RequestBody Student student){timedTaskService.updateStudent(student);}

service层

/*** description: 修改学生信息** @param student* @return void*/public void updateStudent(Student student);

impl:

 @Autowiredprivate StudentMapper studentMapper;@Overridepublic void updateStudent(Student student) {studentMapper.updateByPrimaryKey(student);//studentMapper.updateByPrimaryKeySelective(student);}

非选择性修改:updateByPrimaryKey(student);

如果student的值为null,表中的数据也会被修改为null。

选择性修改:updateByPrimaryKeySelective(student);

如果student的值为null,表中的数据不会被修改为null,保持不变。

  • 删除

controller层

@RequestMapping(value = "/deleteStudent", method = RequestMethod.DELETE)public void deleteStudent(@RequestParam String id, @RequestParam String name, @RequestParam Integer age){timedTaskService.deleteStudent(id, name, age);}

service层

/*** description: 删除学生信息数据** @param id* @param name* @param age* @return void*/public void deleteStudent(String id, String name, Integer age);

impl

@Overridepublic void deleteStudent(String id, String name, Integer age) {//studentMapper.deleteByPrimaryKey(id);Student student = new Student();student.setName(name);student.setAge(age);studentMapper.delete(student);}
  1. 根据主键删除

studentMapper.deleteByPrimaryKey(id);

2.根据非主键删除

studentMapper.delete(student);

其中属性之间使用and连接,比如上述例子中,删除数据时必须同时满足name和age两个字段时这个数据才会被删掉。

4.通用Mapper高阶使用example

通用Mapper中的方法解析

方法功能说明
List select(T var1);根据实体中参数查询返回满足条件的集合数据
T selectByPrimaryKey(Object var1);根据主键id查询返回该主键的数据
List selectByExample(Object var1);按条件查询
List selectAll();查询所有数据返回数据的集合
List selectByExampleAndRowBounds(Object var1, RowBounds var2);根据Example类型参数条件和分页参数查询数据
List selectByRowBounds(T var1, RowBounds var2);根据参数条件和分页参数查询数据
int selectCount(T var1);根据筛选条件查询匹配的数据的条数
int selectCountByExample(Object var1);根据Example筛选条件查询匹配的数据的条数
T selectOne(T var1);根据筛选条件查询唯一的数据并返回
T selectOneByExample(Object var1);根据Example筛选条件查询唯一的数据并返回
int insert(T var1);插入数据
int insertSelective(T var1);选择性插入数据
int updateByPrimaryKey(T var1);根据主键修改数据
int updateByPrimaryKeySelective(T var1);根据主键选择性修改数据
int updateByExample(@Param("record") T var1, @Param("example") Object var2);根据Example参数修改数据
int updateByExampleSelective(@Param("record") T var1, @Param("example") Object var2);根据Example参数选择性修改数据
int delete(T var1);删除数据,里面参数会使用and进行拼接
int deleteByExample(Object var1);根据参数删除数据
int deleteByPrimaryKey(Object var1);根据主键删除数据
方法说明
example.setOrderByClause(“字段名 ASC”);添加升序排列条件,DESC为降序
example.setDistinct(false)去除重复,boolean型,true为选择不重复的记录。
criteria.andXxxIsNull添加字段xxx为null的条件
criteria.andXxxIsNotNull添加字段xxx不为null的条件
criteria.andXxxEqualTo(value)添加xxx字段等于value条件
criteria.andXxxNotEqualTo(value)添加xxx字段不等于value条件
criteria.andXxxGreaterThan(value)添加xxx字段大于value条件
criteria.andXxxGreaterThanOrEqualTo(value)添加xxx字段大于等于value条件
criteria.andXxxLessThan(value)添加xxx字段小于value条件
criteria.andXxxLessThanOrEqualTo(value)添加xxx字段小于等于value条件
criteria.andXxxIn(List<?>)添加xxx字段值在List<?>条件
criteria.andXxxNotIn(List<?>)添加xxx字段值不在List<?>条件
criteria.andXxxLike(“%”+value+”%”)添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”+value+”%”)添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2)添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2)添加xxx字段值不在value1和value2之间条件

5.使用案例

@Overridepublic void parse() {Example example = new Example(Student.class);Example.Criteria criteria = example.createCriteria();// 添加筛选条件 年龄大于等于45criteria.andGreaterThanOrEqualTo("age", "45");// 添加分页筛选条件RowBounds rowBounds = new RowBounds(0, 5);List<Student> studentList = studentMapper.selectByExampleAndRowBounds(example, rowBounds);for (Student student : studentList) {System.out.println("name:" + student.getName());}

查出的数据就为年龄大于等于45的前五条数据。

    @Overridepublic void parse() {Example example = new Example(Student.class);Example.Criteria criteria = example.createCriteria();// 添加查询条件  根据id为f4ba6717fe054c5cbe1730aed4d64d51进行查询criteria.andEqualTo("id", "f4ba6717fe054c5cbe1730aed4d64d51");// 查询唯一的数据Student student = studentMapper.selectOneByExample(example);System.out.println("name:" + student.getName());}

查出唯一一条数据,如果根据筛选条件查出的数据不是唯一的,则会报错

@Overridepublic void parse() {Example example = new Example(Student.class);Example.Criteria criteria = example.createCriteria();// 创建筛选条件,查询年龄在25到50之间的数据criteria.andBetween("age", 25, 50);List<Student> studentList = studentMapper.selectByExample(example);for (Student student : studentList) {System.out.println("name:" + student.getName());}}

筛选的条件为根据字段age进行筛选,筛选出年龄在25-50之间的数据

6.寄语

之前在项目中使用过通用mapper,已经有些时间了,这里做了一下总结,欢迎小伙伴们进行指正。

不积硅步无以至千里,不积小流无以成江河

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++总结笔记(二)面向对象

面向对象&#xff08;OOP&#xff09; 面向对象&#xff08;Object-oriented programming&#xff09;程序设计是一种适用于设计、开发各类软件的泛型&#xff1b;面向对象采用了自顶向下&#xff0c;逐步求精的原则&#xff1b; 面向对象主要包括对象、类、数据抽象、继承、动…

Linux下获取线程TID的方法——gettid()

如何获取进程的PID&#xff08;process ID&#xff09;? 可以使用&#xff1a; #include <unistd.h> pid_t getpid(void); 通过查看头文件说明&#xff0c;可以得到更详细的信息&#xff1a;find /usr/include -name unistd.h /usr/include/asm/unistd.h /usr/…

差值平方和匹配_机器学习实战 | 简单目标识别与意图分析之模板匹配

(点击上方快速关注并设置为星标&#xff0c;一起学Python)一天&#xff0c;我正在学校楼下撸猫&#xff0c;同学发来消息&#xff0c;他的老师给了他一个研究课题&#xff0c;大致的方向是对图片或者视频里面的内容进行识别&#xff0c;然后判断意图&#xff0c;而且举了个例子…

python切片操作的几种格式_【Python杂记】第四篇:序列切片

使用python处理问题的过程中&#xff0c;经常会遇到从某个序列中抽取部分值的情况。“切片”操作正是专门用于实现这一目的的方法。 实际上&#xff0c;可以通过单次或多次切片操作实现任意目标值切取。切片操作的基本语法很简单&#xff0c;下面就以列表来举例&#xff0c;说明…

grep用法

命令选项-?同时显示匹配行上下的&#xff1f;行&#xff0c;如&#xff1a;grep -2 pattern filename同时显示匹配行的上下2行。-a, --text等价于匹配text,用于&#xff08;Binary file (standard input) matches&#xff09;报错-b&#xff0c;--byte-offset打印匹配行前面打…

vector利用swap()函数进行内存的释放

首先&#xff0c;vector与deque不同&#xff0c;其内存占用空间只会增长&#xff0c;不会减小。比如你首先分配了10,000个字节&#xff0c;然后erase掉后面9,999个&#xff0c;则虽然有效元素只有一个&#xff0c;但是内存占用仍为10,000个。所有空间在vector析构时回收。 1、…

SAP常用术语

SD 常用术语汇集 SD (Sales and Distribution) : 销售和分销 Sold-to-party : 下订单客户 Ship-to-party : 收货之客户 Bill-to-party : 仅指收发票之客户 Payer-to-party : 付款人 Customer Code : 客户代码 Sales Organization : 销售业务组织&#xff0c;指台达的某一事业部…

如何创建_如何创建自己的微信圈子?圈子创建运营指南

原创&#xff1a;爱捣鼓的猿 袁小猴最近很多小伙伴在问微信圈子是什么&#xff0c;如何才能创建自己的微信圈子&#xff1f;于是小编花时间去研究了下&#xff0c;整理了一些微信圈子的规则&#xff0c;方便大家使用。一、微信圈子是什么&#xff0c;圈子入口&#xff1f;其实曾…

python爬虫淘宝评论_Python爬取淘宝店铺和评论

1 安装开发需要的一些库(1) 安装mysql 的驱动&#xff1a;在Windows上按winr输入cmd打开命令行&#xff0c;输入命令pip install pymysql&#xff0c;回车即可。(2) 安装自动化测试的驱动selenium&#xff1a;在命令行中输入pip install selenium回车。(3) 安装标签解析库pyque…

A20 网卡驱动分析

网卡芯片为realteak 8201 1. net_device结构体的分配和注册 1) "/drivers/net/ethernet/sun7i/sun7i_wemac.c" wemac_probe() ndev alloc_etherdev(sizeof(struct wemac_board_info)); 分配 ret register_netdev(ndev); …

安装用户debian7安装oracle11g

改章节笔者在北京游玩的时候突然想到的...这几周就有想写几篇关于安装用户的笔记&#xff0c;所以回家到之后就奋笔疾书的写出来发表了 apt-get install gcc g make binutils libc6 libc6-dev libstdc6 libstdc5 rpm gawk alien ksh lesstif2 libaio1 linux-headers elfutils…

python交互式编程客户端_【python】UDP网络编程:实现服务端与客户端的交互、简单的AI智能模式...

关于UDP网络编程UDP(user datagram protocol)的中文叫用户数据报协议&#xff0c;属于传输层。UDP是面向非连接的协议&#xff0c;它不与对方建立连接&#xff0c;而是直接把要发的数据发给对方。【UDP网络编程的特点】1&#xff0c;每个数据中都给出了完整的地址信息&#xff…

python tkinter pack 同一行_用python tkinter中的一行连接2个复选按钮

我有一个程序在画布中放置复选按钮&#xff0c;当选项(另一个复选按钮)被选中时。我有另一个选项(另一个复选按钮)来画线。为了画线&#xff0c;首先我应该选择checkbutton“draw a line”&#xff0c;然后单击放置在画布中的任何checkbutton&#xff0c;另一个单击画布上的任何…

各个层次的gcc警告

各个层次的gcc警告 从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attribute__ ((unused)); 指定该变量为"未使用的".即使这个变量没有被使用,编译时也会忽略则个警告输出. 文件级:在源代码文件中诊断(忽略/警告) 语法: #pragma GCC diagnostic [er…

【转】C++ GetLastError() 返回值对应表

〖0〗-操作成功完成。〖1〗-功能错误。〖2〗-系统找不到指定的文件。〖3〗-系统找不到指定的路径。〖4〗-系统无法打开文件。〖5〗-拒绝访问。〖6〗-句柄无效。〖7〗-存储控制块被损坏。〖8〗-存储空间不足&#xff0c;无法处理此命令。〖9〗-存储控制块地址无效。〖10〗-环境错…

hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...

今天梦翔儿&#xff0c;成功实现hadoop编程&#xff0c;将本地文件夹中多个文件&#xff0c;合并为一个文件并上传到hdfs中直接上代码&#xff1a;PutMerge.javaimport java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataIn…

js 获取鼠标在画布的位置_云凤蝶如何打造媲美 sketch 的自由画布

在 Design Tools 中&#xff0c;组件间的对齐与吸附功能是否好用是决定其画布是否可以高效进行产品设计的关键因素。云凤蝶作为一款快速制作高品质中后台应用的 hpaPaaS 平台&#xff0c;同样拥有自由拖拽的可视化画布。那么在云凤蝶的自由画布中&#xff0c;对齐规则是怎样的&…

GCC 使用摘记

1. 几个子程序和说明cc1C 的实际编译程序cc1plusC 的实际编译程序collect2在不使用 GNU连接程序的系统上&#xff0c;用来产生特定的全局初始化代码crt0.o为每个系统定制的初始化和结束代码libgcc默认连接的 gcc 例程库libstdc默认连接的 g 例程库 2. 几个重要的和 GCC 协同工作…

不愿意和别人打交道_如果你的交际能力很差,不喜欢与人打交道,这3种职业最适合你...

现在给个飞速发展的社会&#xff0c;在我们日常生活中交际表达能力非常的重要&#xff0c;但是还是有一部分人比较内向&#xff0c;不善于表达自己的内心&#xff0c;也不喜欢和别人接触&#xff0c;那么这一类人从事哪些行业比较合适呢&#xff1f;下面我就跟大家讨论一下。性…

python组合函数_Python---函数---参数组合

# 参数组合# 在Python中定义函数&#xff0c;可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数# 这5中都可以组合使用# 参数定义的顺序必须是&#xff1a;必选参数、默认参数、可变参数、命名关键字参数和关键字参数# 比如定义一个函数&#xff0c;包含上述若干…