• 多模块开发 简易版
  1. dao 层 也可以说是 Mapper 层
  2. web 层 将 controller 放在这一层 还有 统一返回类型 和 自定义异常 也在放在这里 启动类也放在这里
  3. model 层 也就是 数据对象 比如常见的 User 类
  4. server 层 业务逻辑层 或者说 service 层更好

创建步骤

  1. 创建一个正常的 Springboot 项目
  2. 删除 src 目录 和 不需要的 mvn 文件
  3. 修改 pom.xml
    1. 值得注意的是新版 idea 创建 Springboot 项目强制使用 jdk 17 这里使用的 解决办法就是 正常使用jdk17 创建项目创建完成后再在pom.xml中修改回来
    2. 解决办法不止 一种可以自行搜索
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<groupId>com.codervibe</groupId>
<artifactId>springbootmultimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootmultimodule</name>
<description>springbootmultimodule</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 修改打包方式为 pom -->
<packaging>pom</packaging>
<!--指定子模块-->
<modules>
<module>dao</module>
<module>web</module>
<module>server</module>
<module>model</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
  1. 依次创建 所需的 子模块 dao controller server model
  2. 将 这些模块的 打包方式改为 jar 并将 父模块改为 项目所在的模块
  3. 依赖关系 也就是将 到模块加入到 server 模块的pom.xml 中依次类推
    1. server 模块 依赖于 dao 模块
    2. controller 模块依赖于 server 模块
    3. dao server controller 三个子模块 均依赖于 model 模块
  • 父模块 添加的依赖 比如 mybatis 会同步到 子模块中
  1. 创建一个简易的 controller
@RestController
@RequestMapping("/user")
public class UserController {
Logger logger = LoggerFactory.getLogger(UserController.class); @GetMapping("/list")
public R list() {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "孙悟空", "1111", "94df@f4m2.com.cn", new Date(), "1"));
userList.add(new User(2, "金蝉子", "1111", "461b@91y35u.xyz", new Date(), "1"));
userList.add(new User(3, "鲁班七号", "11111", "6959@687kyp.com", new Date(), "1"));
userList.add(new User(4, "鲁班大师", "11111", "fa57@196bmfgq.com.cn", new Date(), "1"));
userList.add(new User(5, "安其拉", "111111", "88ac@o23wg.com", new Date(), "1"));
logger.info("用户列表 :" + userList.toString());
return R.ok().data("userItems", userList).message("用户列表");
}
}
  1. 添加 application.yaml
spring:
application:
name: springbootmultimodule
jackson:
date-format:yyyy-MM-dd HH:mm:ss
time-zone=GMT+8
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3307/vue_login?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: admin
server:
port: 5767
undertow:
io-threads: 16
worker-threads: 256
buffer-size: 1024
direct-buffers: true
servlet:
context-path: /springbootmultimodule
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.codervibe.springbootmultimodule.model logging:
level:
root: info
com.codervibe.springbootmultimodule: info
com.codervibe.springbootmultimodule.mapper: debug
file:
path: ./log/
  1. 现在 添加 service的部分 包括 接口 和接口的实现
package com.codervibe.server.service;

import com.codervibe.model.User;

import java.util.List;

public interface UserService {
/**
* 查询所有用户信息
*
* @return boolean
*/
List<User> selectUserAll();
/**
* 添加用户信息列表
* @return boolean
*/
void addList(List<User> userList);
}
package com.codervibe.server.Impl;

import com.codervibe.mapper.UserMapper;
import com.codervibe.model.User;
import com.codervibe.server.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import javax.annotation.Resource;
import java.util.List; @Service("UserService")
public class UserServiceImpl implements UserService {
Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
@Resource
private UserMapper userMapper; /**
* 查询所有用户信息
*
* @return userList
*/
@Override
public List<User> selectUserAll() { logger.info(userMapper.selectUserAll().toString());
logger.info("即将返回数据");
return userMapper.selectUserAll();
}
/**
* 添加用户信息列表
*
* @param userList
* @return boolean
*/
@Override
public void addList(List<User> userList) {
for (User user : userList) {
userMapper.addList(user);
}
}
}
  1. 修改 controller 类的 方法 并依赖注入 service
package com.codervibe.web.controller;

import com.codervibe.model.User;
import com.codervibe.server.service.UserService;
import com.codervibe.web.common.response.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource;
import java.util.*; @RestController
@RequestMapping("/user")
public class UserController {
Logger logger = LoggerFactory.getLogger(UserController.class); @Resource
private UserService userService; @GetMapping("/list")
public R list() {
logger.info("用户列表 :" + userService.selectUserAll().toString());
return R.ok().data("userItems", userService.selectUserAll()).message("用户列表");
} @GetMapping("/addList")
public R addList() {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "孙悟空", "1111", "94df@f4m2.com.cn", new Date(), "1"));
userList.add(new User(2, "金蝉子", "1111", "461b@91y35u.xyz", new Date(), "1"));
userList.add(new User(3, "鲁班七号", "11111", "6959@687kyp.com", new Date(), "1"));
userList.add(new User(4, "鲁班大师", "11111", "fa57@196bmfgq.com.cn", new Date(), "1"));
userList.add(new User(5, "安其拉", "111111", "88ac@o23wg.com", new Date(), "1")); Map<String, Object> map = new HashMap<>();
try {
userService.addList(userList);
} catch (Exception e) {
e.printStackTrace();
map.put("fali", false);
map.put("message", "用户注册失败" + e.getMessage());
return R.error().data(map);
}
map.put("success", true);
map.put("message", "用户注册成功");
return R.ok().data(map);
}
}
  1. 添加 dao 层 的 Mapper 以及 xml 实现
package com.codervibe.mapper;

import com.codervibe.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component; import java.util.List; @Mapper
@Component
public interface UserMapper {
/**
* 查询所有用户信息
* @return
*/
List<User> selectUserAll();
/**
* 添加用户信息列表
* @return boolean
*/
boolean addList(User user);
}
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.codervibe.mapper.UserMapper">
<insert id="addList" parameterType="com.codervibe.model.User" useGeneratedKeys="true" keyProperty="id">
insert into user(username,password,email,createTime,role) values (#{username}, #{password},#{email}, #{createTime}, #{role})
</insert>
<select id="selectUserAll" resultType="com.codervibe.model.User" >
select * from user
</select>
</mapper>
  1. 此时启动 就应用就会报错 这是因为 由于分模块导致没有扫描到其他包 需要在启动类上添加 注解 以扩大 扫描范围
package com.codervibe.web;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages = {"com.codervibe"})
@MapperScan({"com.codervibe.mapper"})
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
} }
  1. 代码中用到的自定义返回类型
package com.codervibe.web.common.response;

import lombok.Data;

import java.util.HashMap;
import java.util.Map; @Data
public class R {
private Boolean success;
private Integer code;
private String message;
private Map<String, Object> data = new HashMap<>(); // 构造器私有
private R() {
} // 通用返回成功
public static R ok() {
R r = new R();
r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
r.setCode(ResultCodeEnum.SUCCESS.getCode());
r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
return r;
} // 通用返回失败,未知错误
public static R error() {
R r = new R();
r.setSuccess(ResultCodeEnum.UNKNOWN_ERROR.getSuccess());
r.setCode(ResultCodeEnum.UNKNOWN_ERROR.getCode());
r.setMessage(ResultCodeEnum.UNKNOWN_ERROR.getMessage());
return r;
} // 设置结果,形参为结果枚举
public static R setResult(ResultCodeEnum result) {
R r = new R();
r.setSuccess(result.getSuccess());
r.setCode(result.getCode());
r.setMessage(result.getMessage());
return r;
} /**
* ------------使用链式编程,返回类本身-----------
**/ // 自定义返回数据
public R data(Map<String, Object> map) {
this.setData(map);
return this;
} // 通用设置data
public R data(String key, Object value) {
this.data.put(key, value);
return this;
} // 自定义状态信息
public R message(String message) {
this.setMessage(message);
return this;
} // 自定义状态码
public R code(Integer code) {
this.setCode(code);
return this;
} // 自定义返回结果
public R success(Boolean success) {
this.setSuccess(success);
return this;
} }
package com.codervibe.web.common.response;

import lombok.Getter;

@Getter
public enum ResultCodeEnum {
SUCCESS(true,20000,"成功"),
UNKNOWN_ERROR(false,20001,"未知错误"),
PARAM_ERROR(false,20002,"参数错误"),
NULL_POINT(false,20003,"空指针错误"),
HTTP_CLIENT_ERROR(false,20004,"客户端错误")
;
private Boolean success;
private Integer code;
private String message;
ResultCodeEnum(boolean success,Integer code,String message){
this.success =success;
this.code = code;
this.message =message;
}
}

SpringBoot 多模块开发 笔记(一)的更多相关文章

  1. springboot多模块开发以及整合dubbo\zookeeper进行服务管理

    之前研究了springboot单工程的使用,参考git地址:https://github.com/qiao-zhi/springboot-ssm 下面研究springboot多模块开发的过程. 1.模 ...

  2. VB 核心编程及通用模块开发 笔记1

    前言:学习任何编程语言.编程工具的目的不外乎解决生活问题,能够快速.高效解决问题的方式就是不错的方式,至于选择什么“工具”,众位看官看着办,本人虽然有过3年vb开发经验,但是一直没有深入学习,现已购买 ...

  3. Springboot分模块开发详解(2):建立子工程

    1.创建base-entity 选中base工程,右键创建一个新的maven工程 自动选择了base这个目录存放子工程 创建后,pom.xml修改成如下内容: <?xml version=&qu ...

  4. MFRC522模块开发笔记

    Write_to_Card(-)和Read_from_Card(-)可谓是所有函数的终点,而SPIWriteByte(-)则是最底层对MFRC522模块进行操作的函数,所有函数都是为了Write_to ...

  5. Springboot分模块开发详解(1):建立父工程

    基础服务,见下: base是父工程,base-entity是实体层,base-dao是DAO层,base-service是业务层,base-controller是WEB控制器层,base-web是页面 ...

  6. Springboot分模块开发

    这是个spring cloud项目,service-base:基础服务:service-config:配置中心:service-entity:实体类: service-gateway:服务网关:ser ...

  7. EC20 minipcie版4g模块开发笔记

    插在电脑上实验时若出现 AT+CREG? +CREG: 0,2 可能是usb口供电不足所致,换至主机箱后面usb口后问题解决,返回值+CREG: 0,1

  8. [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发

    前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...

  9. 记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)

    大家好嘞,今天闲着没事干开写写博客,记录一下Maven+SpringBoot的多模块设计和遇到的坑. 多模块设计 简单说明一下截止目前的需求: 需要RESTful API:对文章.标签.分类和评论等的 ...

  10. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-8.用户模块开发之保存微信用户信息

    笔记 8.用户模块开发之保存微信用户信息     简介:开发User数据访问层,保存微信用户信息 问题:             微信回调 用户昵称乱码             解决:        ...

随机推荐

  1. vue 状态管理 五、Module用法

    系列导航 vue 状态管理 一.状态管理概念和基本结构 vue 状态管理 二.状态管理的基本使用 vue 状态管理 三.Mutations和Getters用法 vue 状态管理 四.Action用法 ...

  2. vue结合element-ui实现多层复选框checkbox

    1.需求如上图所以: html相关代码如下: 1 <div class="intent-course-wrapper"> 2 <div class="c ...

  3. uni-app阿里图标引用

    @font-face { font-family: "iconfont"; /* Project id 2566540 */ src: url('~@/static/fonts/i ...

  4. Oracle建立索引前后性能比较

    1.SQL语句 create table C##HR.t_noindex as select * from all_objects; create table C##HR.t_indexed as s ...

  5. java - 字符串转数字

    Integer.valueOf("str").intValue(): Integer.valueOf("123").intValue():

  6. 利用工具查看JMS微服务在线情况,可直接调用远程方法,也可自动生成微服务客户端代码

    链接:https://cccscls-my.sharepoint.com/personal/jack_mutc_ca/_layouts/15/onedrive.aspx?id=%2Fpersonal% ...

  7. 【Spring 5核心原理】1设计模式

    1.1开闭原则 开闭原则(open-closed principle,OCP)是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭.所谓的开闭,也正是对扩展和修改两个行为的一个原则. 强调用 ...

  8. 这一次,弄明白JS中的文件相关(二):HTTP请求头和响应头

    (一)前置知识 开始前,我们先来复习一下HTTP的基础知识. HTTP请求分为:请求行.请求头.空行.请求体(也叫正文.请求实体.请求主体). HTTP响应分为:状态行(也叫响应行).响应头.空行.响 ...

  9. mysql-字符函数-拼接-长度-切片-替换

  10. Go-数据类型-布尔类型-bool

    布尔类型--bool 只有两个值 true false 不能转换成其他类型,也不能参加数值运算 布尔应用场景 if swicht for 三大分支语句中的条件部分 比较运算和逻辑运算的返回值 作为通道 ...