1. 程式人生 > >spring+springmvc+mybatis 開發JAVA單體應用

spring+springmvc+mybatis 開發JAVA單體應用

 myshop 概述

myshop專案是根據視訊教程 Java 單體應用 做的一個練習專案,目前完成了登入功能、使用者管理、類別管理後續有時間會繼續做其它的功能。趁著雙11花了99元一年買了臺阿里雲伺服器,演示地址>> myshop

專案地址  https://gitee.com/yehuabin/myshop

 

專案結構

my-shop-dependencies:管理jar包的版本,所有專案依賴此專案

my-shop-commons:專案通用工具、實體類

my-shop-domain: POJO類,對於資料庫一張表

my-shop-web-admin:後臺管理功能

my-shop-web-api、my-shop-web-ui:商城前端展示部分,目前還沒開發

BaseDao

public interface BaseDao<T> {
    int create(T model);
    int update(T model);
    int delete(int id);
    T getById(int id);
}

BaseDao定義了通用的資料操作介面其它具體的操作介面都繼承該dao

public interface TbUserDao extends
BaseDao<TbUser> { TbUser getByUserNameAndPasswrod(Map<String,String> param); List<TbUser> getByPage(PageQuery<TbUserQuery> pageQuery); int getCount(PageQuery<TbUserQuery> pageQuery); }

TbUserDao繼承BaseDao並定義了自己特有的一些介面

BaseService

public interface
BaseService<T extends BaseEntity> { BaseResult create(T model); T getById(int id); BaseResult update(T model); BaseResult delete(int id); }

BaseService定義通用的服務介面,T 就是某個具體的domain物件

然後給這個通用服務介面定義一個通用的實現 BaseServiceImpl。實現通用的CRUD

public abstract class BaseServiceImpl<T extends BaseEntity,D extends BaseDao<T>> implements BaseService<T> {
    @Autowired
    protected D dao;

    @Override
    public BaseResult create(T model) {
        BaseResult baseResult = EntityValidator.validate(model);
        if (!baseResult.isSuccess()) {
            return baseResult;
        }
        model.setCreated(new Date());
        model.setUpdated(new Date());
        return getBaseResult(dao.create(model),"新增失敗");
    }

    public T getById(int id) {
        return dao.getById(id);
    }

    public BaseResult update(T model)
    {
        BaseResult baseResult = EntityValidator.validate(model);
        if (!baseResult.isSuccess()) {
            return baseResult;
        }
        model.setUpdated(new Date());
        return getBaseResult(dao.update(model),"更新失敗");
    }

    public BaseResult delete(int id) {
        return getBaseResult(dao.delete(id),"刪除失敗");
    }

    private BaseResult getBaseResult(int row,String error){
        BaseResult baseResult = BaseResult.success();

        if(row<=0){
            baseResult=BaseResult.fail(error);
        }
        return baseResult;
    }
}

 

使用者服務繼承BaseService並擴充套件了兩個方法

public interface UserService extends BaseService<TbUser>  {
     PageResult<TbUser> getByPage(PageQuery<TbUserQuery> pageQuery);
     TbUser login(String userName, String password);
}

 

使用者服務的具體實現

@Service
public class UserServiceImpl extends BaseServiceImpl<TbUser,TbUserDao> implements UserService {

    @Override
    public BaseResult create(TbUser tbUser) {
        if (StringUtils.isBlank(tbUser.getPassword())) {
            return BaseResult.fail("密碼不能為空");
        }
        tbUser.setPassword(md5DigestAsHex(tbUser.getPassword()));


        return super.create(tbUser);
    }

    @Override
    public PageResult<TbUser> getByPage(PageQuery<TbUserQuery> pageQuery) {
        PageResult<TbUser> result = new PageResult<>();
        List<TbUser> list = dao.getByPage(pageQuery);
        int count=dao.getCount(pageQuery);
        result.setData(list);
        result.setRecordsTotal(count);
        result.setRecordsFiltered(count);
        return result;
    }

    @Override
    public BaseResult update(TbUser tbUser) {

        if (StringUtils.isNotBlank(tbUser.getPassword())) {
            tbUser.setPassword(md5DigestAsHex(tbUser.getPassword()));
        }
       return super.update(tbUser);
    }

    @Override
    public TbUser login(String userName, String password) {
        Map<String, String> param = new HashMap<>();
        param.put("userName", userName);
        param.put("password", md5DigestAsHex(password));

        System.out.println(param.get("password"));
        return dao.getByUserNameAndPasswrod(param);
    }

    private String md5DigestAsHex(String password){
       return DigestUtils.md5DigestAsHex(password.getBytes());
    }
}

BaseController

BaseController定義了通用的列表頁、表單頁、刪除操作的跳轉

public abstract class BaseController<T extends BaseEntity,S extends BaseService<T>> {
   @Autowired
    protected S service;
    @ModelAttribute
    public T getModel(Integer id) {
        T model=initFormEntity();
        if (id != null && id > 0) {
            model = service.getById(id);
        }

        return model;
    }
    @RequestMapping("/list")
    public String list(Model model) {

        return getJspPath()+"/list";
    }
    @RequestMapping(value = {"/create", "edit"}, method = RequestMethod.GET)
    public String form() {

        return getJspPath()+"/form";
    }
    @RequestMapping("/detail")
    public String detail() {
        return getJspPath()+"/detail";
    }
    @ResponseBody
    @RequestMapping("/delete")
    public BaseResult delete(int id) {
        return service.delete(id);
    }

    @RequestMapping(value = {"/create", "edit"}, method = RequestMethod.POST)
    public String form(T entity, Model model) {
        BaseResult baseResult;
        if (entity.getId() != null && entity.getId() > 0) {
            baseResult = service.update(entity);
        } else {
            baseResult = service.create(entity);
        }

        //新增或者修改成功返回列表頁
        if (baseResult.isSuccess()) {

            return "redirect:list";
        }

        //失敗顯示錯誤資訊
        model.addAttribute("result", baseResult);
        return getJspPath()+"/form";
    }

    protected abstract T initFormEntity();
    protected  String getJspPath(){
        return getClass().getSimpleName().toLowerCase().replace("controller","");
    }
}

 

任何其它模組只要繼承BaseController,就可以自動跳轉到列表、表單、刪除等頁面,可以大大減少程式碼量

具體的UserController只需要實現特有的業務邏輯就可以

@Controller
@RequestMapping("/user")
public class UserController extends BaseController<TbUser,UserService> {

    @ResponseBody
    @RequestMapping("/page")
    public PageResult<TbUser> page(PageQuery<TbUserQuery> pageQuery, TbUserQuery query) {
        pageQuery.setQuery(query);
        PageResult<TbUser> tbUsers = service.getByPage(pageQuery);
        return tbUsers;
    }

    @Override
    protected TbUser initFormEntity() {
        return new TbUser();
    }
}