0%

SpringMVC转SpringBoot项目

数据库的准备

连接服务器

使用XShell或者命令行都可以
命令行如下:

1
ssh [user@]host[:port]

单个数据库表和结构导出

1
mysqldump -u[user] -p [database] > [filename.sql]

输入密码然后把sql文件复制到本地。

Docker配置

安装Docker的教程不在赘述,为了更好的团队开发,在服务器配置数据库比较好。
启动msql容器,并建立端口映射,原先的MySQL服务可以不用停止

1
docker run --name [mysql-container-name] -p [主机端口]:[容器端口] -e MYSQL_ROOT_PASSWORD=[password] -d mysql:5.7

mysql-container-name 设置为 some-mysql
记得把配置的主机端口开放了

导入数据库

远程登录docker上的MySQL

  • 建库
    1
    2
    3
    CREATE DATABASE `bmbhome` CHARACTER SET UTF8;
    USE `bmbhome`;
    SOURCE /home/len/bmbhome/bmbhome.sql
    这里我遇到了一个问题

ERROR:

Failed to open file ‘\home\len\bmbhome\bmbhome.sql’, error: 2

Stack Overflow上的解决方案都不起效,
换环境远程登录也不行,
但是给了我个思路:路径问题,我把sql文件放在了root下,嘿!得了!

1
SOURCE bmbhome.sql

备份数据库

1
docker exec [mysql-container-name] /usr/bin/mysqldump -u [user] --password=[password] [database-name] > [backup-file-name]

由于我们是通过sql文件建的库,保存好sql文件就好了。

Java版本:Oracle jdk8
IntelliJ IDEA lombok插件

项目准备

初步整理

  • 建立分支
    1
    2
    3
    git clone ssh@xxxxxxx
    cd [项目目录]
    git checkout -b dev
  • 删除不必要文件
    1
    git rm .DS_Store
    这个是macOS的隐藏文件,没用的,删掉
  • 删掉src
    不删除跟踪,因为等下重建的时候直接在这个目录下建立

    建立项目

  • 删除不必要的文件(夹)
    • .mvn
    • mvnw
    • mvnw.cmd
  • 跟踪所有
    在确定不需要添加进git仓库的文件(夹)在.gitignore里面后,跟踪所有文件
    1
    2
    git add .
    git ls-files
  • 熟悉的同学可以直接选插件,这里手工导入
    pom.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <?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.3.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.len</groupId>
    <artifactId>bmbhome</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bmbhome</name>
    <description>bmbhome</description>

    <properties>
    <java.version>1.8</java.version>
    </properties>

    <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>
    <exclusions>
    <exclusion>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <!--Freemarker-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    <!--Spring Web-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--MySQL-->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    </dependency>
    <!--MyBatis Plus-->
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1.tmp</version>
    </dependency>
    <!--lombok-->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    </dependency>
    <!--代码生成器-->
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1.tmp</version>
    </dependency>
    </dependencies>


    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

    </project>

配置文件

先配置这么多,后面上传文件还有弄classpath

application.properties
1
2
3
4
5
6
7
8
9
10
11
12
# 端口
server.port=2333
# MySQL配置 因为连接的MySQL是5.7,所以不需要cj,时区参数不用加
spring.datasource.url=jdbc:mysql://39.97.171.86:7777/bmbhome?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=520520fzy
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# Freemarker配置
spring.freemarker.template-loader-path=classpath:/templates
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.suffix=.ftl

代码生成器

因为MySQL的时间戳类型被转为java.time.LocalDateTime
时间格式中有个T,所以我想把它变成java.lang.String类型

不选择表名就是默认所以表

CodeGenerator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.len.bmbhome;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

public class CodeGenerator {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();

// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("wei");
gc.setOpen(false);
gc.setFileOverride(true);
gc.setIdType(IdType.NONE);
mpg.setGlobalConfig(gc);

// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://39.97.171.86:7777/bmbhome?useUnicode=true&characterEncoding=utf8");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("520520fzy");
//将时间戳换成String类型
String timestamp = "timestamp";
dsc.setTypeConvert(new MySqlTypeConvert() {
@Override
public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
if (fieldType.toLowerCase().contains(timestamp)) {
return DbColumnType.STRING;
}
return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
}

});
mpg.setDataSource(dsc);

// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("");
pc.setParent("com.len.bmbhome");
pc.setMapper("mapper");
pc.setEntity("entity");
mpg.setPackageInfo(pc);


// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setService(null);
templateConfig.setController(null);
templateConfig.setXml(null);
templateConfig.setServiceImpl(null);
mpg.setTemplate(templateConfig);

// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(false);
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());

mpg.execute();
}
}

启动!

编写测试类

@Autowired的参数是让它忽略报错的,不影响使用(编译时自动装配),但看着烦

可以像这样加参数,也可以在对应的mapper添加@Repository注解,如果mapper少还可以,可是这个项目有六十多个…

会有个下划波浪线提示

Field injection is not recommended

因为这个注入方式不推荐,但是它代码最少啊,其他的↓

Link

还可以这么操作:

我选择取消警告

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.len.bmbhome.controller;

import com.len.bmbhome.entity.BmbAdmin;
import com.len.bmbhome.mapper.BmbAdminMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

@Autowired(required = false)
BmbAdminMapper bmbAdminMapper;

@ResponseBody
@RequestMapping(value = "/get",method = RequestMethod.GET)
public BmbAdmin getById(int id){
return bmbAdminMapper.selectById(id);
}

}

Sevice包整理

将原来的XxxRepository和XxxDao转化为对应的mapper

然后在Mapper添加@Repository注解

将原来的XxxEntity改为entity包下对应的类

根据编译器的提示挨个添加方法

原来使用的是JPA接口,一些方法可以直接用BaseMapper对应,其他的对应不上的,先看旧版本(old分支)的源码,再改

  • delete
    可以用deleteById替换

  • findOne
    可以用selectById替换

  • update之类:
    可以替换成updateById,入参为实体类

  • saveAndFlush
    输入图片说明
    这个可以根据Mybatis Plus的这个CRUD接口实现
    输入图片说明

使用请参照官方文档

简单说就是 Service 继承 IService<对应entity>,然后 ServiceImpl 继承 ServiceImpl<对应entity的Mapper, 对应entity>

Mapper整理

要使用动态SQL语句,要在原语句的基础上添加<script></script>标签。
如:

1
@Select({"<script>" + "需要处理SQL语句" + "</script>"})

<if>标签

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
String SELECT = "SELECT\n" +
" a.id,\n" +
" a.title,\n" +
" a.typeId,\n" +
" a.typeText,\n" +
" a.imgUrl,\n" +
" a.author,\n" +
" d.NAME,\n" +
" a.createTime,\n" +
" a.readCount \n" +
"FROM\n" +
" bmb_article a,\n" +
" bmb_doctor d \n" +
"WHERE\n" +
" a.author = d.id \n";

String LIMIT = " limit 0,10";

@Select({"<script>" +
SELECT +
"<if test='type!=0'>" +
"and a.typeId=#{type}\n" +
"</if>" +
"ORDER BY\n" +
"\ta.createTime DESC" +
LimitString.limit +
"</script>"})
List<ArticleBean> getNewPageArticles(int page, int pageNum, int type);

比如这个,我想根据入参决定是否添加条件

        "<if test='type!=0'>" +
        "and a.typeId=#{type}\n" +
        "</if>" +

type是我的入参,test是条件判断,如果test为真,<if></if>中间的语句就会生效

<bind>标签

在分页查询中,是不能使用运算符号的,我们可以利用<bind>标签处理:

SELECT语句还是上面的语句,
把LIMIT改一改:

1
2
3
4
5
package com.len.bmbhome.service;

public class LimitString {
public static final String limit = "<bind name='begin' value='page*pageNum'/> limit #{begin},#{pageNum}";
}

因为这个变量使用的多了,我们直接把它弄成全局变量,value中的page和pageNum是入参,然后把value赋值为begin这个变量名,把它当做新的入参局就可以了

请注意,使用到这个标签的时候也要<script></script>标签
别忘了bind最后有个”/“

-----------看到底线啦 感谢您的阅读-------------