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

springboot泛型封裝開發(fā)方式

 更新時間:2023年12月15日 08:55:00   作者:古甲哈醒  
這篇文章主要介紹了springboot泛型封裝開發(fā)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

JDK1.5出來后,Java開始支持泛型開發(fā),通過將父類聲明為泛型,子類繼承父類,子類就能擁有父類的方法,而不需要再寫代碼。

泛型開發(fā)能使我們的代碼開發(fā)提供了很大的簡便,簡化了我們的代碼。

在springboot項目中(其他項目也一樣),我們經(jīng)常要用到增刪改查接口,從controller/service/dao層,每一層都要寫增刪改查代碼,每一張數(shù)據(jù)表都要重復一遍增刪改查功能。雖然寫起來簡單,但是作為程序員來講,寫重復性的代碼就是在浪費時間,浪費生命。

程序員的主要精力應(yīng)該放在如何實現(xiàn)業(yè)務(wù)上面。

下面我們來看下怎樣通過泛型開發(fā)來封裝代碼,簡化開發(fā)。

一、聲明泛型父類

泛型父類包括:controller/service/dao三層。

1、聲明泛型虛基類AbstractController,定義接口方法:

public abstract class AbstractController<T, K>{

    /**
     * 新增
     * @param t
     * @return
     */
    public abstract RtnData insert(T t);

    /**
     * 修改
     * @param t
     * @return
     */
    public abstract RtnData update(T t);

    /**
     * 刪除
     * @param
     * @return
     */
    public abstract RtnData delete(K id);

    /**
     * 按主鍵查詢
     * @param
     * @return
     */
    public abstract RtnData get(K Id);

    /**
     * 分頁查詢
     * @return
     */
    public abstract RtnData queryPageList(int pageSize, int pageIndex, Map<String,Object> params);

    /**
     * 多條件查詢
     * @return
     */
    public abstract RtnData queryList(Map<String,Object> params);

}

2、實現(xiàn)泛型父類BaseController,繼承 AbstractController

這里我們定義泛型父類BaseController,繼承并實現(xiàn)AbstractController方法,并且在BaseController中定義每個方法的RequestMapping。

這樣業(yè)務(wù)類直接繼承BaseController就可以使用默認實現(xiàn)好的增刪改查接口了。

public class BaseController<T, K> extends AbstractController<T, K> {

    @Autowired
    private IService<T, K> service;

    @PostMapping("/insert")
    @Override
    public RtnData insert(@RequestBody T t) {
        return RtnData.ok(service.insert(t));
    }

    @PostMapping("/update")
    @Override
    public RtnData update(@RequestBody T t) {
        return RtnData.ok(service.update(t));
    }

    @GetMapping("/delete")
    @Override
    public RtnData delete(K id) {
        return RtnData.ok(service.delete(id));
    }

    @GetMapping("/get")
    @Override
    public RtnData get(K id) {
        return RtnData.ok(service.get(id));
    }

    @GetMapping("/page-list")
    @Override
    public RtnData queryPageList(@RequestParam(required = false, defaultValue = "20") int pageSize,
                                 @RequestParam(required = false, defaultValue = "1") int pageIndex,
                                 @RequestParam Map<String,Object> params) {
        return RtnData.ok(service.queryPageList(pageSize, pageIndex, params));
    }

    @GetMapping("/list")
    @Override
    public RtnData queryList(@RequestParam Map<String, Object> params) {
        return RtnData.ok(service.queryList(params));
    }
}

BaseController注入了泛型IService,用于實現(xiàn)具體的業(yè)務(wù)操作

3、聲明泛型業(yè)務(wù)接口類IService

public interface IService<T,K>{

    /**
     * 新增
     * @param t
     * @return
     */
    public Object insert(T t);

    /**
     * 修改
     * @param t
     * @return
     */
    public Object update(T t);

    /**
     * 刪除
     * @param
     * @return
     */
    public Object delete(K id);

    /**
     * 按主鍵查詢
     * @param
     * @return
     */
    public T get(K id);

    /**
     * 分頁查詢
     * @param pageSize
     * @param pageIndex
     * @param params
     * @return
     */
    Object queryPageList(int pageSize, int pageIndex, Map<String, Object> params);

    /**
     * 條件查詢
     * @param params
     * @return
     */
    Object queryList(Map<String, Object> params);
}

4、定義泛型業(yè)務(wù)類BaseService,實現(xiàn)IService類

BaseService實現(xiàn)IService接口中發(fā)方法,編寫增刪改查操作默認業(yè)務(wù)實現(xiàn)。子類通過繼承BaseService就擁有它的方法。

public class BaseService<T,K> implements IService<T,K> {

    @Autowired
    protected Mapper<T, K> mapper;

    private Class<T> modelClass;//當前泛型的真實類型Class

    public BaseService() {
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        modelClass = (Class<T>) pt.getActualTypeArguments()[0];
    }

    @Override
    public Object insert(T t) {
        return mapper.insert(t);
    }

    @Override
    public Object update(T t) {
        return mapper.updateByPrimaryKey(t);
    }

    @Override
    public Object delete(K id) {
        return mapper.deleteByPrimaryKey(id);
    }

    @Override
    public T get(K id) {
        return mapper.selectByPrimaryKey(id);
    }

    @Override
    public Object queryPageList(int pageSize, int pageIndex, Map<String, Object> params) {
        PageHelper.startPage(pageIndex, pageSize);
        Page page = mapper.queryPageList(params);//Page本身是一個ArrayList對象,轉(zhuǎn)換為json時不會保留分頁信息
        PageInfo pageInfo = page.toPageInfo();//將page轉(zhuǎn)換成pageInfo會保存分頁信息返回
        return new PageModel(pageInfo);
    }

    @Override
    public Object queryList(Map<String, Object> params) {
        return mapper.queryList(params);
    }

}

這里最重要的兩行代碼:

ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
modelClass = (Class) pt.getActualTypeArguments()[0];

通過泛型反射,獲取子類中實際要操作的對象class,通過class,service就知道要對哪個對象進行增刪改查操操作。

另外,我們注入了dao層的泛型Mapper<T, K>,通過Mybatis對數(shù)據(jù)庫進行增刪改查操作

5、聲明Dao層泛型Mapper

public interface Mapper<T, K> {

    int deleteByPrimaryKey(K id);

    int insert(T record);

    int insertSelective(T record);

    T selectByPrimaryKey(K id);

    int updateByPrimaryKeySelective(T record);

    int updateByPrimaryKey(T record);

    /**
     * 分頁查詢(由子類實現(xiàn))
     * @param params
     * @return
     */
    Page queryPageList(Map<String, Object> params);

    /**
     * 多條件查詢(由子類實現(xiàn))
     * @param params
     * @return
     */
    List<Map<String,Object>> queryList(Map<String, Object> params);
}

這里我們使用mybatis實現(xiàn)dao層的操作,這里的聲明的接口方法名稱與mybatis工具生成mapper.xml一致

到這里,我們的泛型父類代碼已經(jīng)全部編寫完成??梢詫⑸鲜龃a達成jar包,放入項目里面作為基礎(chǔ)包直接引用。

下面我們來說說怎么在項目里面實際使用。

二、項目應(yīng)用

在項目里面引用,只需在子類代碼層中繼承上述父類,子類就擁有父類中的功能。

1、子類Controller

@RestController
@RequestMapping("/api/dic")
public class DataDicController extends BaseController<DataDic, Integer> {
}

看到?jīng)],里面什么方法也沒寫,只聲明了RequestMapping,另外將泛型用具體對象類型替換。

DataDic是我操作的對象,Integer是DataDic的主鍵類型。

這個BaseController的新增接口地址是/api/dic/insert,/insert是使用父類的RequestMapping。

另外我也沒寫Service的注入,因為容器會根據(jù)要父類中要注入的泛型Service,直接找到IService對應(yīng)的泛型實例

2、子類Service

@Service
public class DataDicService extends BaseService<DataDic, Integer> {
}

同樣,Service也沒有任何代碼,也沒有注入Mapper,只繼承了泛型

3、子類Mapper

@Mapper
public interface DataDicMapper extends com.cc.app.base.dao.Mapper<DataDic, Integer> {
}

Mapper需要繼承我們自己定義的泛型Mapper,這樣才能被Service找到。

說明:我們通過工具生成的Mapper對象會包含默認的方法,大家不用刪除,因為和繼承的Mapper方法名一致,就當是覆蓋Override

到此,所有工作結(jié)束,我們的DataDicController的增刪改查接口寫好 ,下面我們來測試。

三、接口測試

1、查詢接口get

image.png

2、插入接口insert

image.png

總結(jié)

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

您可能感興趣的文章:

相關(guān)文章

  • Java中獲取MongoDB連接的方法詳解

    Java中獲取MongoDB連接的方法詳解

    這篇文章主要介紹了Java中獲取MongoDB連接的方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • gson ajax 數(shù)字精度丟失問題的解決方法

    gson ajax 數(shù)字精度丟失問題的解決方法

    下面小編就為大家?guī)硪黄猤son ajax 數(shù)字精度丟失問題的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • mybatis-plus getOne和邏輯刪除問題詳解

    mybatis-plus getOne和邏輯刪除問題詳解

    這篇文章主要介紹了mybatis-plus getOne和邏輯刪除,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java聊天室之使用Socket實現(xiàn)傳遞圖片

    Java聊天室之使用Socket實現(xiàn)傳遞圖片

    這篇文章主要為大家詳細介紹了Java簡易聊天室之使用Socket實現(xiàn)傳遞圖片功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • SpringCache輕松啟用Redis緩存的全過程

    SpringCache輕松啟用Redis緩存的全過程

    Spring Cache是Spring提供的一種緩存抽象機制,旨在通過簡化緩存操作來提高系統(tǒng)性能和響應(yīng)速度,本文將給大家詳細介紹SpringCache如何輕松啟用Redis緩存,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • JAVA編程實現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例

    JAVA編程實現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例

    這篇文章主要介紹了JAVA編程實現(xiàn)TCP網(wǎng)絡(luò)通訊的方法,簡單說明了TCP通訊的原理并結(jié)合具體實例形式分析了java實現(xiàn)TCP通訊的步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • java通過ssh連接執(zhí)行shell命令,文件傳輸方式

    java通過ssh連接執(zhí)行shell命令,文件傳輸方式

    這篇文章主要介紹了java通過ssh連接執(zhí)行shell命令,文件傳輸方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • idea配置maven環(huán)境時maven下載速度慢的解決方法

    idea配置maven環(huán)境時maven下載速度慢的解決方法

    我們在idea配置maven環(huán)境的時候會發(fā)現(xiàn)maven更新慢的現(xiàn)象,解決辦法就是下載國內(nèi)的鏡像包,完美解決下載速度慢的問題,文中有詳細的具體操作方法,并通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Java @Autowired注解底層原理詳細分析

    Java @Autowired注解底層原理詳細分析

    @Autowired注解可以用在類屬性,構(gòu)造函數(shù),setter方法和函數(shù)參數(shù)上,該注解可以準確地控制bean在何處如何自動裝配的過程。在默認情況下,該注解是類型驅(qū)動的注入
    2022-11-11
  • JDK動態(tài)代理過程原理及手寫實現(xiàn)詳解

    JDK動態(tài)代理過程原理及手寫實現(xiàn)詳解

    這篇文章主要為大家介紹了JDK動態(tài)代理過程原理及手寫實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09

最新評論

土默特左旗| 交城县| 丹江口市| 邹平县| 靖远县| 九龙坡区| 宜州市| 金川县| 惠水县| 若尔盖县| 镇雄县| 徐闻县| 镇安县| 宾川县| 谷城县| 来安县| 漯河市| 永吉县| 本溪| 孝义市| 武威市| 谷城县| 涿州市| 容城县| 安化县| 荆州市| 木里| 阳谷县| 三门县| 富源县| 赣榆县| 通渭县| 梁平县| 靖州| 于都县| 特克斯县| 屯门区| 乌兰浩特市| 阳原县| 宁波市| 色达县|