SpringBoot整合通用mapper实现泛型BaseController增删改
SpringBoot整合通用mapper实现泛型BaseController增删改
前言:目前写项目做需求时增删改查一直用得比较频繁,但是在做开发的时候,却并不想一次一次写重复的代码,尝试着整合了一下泛型实现统一增删改。
一.开发环境:
JDK:1.8 SpringBoot:2.4.4
二.加入依赖(所用到的是tk.mybatis中的通用mapper)
<!--swaggerUi--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.3</version></dependency><!--简化javabean代码的插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency><!--通用mapper启动器--><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version></dependency>
三.代码实现:
1. BaseMapper(因为tk.mapper是不能被springboot扫描到的,所以不能放在springboot扫描mapper的包下,不然会报错)
package com.carshow.data.base.mapper;import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;public abstract interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T> {}
2. IBaseService
package com.carshow.data.base.service;import com.carshow.data.common.contant.ResultBody;import javax.servlet.http.HttpServletRequest;
import java.util.List;public interface IBaseService<T, ID, EXAMPLE> {List<T> selectAll();T selectById(String id);/*** 单个实体对象全量字段保存** @param record* @return*/int save(T record);/*** 单个实体对象非空字段保存** @param record* @return*/int saveSelective(T record);/*** 多个实体对象保存** @param list* @return*/
// int saveList(java.util.List<? extends T> list);/*** 单个实体对象删除** @param record* @return*/int delete(T record);/*** 单个实体对象条件删除** @param record* @param example* @return*/int deleteByExample(T record, EXAMPLE example);/*** 单个实体对象主键删除** @param key* @return*/int deleteByPrimaryKey(ID key);/*** 单个实体对象条件全量字段更新** @param record* @param example* @return*/int updateByExample(T record, EXAMPLE example);/*** 单个实体对象条件非空字段更新** @param record* @param example* @return*/int updateByExampleSelective(T record, EXAMPLE example);/*** 单个实体对象主键全量字段更新** @param record* @return*/int updateByPrimaryKey(T record);/*** 单个实体对象主键非空字段更新** @param record* @return*/int updateByPrimaryKeySelective(T record);}
3. BaseServiceImpl
package com.carshow.data.base.service.impl;import com.alibaba.fastjson.JSONObject;
import com.carshow.data.base.mapper.BaseMapper;
import com.carshow.data.base.service.IBaseService;
import com.carshow.data.common.contant.ResultBody;
import com.carshow.data.ftp.FtpUtil;
import org.apache.commons.net.ftp.FTP;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.*;/*** @Author xw* @Description 公用实现类* @Date 2021/1/11 19:13*/
@Service
@Transactional//开启声明式事务注解,为该类添加事务支持。
public abstract class BaseServiceImpl<T, ID, EXAMPLE> implements IBaseService<T, ID, EXAMPLE> {// 定义抽象方法getMyMapper获取当前实体Mapper对象protected abstract BaseMapper<T> getBaseMapper();private Class<T> modelClass;//当前泛型的真实类型Classpublic BaseServiceImpl() {ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();modelClass = (Class<T>) pt.getActualTypeArguments()[0];}@Override@Transactional(rollbackFor = Exception.class)public List<T> selectAll() {return getBaseMapper().selectAll();}@Override@Transactional(rollbackFor = Exception.class)public T selectById(String id) {return getBaseMapper().selectByPrimaryKey(id);}@Override@Transactional(rollbackFor = Exception.class)public int save(T record) {int res = getBaseMapper().insert(record);return res;}@Override@Transactional(rollbackFor = Exception.class)public int saveSelective(T record) {int res = getBaseMapper().insertSelective(record);return res;}// @Override
// @Transactional(rollbackFor = Exception.class)
// public int saveList(java.util.List<? extends T> list) {// int res = getBaseMapper().insertList(list);
// return res;
// }@Override@Transactional(rollbackFor = Exception.class)public int delete(T record) {int res = getBaseMapper().delete(record);return res;}@Override@Transactional(rollbackFor = Exception.class)public int deleteByExample(T record, EXAMPLE example) {int res = getBaseMapper().deleteByExample(example);return res;}@Override@Transactional(rollbackFor = Exception.class)public int deleteByPrimaryKey(ID key) {int res = getBaseMapper().deleteByPrimaryKey(key);return res;}@Override@Transactional(rollbackFor = Exception.class)public int updateByExample(T record, EXAMPLE example) {int res = getBaseMapper().updateByExample(record, example);return res;}@Override@Transactional(rollbackFor = Exception.class)public int updateByExampleSelective(T record, EXAMPLE example) {int res = getBaseMapper().updateByExampleSelective(record, example);return res;}@Override@Transactional(rollbackFor = Exception.class)public int updateByPrimaryKey(T record) {int res = getBaseMapper().updateByPrimaryKey(record);return res;}@Override@Transactional(rollbackFor = Exception.class)public int updateByPrimaryKeySelective(T record) {int res = getBaseMapper().updateByPrimaryKeySelective(record);return res;}
}
4. 声明泛型基类–AbstractController
package com.carshow.data.base.controller;/*** @Author xw* @Description 声明泛型基类* @Date 2021/4/13 10:41*/
public abstract class AbstractController<T, K> {/*** 新增* @param t* @return*/public abstract int addJson(T t);/*** 修改* @param t* @return*/public abstract int updateJson(T t);/*** 单个实体对象主键删除* @param* @return*/public abstract int delJson(K id);
}
5. 实现泛型父类–BaseController
package com.carshow.data.base.controller;import com.carshow.data.base.service.IBaseService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;import javax.annotation.Resource;/*** @Author xw* @Description 实现泛型父类* @Date 2021/4/13 10:49*/
public class BaseController<T, K> extends AbstractController<T, K> {@Autowiredprivate IBaseService<T, K,Object> baseService;@PostMapping("/addJson")@ApiOperation(value = "新增",notes = "公用方法")@Overridepublic int addJson(@RequestBody T t) {return baseService.save(t);}@PostMapping("/updateJson")@ApiOperation(value = "修改",notes = "公用方法")@Overridepublic int updateJson(@RequestBody T t) {return baseService.updateByPrimaryKeySelective(t);}@GetMapping("/delJson")@ApiOperation(value = "删除",notes = "公用方法")@Overridepublic int delJson(K id) {return baseService.deleteByPrimaryKey(id);}
}
截止,我们的方法已经写完,接下来我们只需要去继承Base类,就可以免去我们经常写重复代码的烦恼……
eg:
@RestController
@RequestMapping(Common.PATH_URL+"/user")
//Api注解,描述信息 可通过tag进行分类
@Api(value = "UserController", description = "关于用户管理信息接口")
public class UserController extends BaseController<TUser,String> {@Autowiredprivate IUserService userService;}public interface IUserService extends IBaseService<TUser,String,Object> {}*** @Author xw* @Description 用户实现类* @Date 2021/4/9 14:08*/
@Slf4j
@Service
public class UserServiceImpl extends BaseServiceImpl<TUser,String,Object> implements IUserService {@Resourceprivate UserMapper userMapper;@Overrideprotected BaseMapper<TUser> getBaseMapper() {return userMapper;}}@Mapper
public interface UserMapper extends BaseMapper<TUser> {}
注意事项:
1.tk.mybatis.mapper.common.Mapper 的导包与org.apache.ibatis.annotations.Mapper导包不要搞混淆
2.tk.mybatis.mapper.common.Mapper不要被启动类@MapperScan(“com.xx.xx.mapper”)扫描到,不然会报错。
3.如果项目中需逻辑进行判断,可直接重写base里面的方法进行需求开发
4.项目针对需求开发,可进行扩展
结果:启动项目后,可直接在user下访问到增删改接口,经测试没问题!
SpringBoot整合通用mapper实现泛型BaseController增删改相关推荐
- springboot整合通用mapper操作数据库
1. 建表sql create table user (`id` int PRIMARY KEY auto_increment COMMENT '用户id', `name` VARCHAR(255) ...
- 一看就会一学就废之SpringBoot整合通用Mapper以及常用方法
本文适合初次学习通用Mapper新鸟阅览,老生常谈,从三个大方向入手----是什么?能干什么?怎么用? 目录 一.通用Mapper是什么? 二.通用Mapper能干什么? 三.怎么使用通用Mapper ...
- SpringBoot整合通用Mapper
添加依赖 添加通用Mapper的依赖,注意还需要搭配MyBatis和对应数据库的驱动: <dependency><groupId>org.mybatis.spring.boot ...
- 【解析】spring-boot整合通用mapper
问题描述: Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the m ...
- Springboot整合通用mapper进阶1
1.自定义sql方法的使用,mapper的依赖配置文件就不一一赘述了,详情: https://blog.csdn.net/brantykl/article/details/129360320?spm= ...
- 通用返回_Springboot项目整合通用mapper
1.简介 什么是通用mapper 什么是通用mapper,用一句话概括就是,它就是一个辅助mybatis开发的组件,它不是替代mybatis,而是使mybatis更方便的开发.通用mapper提供极其 ...
- 02_Spring Cloud Alibaba整合通用Mapper+Lombok+Mysql
Spring CLoud 整合通用Mapper+Lombok+Mysql 文章目录 一.使用Spring Initializr快速创建Spring Boot应用 二.相关依赖 2.1. 添加依赖 2. ...
- SpringBoot+JdbcTemplate通用Mapper的实现
文章目录 SpringBoot+JdbcTemplate通用Mapper的实现 通用Mapper 针对User的jdbcMapper 针对 User的Service 相应的Controller Spr ...
- springboot使用JdbcTemplate完成对数据库的增删改查
上一篇对springboot有一个简单的介绍以及使用一个简单的例子熟悉了一下springboot写法的简单流程.这一篇介绍springboot使用JdbcTemplate完成对数据库的增删改查. 首先 ...
最新文章
- 华为云AIOps实践全面解析
- 定制圆角带背景色的矩形边框
- css 首字下沉 错位,css+div错位问题的修复小结
- linux文件系统初始化过程(6)---执行init程序
- MFC中属性表单和向导对话框的使用
- 眼前一亮的UI设计案例|插画世界里的网页首图
- 搜索引擎只能抓取html文件,为什么有些明明存在的网页不能被搜索到?
- LintCode:A+B的和
- 数据科学家教你用数据模型来泡妞
- 《算法图解》之狄克斯特拉算法
- 【大厂笔试心得,你还不知道笔试的思路吗?】-- ACM模式篇、笔试题型介绍以及相关准备
- 如何给Layout文件夹分类
- cmt obm odm 代工模式oem_工厂有OEM,ODM,OBM之分吧,分别是什么意思?
- Rush Hour Puzzle
- uniapp支付打开支付宝app进行付款
- 下载 傅立叶变换 冷建华pdf_傅里叶变换_PDF图书下载_冷建华_免费PDF电子书下载_第一图书网...
- Android Study Material Design 十 再探沉浸式
- 金融界的万骗之祖-庞氏骗局
- 反驳李刚的针对我吐槽的回应,曝光疯狂java李刚的骗子行径
- 汉诺塔问题c++递归解法