通用返回_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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

在移植内核的时候&#xff0c;通常会遇到引脚复用&#xff08;MUX&#xff09;的配置问题。在现在的Linux内核中&#xff0c;对于TI的ARM芯片&#xff0c;早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的&#xff0c;这次看AM335X的代码顺手写一下分析&#xf…

是网关吗_智能家居网关功能这么多,你都知道吗?

在科技发达的今天&#xff0c;我们的生活也开始趋向于智能化&#xff0c;智能家居已经迎来了新时代。电动窗帘、扫地机器人、电视、空调等电器都能智联wifi&#xff0c;可是使用的时候得一个个去控制&#xff0c;数量多的话懒癌们肯定嫌麻烦的。所以很多聪明的人都选择安装智能…

一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

【题目描述】 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量(QoS,Qualityof Service)问题已越来越受到重视。网络中采用的数据包调度机制与网络的服务质量 QoS 有着密切的关系。研究表明传统的基于队列的调…

iOS vs. Android,应用设计该如何对症下药?

摘要&#xff1a;从iOS到Android&#xff0c;两大平台应用设计有何不同&#xff1f;又都存在什么样的问题&#xff1f;Android定制性太高&#xff0c;该如何进行UI设计&#xff1f;在CMDN CLUB第28期活动中&#xff0c;咕咚网高级产品经理王磊&#xff0c;从iOS、Android谈起&a…

cs8900a网卡驱动--寄存器

1. CS8900内部有一个4k的RAM用于访问其内部寄存器&#xff0c;称为PacketPage。 2. LineCTL 网卡状态设置 从上图看到&#xff0c;此寄存器的6&#xff0c;7位用于设置网卡的收发使能。8&#xff0c;9位用于设置网卡状态。是10BASE-T还是 AUI。下面这图更详细介绍了8&…

jQuery图表插件 JS Charts

JS Charts 是一款免费的基于javascript的轻量级插件&#xff0c;用JS Charts 绘制图表是很轻松地事,因为你只需要关心客户端的脚本。 Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...转载于:https://www.cnb…

使用正则把数字前面的符号替换_正则表达式(一) 基本表达式

定义 正则表达式(Regular Expression)用某种模式去匹配一类字符串的公式&#xff0c;主要用来描述字符串匹配的工具。 匹配文本或字符存在不止一个部分满足给定的正则表达式&#xff0c;这是每一个这样的部分都被称为一个匹配。 匹配分为以下三种类型&#xff1a; 形容词性的匹…

jsp思维导图_2019年经济法基础思维导图

参加2019年初级考试的考生们明天可以打印准考证啦时间&#xff1a;2019.4.26-5.5日(传送门&#xff1a;http://kjbm8.mof.gov.cn/ksbm/usercxzkz.jsp)为了帮助大家快速梳理教材考点&#xff0c;下面蓝星职业教育为大家整理了初级会计职称考试各章节思维导图&#xff0c;希望给大…

海量数据持久层解决方案_爱数AnyBackup重磅发布海量非结构化数据超可用解决方案...

海量非结构化数据有三大备份恢复问题一直没有得到有效解决&#xff1a;备份慢、恢复慢、备份数据不可查询。这三大问题已经对行业数字化转型造成了重大阻碍。今天&#xff0c;AnyBackup Family 7线上发布会——重磅发布海量非结构化数据超可用解决方案。AnyBackup以创新超可用技…

wpf 使子ui元素可视区域不超过父元素_对游戏UI设计的一点思考

UI决定了一个游戏的初体验&#xff0c;甚至决定了玩家的初始留存&#xff0c;甚至可以说决定了一个游戏的品质&#xff0c;虽然看起来是表象的&#xff0c;却是直指游戏核心的。简单讲&#xff0c;玩家认可一款游戏永远都是造型场景好&#xff0c;剧情好&#xff0c;画质棒&…

grpc入门到精通_Spring Cloud 从入门到精通(一)Nacos 服务中心初探

点击上方蓝色“Java精选”&#xff0c;选择“设为星标”技术文章第一时间送达&#xff01;什么是Nacos&#xff1f;Nacos是阿里巴巴开源的项目&#xff0c;是一个更易于帮助构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos英文全称是Dynamic Naming and Configur…

百度新年贪吃蛇效果

闲来无事&#xff0c;在网上闲逛的时候开到有人说百度蛇年的贪吃蛇logo小游戏不错&#xff0c;于是乎就自己仿照写了一个。&#xff08;注&#xff1a;所有素材都来自百度&#xff09; 效果图 用到的图片 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional…

贝叶斯公式设b_数据分析经典模型——朴素贝叶斯

编辑导语&#xff1a;做过数据分析的人&#xff0c;想必对贝叶斯模型都不会陌生。贝叶斯预测模型是运用贝叶斯统计进行的一种预测&#xff0c;不同于一般的统计方法&#xff0c;其不仅利用模型信息和数据信息&#xff0c;而且充分利用先验信息。通过实证分析的方法&#xff0c;…

Asterisk使用数据库配置方法

安装&#xff1a; 1、安装 unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel &#xff0c;为了使asterisk支持数据库存储&#xff08;必须先安装&#xff09; 2、安装 mysql 并设置好 C_INCLUDE_PATH 和 LD_LIBRARY_PATH 3、从 http://www.asterisk.org/downloads 下载…

linux文件系统_Linux的文件系统简介

inux操作系统的本质可以说就是文件系统的集合&#xff0c;文件系统既包含文件的数据也包含文件系统的结构。在Linux文件系统中&#xff0c;EXT2文件系统、虚拟文件系统、/proc文件系统是三个具有代表性的文件系统。/proc文件系统是一个伪文件系统&#xff0c;它只存在内存当中&…

删除按钮_汪涵拜师学艺第七篇:往来单位查询删除按钮和新增判断的设计!

老师好&#xff01;大家好&#xff01;我叫汪涵&#xff1a;今天给大家分享往来单位查询删除按钮和新增判断的设计&#xff01;在开始具体内容之前&#xff0c;请让我先分享我们的价值观&#xff1a;用自律和勤奋来改变命运&#xff0c;不走捷径&#xff0c;有爱心&#xff0c;…

Ubuntu 12.04(32位)安装Oracle 11g(32位)全过程以及几乎所有问题的解决办法

这两天在Ubuntu上安装Oracle把人折腾毁了&#xff0c;即使照着网上的教程来&#xff0c;还是出了很多问题。好在最后终于搞定了。写出来总结一下&#xff0c;免得以后忘了。 标题注明32位是因为网上教程几乎全是以64位安装为例的&#xff0c;32位系统下照着做是绝对会安装失败的…