热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

1.简介什么是通用mapper什么是通用mapper,用一句话概括就是,它就是一个辅助mybatis开发的组件,它不是替代mybatis&

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包

tk.mybatismapper-spring-boot-starter2.1.5

  • 启动类上加上@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 {
}

新建接口StudentMapper继承Mapper,泛型中就是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<&#xff1f;>)添加xxx字段值在List<&#xff1f;>条件
criteria.andXxxNotIn(List<&#xff1f;>)添加xxx字段值不在List<&#xff1f;>条件
criteria.andXxxLike(“%”&#43;value&#43;”%”)添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”&#43;value&#43;”%”)添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2)添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2)添加xxx字段值不在value1和value2之间条件

5.使用案例

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

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

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

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

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

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

6.寄语

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

不积硅步无以至千里&#xff0c;不积小流无以成江河



推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
author-avatar
若_时光倒影
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有