新建maven项目作为多模块的parent项目

  • 删除parent项目中的src目录
  • 修改parent项目中pom的 <packaging>pom</packaging>

新建模块

  • 在这个项目上右键,新建模块,parent保证是当前项目,保证模块目录在项目下面

    • 模块分别为api mapper service common pojo
    • 以上依赖关系:
      • 所有模块都依赖公共模块common
      • mapper依赖于pojo
      • service依赖于mapper
      • api依赖于service

在parent项目中配置 pom

  • 继承spring-boot依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
  • 配置项目要用到的依赖

    • spring-boot

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
    </dependency> <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency> <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    </dependency>
    • mybatis
        <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
    </dependency> <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
    </dependency>
    • mysql连接
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    </dependency>

api 模块搭建restful风格api

  • resource源目录配置yml

    • application.yml 服务环境分离,公共部分抽取
        server:
    port: 8080
    spring:
    profiles:
    active: test #指定使用哪个环境
    include: common #包括公共部分 ---
    server:
    port: 8080
    spring:
    profiles: test #指定属于哪个环境 ---
    server:
    port: 8081
    spring:
    profiles: prod #指定属于哪个环境
    • application-common.yml 公共部分
    logging:
    pattern:
    console: "[%thread] %-5level %logger{36} - %msg%n"
    level:
    tech.dclass.dclasspay.mapper: DEBUG #mybatis sql log mybatis:
    configuration:
    map-underscore-to-camel-case: false
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.kcclass.pojo
    • application-prod.yml 正式环境
    spring: #数据库连接
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: *********
    password: *********
    url: jdbc:mysql://172.17.0.5:61554/kcclass-prod?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&&allowMultiQueries=true
    type: com.zaxxer.hikari.HikariDataSource #Hikari数据源,默认也是这个数据源
    hikari:
    connection-timeout: 30000 #等待分配超时时间
    minimum-idle: 5 #最小连接
    maximum-pool-size: 20 #最大连接
    auto-commit: true #自动提交
    idle-timeout: 60000 #连接超时时间
    pool-name: HikariDataSource #连接池名称
    max-lifetime: 1800000 #生命时长,超过且没使用,则被回收
    connection-test-query: select 1 #测试查询 redis: #通用redis
    host: 122.51.217.181
    password: *********
    database: 15
    port: 6379
    • application-test.yml 测试环境,和正式环境只是具体值不同
  • 简单测试接口

#TestController.java
package com.itnetschool.controller; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class TestController { @GetMapping("/test")
public String test(){
return "test";
}
}
#ApiApplication.java
package com.itnetschool; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
@MapperScan(basePackages = "com.itnetschool.mapper")
public class ApiApplication { public static void main(String[] args) {
SpringApplication.run(ApiApplication.class,args);
}
}

启动Springboot启动类ApiApplication,访问http://localhost:8080/test

Mybatis Generator的使用(mybatis 逆向代码生成器,生成mapper和pojo)

  • 配置maven插件,在api模块的pom中配置如下
<build>

    <plugins>
<!--mvn mybatis-generator:generate-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version> <configuration>
<overwrite>true</overwrite>
</configuration>
</plugin> <plugin> <!--springboot打包插件-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.7.RELEASE</version>
</plugin>
</plugins>
</build>
  • 在api模块的resource中新建generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration>
<!-- windows下路径, D:\downloads\xxx.jar-->
<classPathEntry location="D:\mavenrepro\mysql\mysql-connector-java\8.0.17\mysql-connector-java-8.0.17.jar" /> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 不再追加xml内容-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /> <commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://sh-cdb-4*************m:61554/wxshell?characterEncoding=utf-8"
userId="root"
password= "**********">
<!--SpringBoot 刨坑记(二)generator自动生成mybatis实体类时多出了***WithBLOBs和***Key类 https://blog.csdn.net/qq_38972117/article/details/84955780-->
<property name="nullCatalogMeansCurrent" value="true" /> </jdbcConnection> <javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver> <javaModelGenerator targetPackage="com.itnetschool.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<!-- <property name="trimStrings" value="true" />-->
</javaModelGenerator> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator> <javaClientGenerator type="XMLMAPPER" targetPackage="com.itnetschool.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator> <table tableName="user" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/> </context>
</generatorConfiguration>
  • 使用idea终端,切换到api目录 ,然后执行mvn mybatis-generator:generate,生成pojo及mapper。
  • 执行完之后,可以将mapper及pojo拷贝到对应的mapper及pojo模块中。mapper.xml还是保留在api的resource源码下

mybatis-plus搭建baseservice

  • 生成的mapper接口 继承 BaseMapper 接口
package com.itnetschool.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itnetschool.pojo.User; public interface UserMapper extends BaseMapper<User> {
int deleteByPrimaryKey(Long userid); int insert(User record); int insertSelective(User record); User selectByPrimaryKey(Long userid); int updateByPrimaryKeySelective(User record); int updateByPrimaryKey(User record);
}
  • 新建service接口 继承Iservice
package com.itnetschool.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.itnetschool.pojo.User; public interface UserService extends IService<User> { }
  • 新建service实现类 继承ServiceImpl 并实现UserService
package com.itnetschool.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itnetschool.mapper.UserMapper;
import com.itnetschool.pojo.User;
import com.itnetschool.service.UserService;
import org.springframework.stereotype.Service; @Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { }

构建统一的格式化输出

  • ResultBean.java
package com.itnetschool.common.bean;

    import lombok.Data;

    import java.io.Serializable;

    @Data
public class ResultBean<T> implements Serializable { /** 错误码. */
private Integer code; /** 提示信息. */
private String msg; /** 具体内容. */
private T data; private static ResultBean initFromCodeType(ResultCodes resultCode){
ResultBean bean= new ResultBean();
bean.setCode(resultCode.getCode());
bean.setMsg(resultCode.getMessage());
return bean;
}
/**
* 成功通用
* @param object
* @return
*/
public static ResultBean success(Object object) {
ResultBean bean= initFromCodeType(ResultCodes.SUCCESS);
bean.setData(object);
return bean;
}
/**
* 无数据成功
* @return
*/
public static ResultBean success() {
return success(null);
}
/**
* 失败通用1
* @param code
* @param msg
* @return
*/
public static ResultBean fail(Integer code, String msg) {
ResultBean bean= new ResultBean();
bean.setCode(code);
bean.setData(null);
bean.setMsg(msg);
return bean;
}
/**
* 失败通用2
* @param resultCode
* @return
*/
public static ResultBean fail(ResultCodes resultCode) {
return initFromCodeType(resultCode);
}
/**
* 失败通用3
* @param resultCode
* @param object
* @return
*/
public static ResultBean fail(ResultCodes resultCode, Object object) {
ResultBean bean= new ResultBean();
bean.setCode(resultCode.getCode());
bean.setData(object);
bean.setMsg(resultCode.getMessage());
return bean;
} /**
* 无权限访问
* @return
*/
public static ResultBean failForbid() {
return initFromCodeType(ResultCodes.FORBID);
}
}
  • ResultCodes.java
package com.itnetschool.common.bean;

import lombok.Getter;

@Getter
public enum ResultCodes {
SUCCESS(200, "成功"),
NOTFOUND(404, "接口地址错误"),
FORBID(403, "权限不足"),#更多错误枚举实例,请自定义
;
private Integer code; private String message; ResultCodes(Integer code, String message) {
this.code = code;
this.message = message;
}
}

统一错误处理

  • 自定义 异常处理类
package com.itnetschool.common.exceptions;

import com.itnetschool.common.bean.ResultCodes;
import lombok.Getter;
@Getter
public class CommonException extends RuntimeException{ private Integer code; public CommonException(Integer code, String message) {
super(message);
this.code = code;
} public CommonException(ResultCodes resultCode) {
super(resultCode.getMessage());
this.code = resultCode.getCode();
}
}
  • 通过spring ControllerAdvice构建 统一异常处理方法。更多统一异常,请根据需要补充
package com.itnetschool.common.exceptions;

import com.itnetschool.common.bean.ResultBean;
import com.itnetschool.common.bean.ResultCodes;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.NoHandlerFoundException; @ControllerAdvice
@Slf4j
public class CommonExceptionHandler { @ExceptionHandler(value = Exception.class)
@ResponseBody
public ResultBean handle(Exception e) { if (e instanceof CommonException) {
CommonException exception = (CommonException) e;
return ResultBean.fail(exception.getCode(), exception.getMessage());
} else if (e instanceof NoHandlerFoundException || e instanceof HttpMediaTypeNotAcceptableException) {
return ResultBean.fail(ResultCodes.NOTFOUND);
}else {
e.printStackTrace();
return ResultBean.fail(ResultCodes.UNKNOWN);
}
}
}
  • 注意404处理,通常404时,内置服务器Tomcat会自动拦截并生成404页面,而不被ExceptionHandler拦截到。在yml中加入如下配置,加载原来spring配置项下面
spring: #数据库连接
resources:
add-mappings: false #不让tomcat拦截 404。
mvc:
throw-exception-if-no-handler-found: true #处理方式,抛出异常。全局异常处理才能拦截错误

完整参考demo:https://gitee.com/haimama/initproject

IDEA搭建多模块maven项目的更多相关文章

  1. 多模块Maven项目怎样使用javadoc插件生成文档

    需求 近期要对一个项目结构例如以下的Maven项目生成JavaDoc文档. Project                         |-- pom.xml                   ...

  2. 多模块Maven项目如何使用javadoc插件生成文档

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   需求 最近要对一个项目结构如下的Maven项目生成JavaDoc文档. Project                  ...

  3. <转>创建支持eclipse的多模块maven项目

    如何使用eclipse创建Maven工程及其子模块 1,首先创建一个父类工程   子模块继承父类工程      并在父类工程的pom.xml文件中定义引入的jar及其版本号     子模块可以引用 2 ...

  4. [转] 用Maven搭建多模块企业级项目

    转自:http://www.cnblogs.com/quanyongan/archive/2013/05/28/3103243.html 首先,前面几次学习已经学会了安装maven,如何创建maven ...

  5. Maven学习--- 搭建多模块企业级项目

    我们先在eclipse中新建一个maven项目,pom.xml的文件如下: 搭建多模块项目,必须要有一个packaging为pom的根目录.创建好这个maven项目后,我们对着项目右键-->ne ...

  6. maven搭建多模块企业级项目

    首先,前面几次学习已经学会了安装maven,如何创建maven项目等,最近的学习,终于有点进展了,搭建一下企业级多模块项目. 好了,废话不多说,具体如下: 首先新建一个maven项目,pom.xml的 ...

  7. Maven学习 (六) 搭建多模块企业级项目

    首先,前面几次学习已经学会了安装maven,如何创建maven项目等,最近的学习,终于有点进展了,搭建一下企业级多模块项目. 好了,废话不多说,具体如下: 首先新建一个maven项目,pom.xml的 ...

  8. [maven] 搭建多模块企业级项目

    知识点:聚合.继承.工程依赖.单元测试.多war聚合.cargo发布 ① 准备工作 参考资料 http://www.cnblogs.com/quanyongan/archive/2013/05/28/ ...

  9. 创建支持eclipse的多模块maven项目

    通过maven可以创建多个关联模块的项目(Multiple Module Projects).由一个总的模块,下面包含多个子模块(子模块还可以包含子模块). 这种maven功能能支持大型的项目构建,往 ...

随机推荐

  1. Biologically Inspired Reinforcement Learning: Reward-Based Decomposition for Multi-goal Environments

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 我们提出了一种基于情绪的分层强化学习(HRL)算法,用于具有多种奖励来源的环境.该系统的架构受到大脑神经生物学的启发,特 ...

  2. 调试 Ingress Nginx

    由于 Ingress Nginx 是最受欢迎的 Ingress 控制器,因此接下来我们将介绍一些有关调试 ingress-nginx 的技巧. 调试 Ingress Nginx Ingress-ngi ...

  3. 快速构建一个完整的Selenium框架

    今天跟大家细讲如何构建一个完整的selenium框架,当你学会了这一篇你就也可以说自己会selenium自动化测试了. 1.新建项目,结构如图: 注意:整个项目除了最外层的是文件夹,其他的都是包(pa ...

  4. python3中异常处理方法 try-except-else-finally

    个人感觉逻辑上类似if else条件判断 但这是对语法错误以及抛出异常的处理 异常处理 try/except 异常捕捉可以使用 try/except 语句. 以下例子中,让用户输入一个合法的整数,但是 ...

  5. go语言之反射

    ---恢复内容开始--- 一 :并发基础 1 并发和并行 并发和并行是两个不同的概念: 并行意味着程序在任意时刻都是同时运行的: 并发意味着程序在单位时间内是同时运行的 详解: 并行就是在任一粒度的时 ...

  6. 终于有架构师用401页PDF+194张图表把设计模式讲明白了

    十几年来,IT 界也发生了翻天覆地的变化,各种开源框架层出不穷,机器学习大兴其道.但是,在面向对象编程中,设计模式的重要性却不曾改变.与以前一样,在大规模的企业系统开发中,Java和C#仍处于主导地位 ...

  7. 同事跳槽阿里P7,甩我一份微服务架构设计模式文档,看完我也去

    给所有微服务架构开发者的忠告,我想对你们说: 第一,要记住微服务不是解决所有问题的万能“银弹”. 第二,编写整洁的代码和使用自动化测试至关重要,因为这是现代软件开发的基础. 第三,关注微服务的本质,即 ...

  8. Python爬虫实战点触验证码, 模拟登陆bilibili

    爬虫思路如下: 利用自动化爬虫工具 Selenium 模拟点击输入等操作来进行登录 分析页面,获取点触验证码的点触图片,通过将图片发送给超级鹰打码平台识别后获取坐标信息 根据超级鹰返回的数据,模拟坐标 ...

  9. 【转】LeakCanary

    LeakCanary:检测所有的内存泄漏 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0509/2854.html 原文: L ...

  10. selenium上手

    功能自动化 前提 自动化的主要目的并不是为了找Bug,是为了证明功能可用 不只是所有的功能都可以自动化,如UI 并不是所有的项目都可以使用自动化,如selenium只能使用bs项目,小项目不适合使用自 ...