开发工具用idea,用maven管理jar:
1.创建父级模块:file-new-project-maven-next,直接上图,项目名字包路径可修改,打包方式pom,具体配置最后贴上
2.创建子模块,右键父模块new-Module,(web模块与其他模块有区别),先web模块创建new-Module-spring initializr-next
2.1这里可以选适合自己,也可以不选,自己在pom.xml里面配置
3.其他子模块的创建,就比较简单的,两种方式都可以:
3.1继续选spring initializr,但不勾选web和sql
4.其他模块我就不一一创建了,跟上面3一致,都创建好以后项目结构如下
5.开始整理项目结构,删除多余的文件,带mvn的都删掉,还有个主模块的src,建红色标记,其他模块同理
6.各个模块的pom.xml,依赖关系,
父级只是管理整个模块,统一版本号,提供公共jar,打包方式pom
web控制层依赖service,domain,utils,连接前端和后端主要模块,数据库配置我也放这里,打包方式jar,也可以war
domain实体类模块,不依赖谁,可继承父模块,打包方式jar
service服务层依赖dao(mapper),domain,utils,打包方式jar
dao(mapper)依赖domain,打包方式jar
utils工具类模块,暂不依赖谁,可继承父模块,打包方式jar
6.1父级模块pom.xml,当然其中也可以不要
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>muchmodule</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式pom-->
<packaging>pom</packaging>
<!--管理的所有模块-->
<modules>
<module>service</module>
<module>domain</module>
<module>utils</module>
<module>dao</module>
<module>web</module>
</modules>
<!--指定项目的spring boot的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--统一配置所需jar的版本,方便管理-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<!--默认关掉单元测试 -->
<skipTests>true</skipTests>
<pagehelper.version>1.2.5</pagehelper.version>
<druid.version>1.1.9</druid.version>
<mysql-version>5.1.46</mysql-version>
<commons-lang3-version>3.4</commons-lang3-version>
<commons-pool2-version>2.5.0</commons-pool2-version>
<fastjson-version>1.2.47</fastjson-version>
</properties>
<!--只是声明依赖方便统一版本号,并不实现引入,因此子项目需要显示的声明需要用的依赖,子类不用加version除非插件-->
<dependencyManagement>
<dependencies>
<!--管理模块版本,这样其他模块引入就不用加版本号-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>utils</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>dao</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 分页插件pagehelper自动依赖mybatis -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3-version}</version>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<!-- 必须加上,jedis依赖此 -->
<!-- spring boot 2.0 的操作手册有标注 大家可以去看看 地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2-version}</version>
</dependency>
<!-- 将作为Redis对象序列化器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--指定项目中公有的依赖,所有的模块不管是否调用都自动添加-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
6.2web模块的pom
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>web</name>
<description>Demo project for Spring Boot</description>
<!--继承父模块,需要注意的是,这里要指定父模块pom.xml的相对路径-->
<parent>
<groupId>com.demo</groupId>
<artifactId>muchmodule</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--其他模块的依赖-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>utils</artifactId>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>domain</artifactId>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>service</artifactId>
</dependency>
<!--其他jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<!-- 分页插件pagehelper自动依赖mybatis ,service已引入-->
<!-- <dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>-->
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 没有该配置,devtools不生效 -->
<fork>true</fork>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.demo.WebApplication</mainClass>
</configuration>
<!-- <executions>
<execution>
<goals>
<goal>repackage</goal>可以把依赖的包都打包到生成的Jar包中
</goals>
</execution>
</executions>-->
</plugin>
<!-- 如果打包报没有web.xml,加上下面的插件 -->
<!--<plugin>
<artifactId>maven-war-plugin</artifactId>
</plugin>-->
<!-- mybatis generator 自动生成代码插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- 在pom中可以直接配置依赖的数据库 generatorConfig.xml就不需要再配置数据库的jar了 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
6.3domain
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>domain</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>domain</name>
<description>Demo project for Spring Boot</description>
<!--继承父模块,需要注意的是,这里要指定父模块pom.xml的相对路径-->
<parent>
<groupId>com.demo</groupId>
<artifactId>muchmodule</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
</project>
6.4utils
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>utils</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>utils</name>
<description>Demo project for Spring Boot</description>
<!--继承父模块,需要注意的是,这里要指定父模块pom.xml的相对路径-->
<parent>
<groupId>com.demo</groupId>
<artifactId>muchmodule</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
</project>
6.5dao
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>dao</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dao</name>
<description>Demo project for Spring Boot</description>
<!--继承父模块,需要注意的是,这里要指定父模块pom.xml的相对路径-->
<parent>
<groupId>com.demo</groupId>
<artifactId>muchmodule</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--其他模块的依赖-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>domain</artifactId>
</dependency>
</dependencies>
</project>
6.6service
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service</name>
<description>Demo project for Spring Boot</description>
<!--继承父模块,需要注意的是,这里要指定父模块pom.xml的相对路径-->
<parent>
<groupId>com.demo</groupId>
<artifactId>muchmodule</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--其他模块的依赖-->
<dependency>
<groupId>com.demo</groupId>
<artifactId>domain</artifactId>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>dao</artifactId>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>utils</artifactId>
</dependency>
<!-- 分页插件pagehelper自动依赖mybatis -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
6.6反向生成工具,
<?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>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
<!-- <classPathEntry location="D:\apache-maven-3.5.3\repository\mysql\mysql-connector-java\5.1.35\mysql-connector-java-5.1.35.jar"/>-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/test"
userId="root" password="123456">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.demo.domain" targetProject="../domain/src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="../dao/src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.demo.dao" targetProject="../dao/src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
6.7mysql创表语句:数据库是test
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(16) DEFAULT NULL,
`password` varchar(10) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
6.8自动生成
7.1.创建测试,先在utils建个结果集封装
package com.demo.utils;
import java.io.Serializable;
/**
* Created by Administrator on 2018/6/21.
*/
public class R<T> implements Serializable {
private static final int OK = 0;
private static final int FAIL = 1;
private static final int UNAUTHORIZED = 2;
private static final long serialVersionUID = -6373402751616512206L;
private T data; //服务端数据
private int status = OK; //状态码
private String msg = ""; //描述信息
public static R isOk() {
return new R();
}
public static R isFail() {
return new R().status(FAIL);
}
public static R isFail(Throwable e) {
return isFail().msg(e);
}
public R msg(Throwable e) {
this.setMsg(e.toString());
return this;
}
public R data(T data) {
this.setData(data);
return this;
}
public R status(int status) {
this.setStatus(status);
return this;
}
//Constructors
public R() {
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
7.2在mapper.xml和mapper,自己多加了个方式
<select id="selectAllUser" resultMap="BaseResultMap">
select <include refid="Base_Column_List" /> from user
</select>
//这个方式我自己加的
List<User> selectAllUser();
7.3service服务层
package com.demo.service;
import com.demo.domain.User;
import com.demo.utils.R;
import com.github.pagehelper.PageInfo;
/**
* Created by Administrator on 2018/6/18.
*/
public interface UserService {
R<Integer> addUser(User user);
PageInfo<User> findAllUser(int pageNum, int pageSize);
}
7.31实现类
package com.demo.service.impl;
import com.demo.dao.UserMapper;
import com.demo.domain.User;
import com.demo.service.UserService;
import com.demo.utils.R;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by Administrator on 2018/6/18.
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public R<Integer> addUser(User user) {
R<Integer> result = new R<Integer>();
Integer insertNum = userMapper.insertSelective(user);
if(insertNum>0){
result.setStatus(0);
}else{
result.setStatus(1);
}
result.setData(insertNum);
return result;
}
@Override
public PageInfo<User> findAllUser(int pageNum, int pageSize) {
//将参数传给这个方法就可以实现物理分页了,非常简单。
PageHelper.startPage(pageNum, pageSize);
List<User> user = userMapper.selectAllUser();
PageInfo result = new PageInfo(user);
return result;
}
}
7.4web控制层
package com.demo.controller;
import com.demo.domain.User;
import com.demo.service.UserService;
import com.demo.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by Administrator on 2018/6/18.
*/
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/add", produces = {"application/json;charset=UTF-8"})
public R<Integer> addUser(User user){
user= new User();
user.setPhone("133443545");
user.setPassword("123443");
user.setUserName("用户名");
return userService.addUser(user);
}
@GetMapping("/all")
public Object findAllUser(@RequestParam(name = "pageNum", required = false, defaultValue = "1") int pageNum,
@RequestParam(name = "pageSize", required = false, defaultValue = "10") int pageSize){
return userService.findAllUser(pageNum,pageSize);
}
}
7.5还少了个配置,我用的ym方式
server:
port: 8080
spring:
datasource:
name: mysql_test
type: com.alibaba.druid.pool.DruidDataSource
#druid相关配置
druid:
#监控统计拦截的filters
filters: stat
driver-class-name: com.mysql.jdbc.Driver
#基本属性
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=true
username: root
password: 123456
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
mybatis:
mapper-locations: classpath:mapping/*.xml
type-aliases-package: com.demo.domain
#pagehelper
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
7.6主启动类,把mapper加进去
package com.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.demo.dao")//将项目中对应的mapper类的路径加进来就可以了
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
8直接启动,由于直接跳过了test,多种启动方式,也可以用命令启动,个人喜欢debug模式
8.1出现以下就表示启动成功,端口是默认是8080
8.2直接在浏览器输入:
1,新增user接口:http://localhost:8080/user/add
2.查询user接口:http://localhost:8080/user/all