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

spring+springmvc+mybatis 开发JAVA单体应用的更多相关文章

  1. 搭建Spring + SpringMVC + Mybatis框架之二(整合Spring和Mybatis)

    整合Spring和Mybatis 首先给出完整的项目目录: (1)引入项目需要的jar包 使用http://maven.apache.org作为中央仓库即可. Spring核心包,mybatis核心包 ...

  2. 使用maven整合spring+springmvc+mybatis

    使用maven整合spring+springmvc+mybatis 开发环境: 1. jdk1.8 2. eclipse4.7.0 (Oxygen) 3. mysql 5.7 在pom.xml文件中, ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...

  4. 框架篇:Spring+SpringMVC+Mybatis整合开发

    前言: 前面我已搭建过ssh框架(http://www.cnblogs.com/xrog/p/6359706.html),然而mybatis表示不服啊. Mybatis:"我抗议!" ...

  5. Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  8. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)

    用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...

  9. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)

    引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一   的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...

随机推荐

  1. 20165219 2017-2018-2《Java程序设计》课程总结

    20165219 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 20165219 我期望的师生关系 20165219学习基础与C语言基础调查 20165219 ...

  2. DRF 的解析器和渲染器

    一.解析器 解析器作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentT ...

  3. 基于openstack搭建百万级并发负载均衡器的解决方案

    最近,喜欢研究一些国外技术大咖们的文章,而这篇文章是基于openstack负载均衡器的解决方案,做的一些总结~希望能够给小伙伴带来一些灵感或者帮助. openstack现有的负载均衡解决方案,无论是l ...

  4. inspect模块---检查活动对象

    inspect模块提供了一些有用的函数来帮助获取有关活动对象(如模块,类,方法,函数,跟踪,框架对象和代码对象)的信息.例如,它可以帮助您检查类的内容,检索方法的源代码,提取和格式化函数的参数列表,或 ...

  5. P2252 取石子游戏 威佐夫博弈

    $ \color{#0066ff}{ 题目描述 }$ 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆 ...

  6. 快速排序(一) 思想 JAVA实现

    已知数组59.71.37.56.88.96.21.58.48.43 采用快速排序将数组有序. 快速排序同样采用了“分治策略”,使用递归的思路来实现算法. 快速排序的算法思想: 9.71.37.56.8 ...

  7. Macaca,Maven,MVC框架

    Macaca:Macaca是阿里开源的一套完整的自动化测试解决方案.同时支持PC和移动端测试,支持的语言有JS,Java,Python. Maven:java,Maven项目对象模型(POM),可以通 ...

  8. C++_IO与文件5-文件的输入与输出

    大多数计算机程序都使用了文件.文件本身是存储在某种设备上的一系列字节. 通常,操作系统管理文件,跟踪它们的位置.大小.创建时间等. 除非在操作系统级别上编程,否则通常不必担心这些事情. 真正需要的是将 ...

  9. 【DP】【构造】NOIp模拟题 演讲 题解

        极其考思维的好题 题目背景 众所周知,$\mathrm{Zdrcl}$是一名天天$\mathrm{AK}$的高水平选手. 作为一民长者,为了向大家讲述自己$\mathrm{AK}$的经验,他决 ...

  10. ZQUOJ 22854 (优先队列+剪枝)

    题目:给出K , N , M   :  N为顶点数 , M为边数  : 求K个从1到N的不重复的最短边 , 可以来回的走: 分析:很自然的就可以想到用个优先队列广收下K次终点嘛 , 但是.0.0 爆了 ...