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();
}
}
spring+springmvc+mybatis 开发JAVA单体应用的更多相关文章
- 搭建Spring + SpringMVC + Mybatis框架之二(整合Spring和Mybatis)
整合Spring和Mybatis 首先给出完整的项目目录: (1)引入项目需要的jar包 使用http://maven.apache.org作为中央仓库即可. Spring核心包,mybatis核心包 ...
- 使用maven整合spring+springmvc+mybatis
使用maven整合spring+springmvc+mybatis 开发环境: 1. jdk1.8 2. eclipse4.7.0 (Oxygen) 3. mysql 5.7 在pom.xml文件中, ...
- Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...
- 框架篇:Spring+SpringMVC+Mybatis整合开发
前言: 前面我已搭建过ssh框架(http://www.cnblogs.com/xrog/p/6359706.html),然而mybatis表示不服啊. Mybatis:"我抗议!" ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)
用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)
引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一 的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...
随机推荐
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 模态显示PresentModalViewController
1.主要用途 弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等 ...
- react.js学习之路五
最近没时间写博客,但是我一直在学习react,我发现react是一个巨大的坑,而且永远填不完的坑 关于字符串的拼接: 在react中,字符串的拼接不允许出现双引号“” ,只能使用单引号' ',例如这样 ...
- P2045 方格取数加强版 最大费用最大流
$ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...
- 添加win10激活工具
其实我们可以随便准备一个win10的激活密钥激活! 以管理员的身份进入到CMD下.. slmgr.vbs /upk 清除掉旧的slmgr /ipk W269N-WFGWX ...
- day13--------python 内置函数(一)
一:内置函数 内置函数就是python直接提供可以用的 01:作用域相关: locals() 返回当前作用域中的名字 globals() 返回全局作用域中的名字 02:迭代器相关: range() 生 ...
- Django - Xadmin 组件(二)
Django 自带的 admin 组件可以自定义配置,本文实现 Xadmin 对自定义显示数据列 (list_display) 的配置. 构建表单数据 模板层 从视图函数传来的数据变量是双层列表,第一 ...
- bzoj3098 Hash Killer II 生日共计
题目传送门 题目大意: 让你构造一个字符串,使字符串在题目给出的哈希条件下统计出错. 思路:生日攻击,结论题,尚未理解. #include<bits/stdc++.h> #define C ...
- express运行www后,在http://localhost:3000/查看返回会报 Cannot find module 'jade'
解决方法:npm install --save express jade
- HDU - 1427 / UESTC - 1252 经典dfs
很好奇为什么hzwer那种稍改一下还是无法过样例,代码我没看出问题 换了一种用桶组合挑取两个数不断回溯的做法 这是HDU1427的代码,后者改一改就行了 #include<bits/stdc++ ...