一起学SpringBoot

一个由 SpringBoot 和 MyBatis 以及结合PageHelper插件, 用freemarker模板引擎进行展示的小例子.

项目已经传到gitHub上了: 项目的github地址

前言:

写Java后台也很久了,在没有学SpringBoot之前一直在用SSM (Spring, SpringMVC, MyBatis), 但是自从几个月前试了下SpringBoot之后, 发现对比之下, SSM的乱七八糟的配置, 让我觉得真的恶心, 虽说只要写过一次SSM项目, 那些配置可以重复使用, 但是我还是不喜欢这样重复的做着某个过程, 正如SpringBoot这种微服务的理念, 有着 约定大于配置 的主旨, 真的, 用过一次真的觉得很棒, 极简的配置, 自带的web容器和快速构建和部署后台项目.

涉及的技术

  1. SpringBoot
  2. Mybatis
  3. PageHelper插件
  4. Freemarker
  5. Semantic-UI
  6. 最后用maven进行快速构建项目(解决项目依赖以及打包问题).

还是老规矩咯–先看效果图


运行项目的注意事项:

  1. 该项目的中所用的数据是我用Python在赶集网上爬的房源数据, 大约爬了580条左右, 然后批量导入我的数据库中(这里用的是mysql), 为了方便大家测试运行, 我从我的本地mysql数据库中已经将该项目的dataBase备份了出来. 该文件为 ganjiDB.sql 同样的也一并传到git上了,

    mysql备份命令:

    mysqldump -u root -p ganjiDB> ganjiDB.sql

  2. 如何导入ganjiDB.sql到你自己本地的数据库呢?

    1. 先登录你的数据库
      mysql -u root -p
    1. 输入密码
    1. 创建数据库
      create database ganjiDB;
    1. 退出数据库 exit;
    1. 导入数据库: mysql - u root -p ganjiDB < ganjiDB.sql
    1. 注意第五步的要在ganjiDB.sql所在的目录进行. 导入完毕.

最后一定要注意的是,如果要运行此项目, 要将该项目的配置文件中数据库配置密码那里修改为你的数据库密码. 具体看下面application.yml文件.

正式开始—创建项目

  1. 这里选择spring initializr 其他默认即为SpringBoot

  2. 这里给项目命名, 选择构建工具类型(可以选择Gradle), 该项目我们选择Maven. 指定jdk版本, 以及一些项目描述等信息.

  3. 这里选择项目的依赖, 因为该项目是web的项目, 所以肯定是要选择web的(里面会自动下载一个web应用所必须要用到的依赖.), 其他的在这也可以选择, 比如Mybatis, 不过也可以创建后再在maven中的pom.xml文件中自己手动添加, 我们这里就只勾选了一个web.

  4. 最后就是项目的位置, 然后Finish, 等带maven的构建. 如果这步卡了很久不成功, 可能是你maven的mirro镜像还是默认国外的, 所以修改下maven的配置吧,(这里就不展开了, 网上很多的).

  5. maven构建完了之后, 会创建一个java文件夹(这里就存放我们项目的源代码的地方), 还要一个很重要的文件pom.xml解决项目依赖的问题, 不过Maven也很强大的, 有它自己的一套生命周期, 如常用的 mvn clean, mvn package等. 不过说句实话, 通常我们最常用的maven功能就是解决项目的jar包依赖 = =


……睡了一觉之后 = =

项目结构图

这里说下项目的配置文件

项目默认的配置文件是 application.properites, 由于默认的配置文件格式不是太好用, 这里推荐 application.ymlyml格式的配置文件,(具体如何好用, 这里不多说了, 反正大家都说好用😜😜😜)

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
# 配置项目的端口号和上下文
server:
port: 8888
context-path: /daejong


# 配置数据源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ganjiDB?characterEncoding=utf-8&useSSL=false
username: root
# 注意在你本机上运行时要修改成你的数据的密码
password: daejong

freemarker:
#关闭缓存
cache: false
request-context-attribute: request
#模板加载的位置
template-loader-path: classpath:/templates
#前缀
suffix: .html
#后缀
prefix: /

mybatis:
#实体类所做包, 省去了再mapper.xml中的type前
type-aliases-package: com.daejong.entity
#mapper.xml所在位置
mapper-locations: classpath:mappers/*.xml

项目的入口文件: SbMyBatisApplication

这里只要千万注意的是: 该入口文件要放在根所在的包中, 因为程序启动的时候, 会自动扫描识别注解(@Controller, @Configuration, @Autowired, @Service等注解), 这样你在项目中配置的注解才会起效果.

还有跟Spring有点不同的是@RestController注解是一个组合注解,是@Controller和@ResponseBody合并注解, 这里有必要提下, 当前想要返回一个页面的时候, 而不是json数据, 这里你就要用@Controller注解, 因为一旦是@RestController就会将你返回的字符串当前json格式的文本字符串返回了, 那么就不会解析成templates下的页面所对应的名字了.

项目中一些常量和状态码推荐用枚举enum来写, 很直观明了.

有人或许问@Data @Getter 什么意思.

这里介绍个小工具, lombok(一个小岛的名字), 它可以减少代码量, 帮你在编译时自动生成好多东西(构造函数, setter, getter, toString方法)哦.

注意要在pom.xml中添加依赖



ResultVO(传入泛型)是对返回的json数据的通用封装工具.


ResultVoUtil是对返回结构的通用封装的工具.

freemarker页面编写.

这里用到了前端的一个框架semantic-ui, 推荐下, 很好用哦, 具体可以参考我之前的博客.

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页查询</title>
<link href="https://cdn.bootcss.com/semantic-ui/2.2.13/semantic.min.css" rel="stylesheet">
</head>
<body class="ui container" style="margin-top: 50px;">

<div class="ui secondary menu">
<h1>分页查询示例</h1>
<div class="right menu">
<a class="ui item" href="/daejong/hc/page?page=1">首页</a>
<a class="ui item" href="/daejong/hc/page?page=${pageInfo.hasPreviousPage?string('${pageInfo.prePage}' ,'${pageInfo.pageNum}')}">上一页</a>
<a class="ui item" href="/daejong/hc/page?page=${pageInfo.hasNextPage?string('${pageInfo.nextPage}' ,'${pageInfo.pageNum}')}">下一页</a>
<a class="ui item" href="/daejong/hc/page?page=${pageInfo.pages}">末页</a>
</div>
</div>
<div class="ui divider"></div>
<div style="text-align: right">
<h3><span class="ui red label">${pageInfo.pages}</span>页/当前为: <span class="ui red label">${pageInfo.pageNum}</span></h3>
</div>
<table class="ui selectable celled striped table center aligned">
<thead>
<tr>
<th>名称</th>
<th>价格</th>
<th>位置</th>
<th>详细信息</th>
</tr>
</thead>
<tbody>
<#list list as houseEntity>
<tr>
<td>${houseEntity.houseName}</td>
<td>${houseEntity.price}</td>
<td>${houseEntity.houseLocation}</td>
<td><a href="${houseEntity.url}" target="_blank">${houseEntity.url}</a></td>
</tr>
</#list>
</tbody>
</table>
</body>
</html>

其他就是一些通用的mvc设计模式的套路, service层, model, controller, 还要一些异常等等, 不过由于项目仅作为示例而已, 这里也阉割了好多(本来应该有VO, TO),这里我就直接用的DO一并处理了.

不得不说的单元测试.

其实写项目最重要的一点就是写一个service或者controller就要对该类进行单元测试. 这里就不一一细说了哈.

还有springboot的打包部署运行的几种方式.

如 mvn clean package; java -jar xxxxx.jar等方式, 读者自己慢慢摸索吧!

好了, 就说这么多吧, 具体的看github上的项目源码,