亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

下面我們來(lái)看下怎樣通過(guò)泛型開(kāi)發(fā)來(lái)封裝代碼,簡(jiǎn)化開(kāi)發(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);

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

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

}

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

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

這樣業(yè)務(wù)類直接繼承BaseController就可以使用默認(rèn)實(shí)現(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,用于實(shí)現(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);

    /**
     * 分頁(yè)查詢
     * @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,實(shí)現(xiàn)IService類

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

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

    @Autowired
    protected Mapper<T, K> mapper;

    private Class<T> modelClass;//當(dāng)前泛型的真實(shí)類型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本身是一個(gè)ArrayList對(duì)象,轉(zhuǎn)換為json時(shí)不會(huì)保留分頁(yè)信息
        PageInfo pageInfo = page.toPageInfo();//將page轉(zhuǎn)換成pageInfo會(huì)保存分頁(yè)信息返回
        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];

通過(guò)泛型反射,獲取子類中實(shí)際要操作的對(duì)象class,通過(guò)class,service就知道要對(duì)哪個(gè)對(duì)象進(jìn)行增刪改查操操作。

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

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

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

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

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

到這里,我們的泛型父類代碼已經(jīng)全部編寫(xiě)完成。可以將上述代碼達(dá)成jar包,放入項(xiàng)目里面作為基礎(chǔ)包直接引用。

下面我們來(lái)說(shuō)說(shuō)怎么在項(xiàng)目里面實(shí)際使用。

二、項(xiàng)目應(yīng)用

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

1、子類Controller

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

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

DataDic是我操作的對(duì)象,Integer是DataDic的主鍵類型。

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

另外我也沒(méi)寫(xiě)Service的注入,因?yàn)槿萜鲿?huì)根據(jù)要父類中要注入的泛型Service,直接找到IService對(duì)應(yīng)的泛型實(shí)例

2、子類Service

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

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

3、子類Mapper

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

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

說(shuō)明:我們通過(guò)工具生成的Mapper對(duì)象會(huì)包含默認(rèn)的方法,大家不用刪除,因?yàn)楹屠^承的Mapper方法名一致,就當(dāng)是覆蓋Override

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

三、接口測(cè)試

1、查詢接口get

image.png

2、插入接口insert

image.png

總結(jié)

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

相關(guān)文章

  • java中接口和事件監(jiān)聽(tīng)器的深入理解

    java中接口和事件監(jiān)聽(tīng)器的深入理解

    這篇文章主要給大家介紹了關(guān)于java中接口和事件監(jiān)聽(tīng)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性

    使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性

    保持好的代碼質(zhì)量和遵守編碼標(biāo)準(zhǔn)是開(kāi)發(fā)可維護(hù)和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來(lái)提高 Spring Boot 應(yīng)用程序的代碼質(zhì)量和可維護(hù)性,需要的朋友可以參考下
    2023-10-10
  • SpringBoot Import及自定義裝配實(shí)現(xiàn)方法解析

    SpringBoot Import及自定義裝配實(shí)現(xiàn)方法解析

    這篇文章主要介紹了SpringBoot Import及自定義裝配實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java實(shí)現(xiàn)代碼塊耗時(shí)測(cè)算工具類

    Java實(shí)現(xiàn)代碼塊耗時(shí)測(cè)算工具類

    這篇文章主要為大家介紹了如何利用Java語(yǔ)言編寫(xiě)一個(gè)工具類,用來(lái)測(cè)算代碼塊的耗時(shí),同時(shí)還能顯示進(jìn)度,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Java并發(fā)編程之ReentrantLock實(shí)現(xiàn)原理及源碼剖析

    Java并發(fā)編程之ReentrantLock實(shí)現(xiàn)原理及源碼剖析

    ReentrantLock 是常用的鎖,相對(duì)于Synchronized ,lock鎖更人性化,閱讀性更強(qiáng),文中將會(huì)詳細(xì)的說(shuō)明,請(qǐng)君往下閱讀
    2021-09-09
  • java程序設(shè)計(jì)語(yǔ)言的優(yōu)勢(shì)及特點(diǎn)

    java程序設(shè)計(jì)語(yǔ)言的優(yōu)勢(shì)及特點(diǎn)

    在本篇文章里小編給大家分享的是一篇關(guān)于java程序設(shè)計(jì)語(yǔ)言的優(yōu)勢(shì)及特點(diǎn)的內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • Java中的ArrayList.trimToSize()方法詳解

    Java中的ArrayList.trimToSize()方法詳解

    這篇文章主要介紹了Java中的ArrayList.trimToSize()方法詳解,前幾天看了Java?ArrayList,沒(méi)有明白trimToSize()這個(gè)方法是什么意思,所以看了一下源碼并且debug一下自己的一個(gè)例子,明白了其中的含義,需要的朋友可以參考下
    2023-11-11
  • 淺談java常量池

    淺談java常量池

    下面小編就為大家?guī)?lái)一篇淺談java常量池。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • java如何實(shí)現(xiàn)postman中用x-www-form-urlencoded參數(shù)的請(qǐng)求

    java如何實(shí)現(xiàn)postman中用x-www-form-urlencoded參數(shù)的請(qǐng)求

    在Java開(kāi)發(fā)中,模擬Postman發(fā)送x-www-form-urlencoded類型的請(qǐng)求是一個(gè)常見(jiàn)需求,本文主要介紹了如何在Java中實(shí)現(xiàn)這一功能,首先,需要通過(guò)導(dǎo)入http-client包來(lái)創(chuàng)建HTTP客戶端,接著,利用該客戶端發(fā)送Post請(qǐng)求
    2024-09-09
  • Java Swing JPasswordField密碼框的實(shí)現(xiàn)示例

    Java Swing JPasswordField密碼框的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java Swing JPasswordField密碼框的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論