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

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

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

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

目前寫項目做需求時增刪改查一直用得比較頻繁,但是在做開發(fā)的時候,卻并不想一次一次寫重復的代碼,嘗試著整合了一下泛型實現(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>
     <!--簡化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>

三、代碼實現(xiàn)

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 公用實現(xiàn)類
 * @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;//當前泛型的真實類型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);

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

5. 實現(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 實現(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);
    }
}

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

eg:

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




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



**
 * @Author xw
 * @Description 用戶實現(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> {}

注意事項:

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

2.tk.mybatis.mapper.common.Mapper不要被啟動類@MapperScan(“com.xx.xx.mapper”)掃描到,不然會報錯。

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

4.項目針對需求開發(fā),可進行擴展

結果:啟動項目后,可直接在user下訪問到增刪改接口,經測試沒問題!

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

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

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

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

    深入理解DevOps+微服務框架

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

    Mybatisplus如何存儲List、Map

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

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

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

    解決IDEA打開項目文件目錄不見了的問題

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

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

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

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

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

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

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

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

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

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

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

最新評論

澜沧| 绥德县| 犍为县| 县级市| 内丘县| 绥中县| 潮安县| 叙永县| 乐平市| 揭东县| 防城港市| 修水县| 蒲城县| 辽宁省| 宁晋县| 大方县| 台东市| 开封市| 珲春市| 射阳县| 德江县| 舟山市| 新宾| 海林市| 开鲁县| 江津市| 法库县| 桂林市| 郓城县| 道孚县| 泗洪县| 罗山县| 乌兰察布市| 高台县| 保德县| 睢宁县| 天峨县| 略阳县| 台中县| 乐安县| 罗甸县|