我的SSM 代碼生成工具

SSM項(xiàng)目做得的多了掺出,你就會發(fā)現(xiàn)大部分代碼千篇一律苫费,我一般都是通過工具生成這些CRUD代碼,然后再編寫業(yè)務(wù)代碼百框,下面分享一下我開發(fā)的代碼生成工具:

實(shí)現(xiàn)效果:

數(shù)據(jù)庫設(shè)計(jì)好表結(jié)構(gòu)或者修改表結(jié)構(gòu)之后铐维,通過此工具生成ORM層代碼,service層代碼嫁蛇,以及controller層代碼。其中service 和 controller 層代碼第煮,只生成一次抑党,避免自己寫業(yè)務(wù)邏輯被覆蓋。ORM層代碼會覆蓋新荤。因此,ORM層的代碼我分為自動生成的文件和手寫的文件篱瞎。

生成的代碼如下:

Controller 層:

package com.jjp.api;

import java.lang.Integer;import java.lang.Object;import java.lang.String;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;

import com.jjp.enums.ErrorTypeEnum;
import com.jjp.enums.NormalStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import com.jjp.bean.PagingProperties;

import com.jjp.model.Org;
import com.jjp.model.OrgExample;
import com.jjp.service.OrgService;
import com.jjp.api.validator.OrgValidator;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;



@Controller
@RequestMapping("/api/v1/org")
public class OrgController extends BaseController {

    @Autowired
    private OrgService orgService;

    @InitBinder(value = "org")
    public void initBinder(WebDataBinder binder) {
        binder.setValidator(new OrgValidator());
    }

    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> insert(@Valid @RequestBody Org org, BindingResult result) {
        if (result.hasErrors()) {
            return failedResult(ErrorTypeEnum.VALIDATE_ERROR, result.getAllErrors().get(0).getDefaultMessage());
        }
        org.setCreateDate(new Date());
        org.setStatus(NormalStatusEnum.NORMAL.getByte());
        orgService.insert(org);
        return successResult(org);
    }

    @RequestMapping(value = "{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public Map<String, Object> delete(@PathVariable("id") Integer id) {
        Org delete = new Org();
        delete.setId(id);
//        delete.setStatus(NormalStatusEnum.DELETED.getValue());
        orgService.updateByPrimaryKeySelective(delete);
        return successResult("Ok");
    }

    @RequestMapping(value = "list", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, Object> list(PagingProperties paging) {
        OrgExample exam = new OrgExample();
        if(paging.getNeedPaging()) {
            paging.setTotal(orgService.countByExample(exam));
            exam.setOrderByClause(" id desc " + paging.build());
        }
        List<Org> list = orgService.selectByExample(exam);
        return successPageList(paging,list);
    }

    @RequestMapping(value = "{id}", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, Object> get(@PathVariable("id") Integer id) {
        return successResult(orgService.selectByPrimaryKey(id));
    }

    @RequestMapping(value = "{id}", method = RequestMethod.PUT)
    @ResponseBody
    public Map<String, Object> update(@PathVariable("id") Integer id, @Valid @RequestBody Org org, BindingResult result) {
        if (result.hasErrors()) {
            return failedResult(ErrorTypeEnum.VALIDATE_ERROR, result.getAllErrors().get(0).getDefaultMessage());
        }
        orgService.updateByPrimaryKeySelective(org);
        return successResult("ok");
    }

}

Service 層

import com.jjp.model.Org;
import com.jjp.model.OrgExample;

public interface OrgService extends BaseService<Org, OrgExample, Integer>{

}

impl

package com.jjp.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jjp.dao.OrgMapper;
import com.jjp.model.Org;
import com.jjp.model.OrgExample;
import com.jjp.service.OrgService;

@Service
public class OrgServiceImpl extends BaseServiceImpl<Org, OrgExample, Integer> implements OrgService {

    @Autowired
    public void setBaseMapper(OrgMapper mapper) {
        this.baseMapper = mapper;
    }
}

所有的增刪查改代碼我都通過泛型寫到父類里面了严衬,避免到處都是重復(fù)代碼
比如:

package com.jjp.service.impl;

import com.jjp.dao.BaseMapper;
import com.jjp.service.BaseService;

import java.util.List;


public abstract class BaseServiceImpl<T, E, K> implements BaseService<T, E, K> {
    
    protected BaseMapper<T,E,K> baseMapper;
    
    @Override
    public int countByExample(E e){
        return baseMapper.countByExample(e);
    }

    @Override
    public void insert(T t) {
        baseMapper.insert(t);
        
    }

    @Override
    public void insertSelective(T t) {
        baseMapper.insertSelective(t);
        
    }

//  @Override
//  public void deleteByPrimaryKey(K k) {
//      baseMapper.deleteByPrimaryKey(k);
//
//  }

    @Override
    public void deleteByExample(E e) {      
        baseMapper.deleteByExample(e);
    }

    @Override
    public T selectByPrimaryKey(K k) {
        return baseMapper.selectByPrimaryKey(k);
    }

    @Override
    public List<T> selectByExample(E e) {
        return baseMapper.selectByExample(e);
    }

    @Override
    public void updateByExampleSelective(T t, E e){
        baseMapper.updateByExampleSelective(t, e);
    }

    @Override
    public void updateByExample(T t, E e) {
        baseMapper.updateByExample(t, e);

    }

    @Override
    public void updateByPrimaryKeySelective(T t) {
        baseMapper.updateByPrimaryKeySelective(t);

    }

//  @Override
//  public void updateByPrimaryKey(T t) {
//      baseMapper.updateByPrimaryKey(t);
//
//  }

    public void setBaseMapper(BaseMapper<T, E, K> baseMapper) {
        this.baseMapper = baseMapper;
    }
        
}

ORM 層也是一樣

package com.jjp.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;


public interface BaseMapper<T,E,K> {
    
        int countByExample(E e);

        int deleteByExample(E e);

        int deleteByPrimaryKey(K k);

        int insert(T t);

        int insertSelective(T t);

        List<T> selectByExample(E e);

        T selectByPrimaryKey(K k);

        int updateByExampleSelective(@Param("record") T t, @Param("example") E e);

        int updateByExample(@Param("record") T t, @Param("example") E e);

        int updateByPrimaryKeySelective(T t);

        int updateByPrimaryKey(T t);
    
    
}

最后看下工具界面


產(chǎn)品截圖.png

gitee 地址: https://gitee.com/petercao/ssm-generator

感興趣的話可以加微信聊聊:mrxiaocao

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粱挡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榕堰,更是在濱河造成了極大的恐慌嫌套,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踱讨,死亡現(xiàn)場離奇詭異,居然都是意外死亡莺治,警方通過查閱死者的電腦和手機(jī)味混,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔓挖,“玉大人馆衔,你說我怎么就攤上這事〗抢#” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵匆瓜,是天一觀的道長未蝌。 經(jīng)常有香客問我,道長萧吠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任拇砰,我火速辦了婚禮,結(jié)果婚禮上牧氮,老公的妹妹穿的比我還像新娘皂岔。我一直安慰自己展姐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布教馆。 她就那樣靜靜地躺著擂达,像睡著了一般土铺。 火紅的嫁衣襯著肌膚如雪板鬓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天后德,我揣著相機(jī)與錄音抄腔,去河邊找鬼。 笑死赫蛇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的落蝙。 我是一名探鬼主播暂幼,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奏寨!你這毒婦竟也來了鹰服?” 一聲冷哼從身側(cè)響起揽咕,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤套菜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逗柴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渣蜗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年耕拷,在試婚紗的時候發(fā)現(xiàn)自己被綠了托享。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡闰围,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碧查,到底是詐尸還是另有隱情炕矮,我是刑警寧澤么夫,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布档痪,位于F島的核電站邢滑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏困后。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一汽绢、第九天 我趴在偏房一處隱蔽的房頂上張望侧戴。 院中可真熱鬧跌宛,春花似錦、人聲如沸疆拘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隆圆。三九已至,卻和暖如春棱烂,著一層夾襖步出監(jiān)牢的瞬間阶女,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工秃踩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留业筏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓消别,卻偏偏與公主長得像台谢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朋沮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355