框架搭建:单体应用服务之SSM整合:Spring4 + SpringMvc + Mybatis

作者:小傅哥
博客:https://bugstack.cn

沉淀、分享、成长,让自己和他人都能有所收获!

前言介绍

在实际的业务开发中按照不同的场景需要,会有不同的业务架构也就同时会有不同的技术框架来支撑。那么这个专题想把一些常用的框架整理下,方便平时使用的同时也做一些技术沉淀。那么本章节会先搭建一个比较适合个人项目或者一些小公司开发项目的单体架构模型。服务功能展示页面如下;

工程环境

  1. JDK1.8
  2. Maven 3.2.3
  3. Spring 4.3.24.RELEASE + SpringMvc + Mybatis 3.3.0
  4. Mysql 5.6 + dbcp2
  5. layui 2.5.4

工程模型

整体的工程模型采用DDD四层架构,相对于MVC模式来讲。嗯!相当于家里三居换四居了!

itstack-demo-frame-ssm
└── src
    ├── main
    │   ├── java
    │   │   └── org.itstack.demo
    │   │       ├── application 
    │   │       │   └── UserService.java 
    │   │       ├── domain
    │   │       │   ├── model
    │   │       │   │   ├── aggregates
    │   │       │   │   │   └── UserInfoCollect.java
    │   │       │   │   ├── req
    │   │       │   │   │   └── UserReq.java  
    │   │       │   │   └── vo
    │   │       │   │       └── UserInfo.java 
    │   │       │   ├── repository
    │   │       │   │   └── IUserRepository.java 
    │   │       │   └── service 
    │   │       │       └── UserServiceImpl.java 
    │   │       ├── infrastructure
    │   │       │   ├── common
    │   │       │   │   ├── EasyResult.java
    │   │       │   │   └── PageRequest.java
    │   │       │   ├── dao
    │   │       │   │   └── IUserDao.java 
    │   │       │   ├── po
    │   │       │   │   └── User.java  
    │   │       │   └── repository
    │   │       │       └── UserRepository.java 
    │   │       └── interfaces
    │   │           └── UserController.java
    │   ├── resources 
    │   │   ├── mapper
    │   │   ├── props 
    │   │   ├── spring
    │   │   ├── logback.xml
    │   │   ├── mybatis-config.xml
    │   │   └── spring-config.xml
    │   └── webapp
    │       ├── page
    │       ├── res
    │       ├── WEB-INF
    │       ├── index.html
    │       └── res_layui.html
    └── test
         └── java
             └── org.itstack.demo.test
                 └── ApiTest.java

application应用层

应用层是比较薄的一层,不做具体逻辑开发。本工程里只包括服务的定义,具体逻辑有领域层实现。如果需要扩展可以做一些应用服务编排。

application/UserService.java & 定义接口

public interface UserService {

    UserInfoCollect queryUserInfoList(UserReq req);

}

domain领域层

领域层是整个工程的核心服务层,这里负责处理具体的核心功能,完成领域服务。domain下可以有多个领域,每个领域里包括;聚合、请求对象、业务对象、仓储、服务。

domain/model/aggregates/UserInfoCollect.java & 定义聚合查询结果

public class UserInfoCollect {

    private Long count;
    private List userInfoList;

    public UserInfoCollect() {
    }

    public UserInfoCollect(Long count, List userInfoList) {
        this.count = count;
        this.userInfoList = userInfoList;
    }

    public Long getCount() {
        return count;
    }

    public void setCount(Long count) {
        this.count = count;
    }

    public List getUserInfoList() {
        return userInfoList;
    }

    public void setUserInfoList(List userInfoList) {
        this.userInfoList = userInfoList;
    }
}

domain/repository/IUserRepository.java & 定义仓储服务

public interface IUserRepository {

    UserInfoCollect queryUserInfoList(UserReq req);

}

domain/service/UserServiceImpl.java & 对业务层功能进行实现

@Service("userService")
public class UserServiceImpl implements UserService {

    @Resource(name = "userRepository")
    private IUserRepository userRepository;

    @Override
    public UserInfoCollect queryUserInfoList(UserReq req) {
        return userRepository.queryUserInfoList(req);
    }

}

infrastructure基础层

  1. 实现领域层仓储定义
  2. 数据库操作为非业务属性的功能操作
  3. 在仓储实现层进行组合装配DAO&Redis&Cache等

infrastructure/dao/IUserDao.java & 数据库操作

public interface IUserDao {

    List queryUserInfoList(UserReq req);

    Long queryUserInfoCount(UserReq req);

}

infrastructure/repository/UserRepository.java & 仓储功能实现如果有redis可以进行包装使用

@Repository("userRepository")
public class UserRepository implements IUserRepository {

    @Resource
    private IUserDao userDao;

    @Override
    public UserInfoCollect queryUserInfoList(UserReq req) {
        Long count = userDao.queryUserInfoCount(req);
        List userList = userDao.queryUserInfoList(req);
        List userInfoList = new ArrayList<>();
        userList.forEach(user -> {
            UserInfo userInfo = new UserInfo();
            userInfo.setUserId(user.getId());
            userInfo.setName(user.getName());
            userInfo.setAge(user.getAge());
            userInfo.setAddress(user.getAddress());
            userInfo.setEntryTime(user.getEntryTime());
            userInfo.setStatus(user.getStatus());
            userInfoList.add(userInfo);
        });
        return new UserInfoCollect(count, userInfoList);
    }

}

interfaces接口层

  1. 包装应用接口对外提供api,目前这一层比较简单只需要进行接口使用即可
  2. 如果是对外部提供服务接口,那么可以使用DTO方式进行转换,避免污染到业务类

interfaces/UserController.java & 提供接口服务

@Controller
@RequestMapping("/api/user/")
public class UserController {

    private Logger logger = LoggerFactory.getLogger(UserController.class);

    @Resource
    private UserService userService;

    @RequestMapping(path = "queryUserInfoList", method = RequestMethod.GET)
    @ResponseBody
    public EasyResult queryUserInfoList(String json, String page, String limit) {
        try {
            logger.info("查询用户信息列表开始。json:{}", json);
            UserReq req = JSON.parseObject(json, UserReq.class);
            if (null == req) req = new UserReq();
            req.setPage(page, limit);
            UserInfoCollect userInfoCollect = userService.queryUserInfoList(req);
            logger.info("查询用户信息列表完成。userInfoCollect:{}", JSON.toJSONString(userInfoCollect));
            return EasyResult.buildEasyResultSuccess(userInfoCollect.getCount(), userInfoCollect.getUserInfoList());
        } catch (Exception e) {
            logger.error("查询用户信息列表失败。json:{}", json, e);
            return EasyResult.buildEasyResultError(e);
        }
    }

}

resource配置

这里包括了Spring、SpringMvc、mybatis、以及日志信息的配置;

mapper/User_Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>




    

    


props/jdbc.properties & 数据库链接信息

db.jdbc.driverClassName=com.mysql.jdbc.Driver
db.jdbc.url=jdbc:mysql://127.0.0.1:3306/itstack?createDatabaseIfNotExist=true&characterEncoding=utf-8&useUnicode=true
db.jdbc.username=root
db.jdbc.password=123456

spring/spring-config-datasource.xml & dbcp2数据源配置以及扫描Mapper等

<?xml version="1.0" encoding="UTF-8"?>


    
    
        
        
        
        
        
        
        
        
        
    

    
    
        
        
        
        
        
        
        
        
    

    
    
        
        
        
        
    


resources/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>


 
 
  
  
  
  
  
  
 

resources/spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>


    
    

    
    
        
            
                classpath:props/*.properties
            
        
    

    


itstack.sql

DROP TABLE user;
CREATE TABLE user ( id bigint(11) NOT NULL AUTO_INCREMENT, name varchar(32), age int(4), address varchar(128), entryTime datetime, remark varchar(64), createTime datetime, updateTime datetime, status int(4) DEFAULT '0', PRIMARY KEY (id), INDEX idx_name (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user (id, name, age, address, entryTime, remark, createTime, updateTime, status) values (1, '水水', 18, '吉林省榆树市黑林镇尹家村5组', '2019-12-22 00:00:00', '无', '2019-12-22 00:00:00', '2019-12-22 00:00:00', 0);
insert into user (id, name, age, address, entryTime, remark, createTime, updateTime, status) values (2, '豆豆', 18, '辽宁省大连市清河湾司马道407路', '2019-12-22 00:00:00', '无', '2019-12-22 00:00:00', '2019-12-22 00:00:00', 1);
insert into user (id, name, age, address, entryTime, remark, createTime, updateTime, status) values (3, '花花', 19, '辽宁省大连市清河湾司马道407路', '2019-12-22 00:00:00', '无', '2019-12-22 00:00:00', '2019-12-22 00:00:00', 0);

综上总结

展开阅读全文

页面更新:2024-04-02

标签:大连市   司马   应用服务   架构   框架   模型   接口   定义   领域   功能   业务   工程

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top