通用返回_Springboot项目整合通用mapper
1.简介
- 什么是通用mapper
什么是通用mapper,用一句话概括就是,它就是一个辅助mybatis开发的组件,它不是替代mybatis,而是使mybatis更方便的开发。通用mapper提供极其方便的单表的增删改查,可以按照自己的需要使用通用方法,还能很方便开发自己的通用方法。
- 为什么使用通用,apper
原生Mybatis痛点
- mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
- 需要自己实现sql分页,select * from table where . . . limit 1,3。自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
- 数据库可移植性差:如果项目更换数据库,比如oracle-->mysql,mapper.xml中的sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。
- 生成的代码量过大。
- 批量操作,批量插入,批量更新,需要自写。
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);}
}
注意导入的包是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语句中该字段还是会参与
使用选择性插入时字段是不会参与插入的
age字段为空,插入时的sql语句中该字段是不会参与的
- 修改
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);}
- 根据主键删除
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,已经有些时间了,这里做了一下总结,欢迎小伙伴们进行指正。
不积硅步无以至千里,不积小流无以成江河
通用返回_Springboot项目整合通用mapper相关推荐
- dao加service加mysql实例_SpringBoot项目整合mybatis的方法步骤与实例
1. 导入依赖的jar包 springboot项目整合mybatis之前首先要导入依赖的jar包,配置pom.xml文件如下: xmlns:xsi="http://www.w3.org/20 ...
- SpringBoot整合通用mapper实现泛型BaseController增删改
SpringBoot整合通用mapper实现泛型BaseController增删改 前言:目前写项目做需求时增删改查一直用得比较频繁,但是在做开发的时候,却并不想一次一次写重复的代码,尝试着整合了一下 ...
- 02_Spring Cloud Alibaba整合通用Mapper+Lombok+Mysql
Spring CLoud 整合通用Mapper+Lombok+Mysql 文章目录 一.使用Spring Initializr快速创建Spring Boot应用 二.相关依赖 2.1. 添加依赖 2. ...
- 【通用mapper】项目升级通用Mapper引发的一连串问题以及问题解决
项目环境 通用Mapper版本 <dependency><groupId>tk.mybatis</groupId><artifactId>mapper- ...
- SpringBoot项目使用通用Mapper
SpringBoot项目使用通用Mapper 前言 后端业务开发,每个表都要用到单表的增删改查等通用方法,而配置了通用Mapper可以极大的方便使用Mybatis单表的增删改查操作. 通用mapper ...
- java 泛型应用,通用返回类,泛型方法,泛型静态方法
java 泛型应用,通用返回类,泛型方法,泛型静态方法 泛型简介 应用示例 静态方法增加泛型参数 调用静态公有方法 对比调用非静态公有方法(成员方法) 泛型简介 这里不多说明,详见 java泛型入门 ...
- 热烈祝贺上汽通用五菱ASPICE项目通过CL 2级评估
热烈祝贺上汽通用五菱ASPICE项目通过CL 2级评估 热烈祝贺上汽通用五菱ASPICE项目通过CL 2级评估!在未来,经纬恒润将以更加热忱.专业的服务精神持续把先进的管理理念.工具应用更广泛地推广到 ...
- 装备科研项目过程通用控制要求
装备科研项目过程通用控制要求 装备(硬件类)指元器件.材料和结构及类似产品,该类产品研制过程中生产工艺成熟,符合装备科研项目过程通用控制要求. 对科研单位来说,质量管理的重点是科研项目质量管理 ...
- java response 返回_java response通用返回
java response通用返回 编程语言 • Java • 611次浏览 • 0次点赞 • 2019-04-25 12:42 场景 后台 接口统一返回 code.message.data resp ...
最新文章
- Get,Post请求中文乱码问题有效解决方法
- varint算法——本质上是牺牲最高位作为标识数据结束位,达到变长编码,说白了就是贪心的分割位...
- Spark on YARN cluster client 模式作业运行全过程分析
- 什么技能产品经理不会提,但技术人必须懂?
- ansible最大并发_通过这7种方法来最大程度地提高Ansible技能
- nsga2代码解读python_代码资料
- 会议录音被误删了用EasyRecovery怎么恢复
- 综合能源系统及其应用
- LTE无线网络规划的四大要点
- JVM HotSpot 可达性分析算法实现细节
- 面试求职-你们想知道的腾讯面经
- eCognition软件中ESP2插件的下载与安装
- 杭州卧兔:全球品牌出海峰会大咖集聚讲述品牌出海关键要素
- 兰州举行闹元宵焰火晚会 百万市民争相观看
- 微信小程序——订阅消息与微信公众号模板消息
- java多表头导出excel表格_【每日一点】1. Java如何实现导出Excel单表头或多表头
- TL431NSG-A 友顺UTC
- 绝情且残酷!1780元暴力解聘患癌10年老员工,完美世界心真“硬”
- scrapy+redis+mongodb爬取苏宁商城图书价格
- mySQL (关系型数据库管理系统)
热门文章
- 1.1 Machine learning: what and why?
- 指令 出厂_口碑营销_南澳出口木箱出厂价
- CSDN-Markdown-图片设置(大小,居中)
- Vijos——T 1629 八
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
- 模仿JavaAppArguments.java示例
- UESTC_秋实大哥下棋 2015 UESTC Training for Data StructuresProblem I
- hdu4353 Finding Mine三角形内的点数
- DataGridView中的CheckBox
- Atlas应用程序调试技巧