最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合通用mapper實(shí)現(xiàn)泛型BaseController增刪改方式

 更新時(shí)間:2025年11月17日 08:52:46   作者:夕夕夕兮  
本文介紹了如何在SpringBoot項(xiàng)目中整合通用Mapper實(shí)現(xiàn)泛型BaseController的增刪改功能,通過統(tǒng)一的代碼實(shí)現(xiàn)減少重復(fù),提高開發(fā)效率

SpringBoot整合通用mapper實(shí)現(xiàn)泛型BaseController增刪改

目前寫項(xiàng)目做需求時(shí)增刪改查一直用得比較頻繁,但是在做開發(fā)的時(shí)候,卻并不想一次一次寫重復(fù)的代碼,嘗試著整合了一下泛型實(shí)現(xiàn)統(tǒng)一增刪改。

一、開發(fā)環(huán)境

       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>
     <!--簡(jiǎn)化javabean代碼的插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
        <!--通用mapper啟動(dòng)器-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

三、代碼實(shí)現(xiàn)

1. BaseMapper(因?yàn)閠k.mapper是不能被springboot掃描到的,所以不能放在springboot掃描mapper的包下,不然會(huì)報(bào)錯(cuò))

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);

    /**
     * 單個(gè)實(shí)體對(duì)象全量字段保存
     *
     * @param record
     * @return
     */
    int save(T record);

    /**
     * 單個(gè)實(shí)體對(duì)象非空字段保存
     *
     * @param record
     * @return
     */
    int saveSelective(T record);

    /**
     * 多個(gè)實(shí)體對(duì)象保存
     *
     * @param list
     * @return
     */
//    int saveList(java.util.List<? extends T> list);

    /**
     * 單個(gè)實(shí)體對(duì)象刪除
     *
     * @param record
     * @return
     */
    int delete(T record);

    /**
     * 單個(gè)實(shí)體對(duì)象條件刪除
     *
     * @param record
     * @param example
     * @return
     */
    int deleteByExample(T record, EXAMPLE example);

    /**
     * 單個(gè)實(shí)體對(duì)象主鍵刪除
     *
     * @param key
     * @return
     */
    int deleteByPrimaryKey(ID key);

    /**
     * 單個(gè)實(shí)體對(duì)象條件全量字段更新
     *
     * @param record
     * @param example
     * @return
     */
    int updateByExample(T record, EXAMPLE example);

    /**
     * 單個(gè)實(shí)體對(duì)象條件非空字段更新
     *
     * @param record
     * @param example
     * @return
     */
    int updateByExampleSelective(T record, EXAMPLE example);

    /**
     * 單個(gè)實(shí)體對(duì)象主鍵全量字段更新
     *
     * @param record
     * @return
     */
    int updateByPrimaryKey(T record);

    /**
     * 單個(gè)實(shí)體對(duì)象主鍵非空字段更新
     *
     * @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 公用實(shí)現(xiàn)類
 * @Date 2021/1/11  19:13
 */
@Service
@Transactional//開啟聲明式事務(wù)注解,為該類添加事務(wù)支持。
public abstract class BaseServiceImpl<T, ID, EXAMPLE> implements IBaseService<T, ID, EXAMPLE> {

    // 定義抽象方法getMyMapper獲取當(dāng)前實(shí)體Mapper對(duì)象
    protected abstract BaseMapper<T> getBaseMapper();

    private Class<T> modelClass;//當(dāng)前泛型的真實(shí)類型Class
    public 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);

    /**
     * 單個(gè)實(shí)體對(duì)象主鍵刪除
     * @param
     * @return
     */
    public abstract int delJson(K id);
}

5. 實(shí)現(xiàn)泛型父類–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 實(shí)現(xiàn)泛型父類
 * @Date 2021/4/13  10:49
 */
public class BaseController<T, K> extends AbstractController<T, K> {

    @Autowired
    private IBaseService<T, K,Object> baseService;

    @PostMapping("/addJson")
    @ApiOperation(value = "新增",notes = "公用方法")
    @Override
    public int addJson(@RequestBody T t) {
        return baseService.save(t);
    }

    @PostMapping("/updateJson")
    @ApiOperation(value = "修改",notes = "公用方法")
    @Override
    public int updateJson(@RequestBody T t) {
        return baseService.updateByPrimaryKeySelective(t);
    }

    @GetMapping("/delJson")
    @ApiOperation(value = "刪除",notes = "公用方法")
    @Override
    public int delJson(K id) {
        return baseService.deleteByPrimaryKey(id);
    }
}

截止,我們的方法已經(jīng)寫完,接下來我們只需要去繼承Base類,就可以免去我們經(jīng)常寫重復(fù)代碼的煩惱……

eg:

@RestController
@RequestMapping(Common.PATH_URL+"/user")
//Api注解,描述信息 可通過tag進(jìn)行分類
@Api(value = "UserController", description = "關(guān)于用戶管理信息接口")
public class UserController extends BaseController<TUser,String> {
    @Autowired
    private IUserService userService;
  }




public interface IUserService extends IBaseService<TUser,String,Object> {}



**
 * @Author xw
 * @Description 用戶實(shí)現(xiàn)類
 * @Date 2021/4/9  14:08
 */
@Slf4j
@Service
public class UserServiceImpl  extends BaseServiceImpl<TUser,String,Object> implements IUserService {

    @Resource
    private UserMapper userMapper;
    @Override
    protected BaseMapper<TUser> getBaseMapper() {
        return userMapper;
    }
  }


@Mapper
public interface UserMapper extends BaseMapper<TUser> {}

注意事項(xiàng):

1.tk.mybatis.mapper.common.Mapper 的導(dǎo)包與org.apache.ibatis.annotations.Mapper導(dǎo)包不要搞混淆

2.tk.mybatis.mapper.common.Mapper不要被啟動(dòng)類@MapperScan(“com.xx.xx.mapper”)掃描到,不然會(huì)報(bào)錯(cuò)。

3.如果項(xiàng)目中需邏輯進(jìn)行判斷,可直接重寫base里面的方法進(jìn)行需求開發(fā)

4.項(xiàng)目針對(duì)需求開發(fā),可進(jìn)行擴(kuò)展

結(jié)果:?jiǎn)?dòng)項(xiàng)目后,可直接在user下訪問到增刪改接口,經(jīng)測(cè)試沒問題!

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法

    Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法

    這篇文章主要介紹了Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法,涉及Java針對(duì)MAC的遍歷獲取與字符串轉(zhuǎn)換相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • 深入理解DevOps+微服務(wù)框架

    深入理解DevOps+微服務(wù)框架

    這篇文章主要介紹了深入理解DevOps+微服務(wù),主要包括DevOps 的三大支柱之中,即人(People)、流程(Process)和平臺(tái)(Platform)的知識(shí)講解,需要的朋友可以參考下
    2022-05-05
  • Mybatisplus如何存儲(chǔ)List、Map

    Mybatisplus如何存儲(chǔ)List、Map

    這篇文章主要介紹了Mybatisplus如何存儲(chǔ)List、Map問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java實(shí)現(xiàn)在線預(yù)覽的示例代碼(openOffice實(shí)現(xiàn))

    Java實(shí)現(xiàn)在線預(yù)覽的示例代碼(openOffice實(shí)現(xiàn))

    本篇文章主要介紹了Java實(shí)現(xiàn)在線預(yù)覽的示例代碼(openOffice實(shí)現(xiàn)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 解決IDEA打開項(xiàng)目文件目錄不見了的問題

    解決IDEA打開項(xiàng)目文件目錄不見了的問題

    這篇文章主要介紹了解決IDEA打開項(xiàng)目文件目錄不見了的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • idea創(chuàng)建maven父子工程導(dǎo)致子工程無法導(dǎo)入父工程依賴

    idea創(chuàng)建maven父子工程導(dǎo)致子工程無法導(dǎo)入父工程依賴

    創(chuàng)建maven父子工程時(shí)遇到一個(gè)問題,本文主要介紹了idea創(chuàng)建maven父子工程導(dǎo)致子工程無法導(dǎo)入父工程依賴,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot?整合ChatGPT?API項(xiàng)目實(shí)戰(zhàn)教程

    SpringBoot?整合ChatGPT?API項(xiàng)目實(shí)戰(zhàn)教程

    這篇文章主要介紹了SpringBoot整合ChatGPT API項(xiàng)目實(shí)戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • SWT(JFace) Menu、Bar...體驗(yàn)代碼

    SWT(JFace) Menu、Bar...體驗(yàn)代碼

    SWT(JFace)體驗(yàn)之Menu、Bar實(shí)現(xiàn)代碼。
    2009-06-06
  • Java實(shí)現(xiàn)格式化打印慢SQL日志的方法詳解

    Java實(shí)現(xiàn)格式化打印慢SQL日志的方法詳解

    不管我們使用何種語言開發(fā),一旦程序發(fā)生異常,日志是一個(gè)很重要的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)格式化打印慢SQL日志的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • idea新窗口打開工程不生效問題及解決

    idea新窗口打開工程不生效問題及解決

    文章提供了解決在Macos系統(tǒng)中,使用某些瀏覽器打開鏈接時(shí)無法新窗口打開的解決方案,包括設(shè)置OpenProjectInNewWindow和將首選打開方式設(shè)置為“永不”
    2026-04-04

最新評(píng)論

临汾市| 石渠县| 江山市| 邵东县| 铜鼓县| 安庆市| 新津县| 台南市| 汕尾市| 娱乐| 福清市| 太原市| 夏邑县| 屏边| 垦利县| 麻城市| 师宗县| 巴里| 漠河县| 营山县| 延川县| 西宁市| 五常市| 象山县| 彰武县| 玛曲县| 桃园县| 嘉祥县| 丹阳市| 松原市| 隆昌县| 高邮市| 巴塘县| 商都县| 清远市| 深水埗区| 兴安盟| 丹江口市| 秦安县| 江油市| 志丹县|