0x01 创建项目
0x01 打开idea 点击 创建新项目
0x02 创建方式选择
选择 “Spring Initializr” jdk1.8默认即可 然后点击下一步
0x03 完善项目信息
Group = 组名
Artifact = 项目名
Group 一般写公司名
ArtifictId 一般写项目名
例如我图中 Artifact = demo
那么最终目录结构就是 src->main->java->com->example->demo
点击下一步
0x04 选择组件
SpringBoot版本选择2.5.1
Web 选择 (Spring Web)
Template Engines 选择 (Thymeleaf)
SQL 选择 (JDBC API, MySQL Driver, MyBatis Framework)
然后选择下一步
0x05 项目名与存放位置确定
项目名: SpringBootDemo
选择好以后点击 完成 按钮
请注意第一次加载的时候因为要下载资源所有会很慢,请等待!!!
0x06 刚创建好的项目目录结构
如果等了很久也没有自动导包,可以点击右边的 Maven按钮
里面有个重新导包功能 与 重新下载包 的功能
如下图
0x07 测试的数据库 - 测试数据
这里我创建了一个test数据库
里面有一个 user表
字段为 id, username, password
0x08 SpringBoot项目分层
SpringBoot项目大概分为四层:
Controller层:
所有请求的入口,前后端交互的入口
一般会在项目根路径创建一个文件夹:
controller 文件夹 (存放XxxController.java)
Service层:
也叫服务层 或是 业务层,负责所有的业务逻辑
例如: XxxService.java(业务接口类) XxxServiceImpl.java(业务实现类)
一般会在项目根路径创建两个文件夹:
service 文件夹 (存放XxxService.java)
serviceImpl 文件夹 (存放XxxServiceImpl.java)
Mapper层 或是叫 DAO层:
持久层,负责java和数据库交互
包括 interface 和 xml 两类文件
例如: XxxMapper.java(数据库访问接口类) XxxMapper.xml(数据库链接实现)
一般会创建两个文件夹:
项目根路径创建(存放XxxMapper.java):
mapper 文件夹
项目resources文件夹下创建(存放XxxMapper.xml):
mapper 文件夹
Bean层 或是叫 Model层 在或是 Entity层:
就是数据库表的映射实体类,存放POJO对象
这里我习惯叫 Bean层 所以我创建的文件夹叫 bean 文件夹
一般会在项目根路径创建一个文件夹:
bean 文件夹(存放XxxBean.java)
依照上面四层,创建目录结构如下:
0x09 修改 application配置
# 查看resources文件夹 里面的 application.properties 修改为 application.yml
# application.yml配置文件内容
# 注意:
# 按照实际情况改即可
# 记得要确定可以连接,不然启动的时候项目会爆错
# 192.168.24.129:3306/test 的含义
# 192.168.24.129 mysql连接地址
# 3306 mysql连接端口
# test mysql连接的数据库
server:
# 访问地址
address: 127.0.0.1
# 访问端口
port: 8081
spring:
# 数据库配置
datasource:
# mysql连接地址
url: jdbc:mysql://192.168.24.129:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 用户名
username: root
# 密码
password: 123456
# 数据库链接驱动
driver-class-name: com.mysql.jdbc.Driver
# mybatis配置
mybatis:
# 指定sql映射文件位置,mapper下的所有.xml文件都是映射文件
mapper-locations: classpath:mapper/*.xml
# 数据库表的映射实体类存放位置,存放POJO对象
type-aliases-package: com.example.demo.bean
0x10 修改 pom.xml配置
# 打开pom.xml
搜索 <artifactId>mysql-connector-java</artifactId>
然后修改为
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
搜索 <artifactId>mybatis-spring-boot-starter</artifactId>
然后修改为
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
如果嫌弃麻烦的话,也可以使用我下面这个修改好的pom.xml
# 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 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.5.1</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--thymeleaf模板引擎配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--Web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MyBatis配置-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--MySQL数据库配置-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!--单元测试配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
0x11 创建启动的初始页面
在resources 里面的 templates文件下新建index.html页面,作为启动的初始页面
# resources文件夹 下面的 templates文件夹 里面的 index.html界面源码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
我是一个初始的SpringBoot展示界面
</body>
</html>
0x12 创建 HelloController测试类
# HelloController.java 源码
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/Hello/index")
public String index(){
return "h_index";
}
}
# h_index.html 源码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
我是控制器 HelloController 下的 index 方法
</body>
</html>
0x13 运行项目启动类
在浏览器中输入 http://127.0.0.1:8081
0x02 使用IDEA连接数据库
点击右侧边框的Database
点击“加号”新建数据库连接
找到配置 serverTimezone(时区) 填写进入 Asia/Shanghai
如下图:
0x03 SpringBoot基本例子
0x03.1 @ResponseBody - 例子
# 解释
一般在使用@RequestMapping后,返回值通常解析为跳转路径
如果@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body
这个就是它的作用
# 新建个 TestController.java 然后添加一个方法
# 代码如下:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
// 方法直接返回字符串-测试
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "Hello World !!!";
}
}
0x03.2 在Controller中获取application.yml的值 - 例子
# 新建个 Test2Controller.java 然后添加一个方法
# 代码如下:
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class Test2Controller {
// 获取某个配置文件的值-测试
@Value("${spring.datasource.username}")
private String dbusername;
// 方法直接返回字符串-测试
@RequestMapping("/test2")
@ResponseBody
public String test() {
return dbusername;
}
}
0x03.3 页面赋值 - 例子
# 新建个 Test3Controller.java 然后添加一个方法
# 代码如下:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Test3Controller {
// 页面赋值-测试
@RequestMapping("/test3")
public String test(Model model) {
model.addAttribute("name", "小明");
model.addAttribute("age", 24);
model.addAttribute("info", "我是一个爱打机的青年");
return "test3";
}
}
# 接着在resources 里面的 templates文件下新建 test3.html页面
# 用来接收赋值
# 代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test3</title>
</head>
<body>
姓名:<input type="text" th:value="${name}"><br/>
年龄:<input type="text" th:value="${age}"><br/>
简介:<input type="text" th:value="${info}"><br/>
</body>
</html>
0x04 其它例子: 登录功能
0x04.1 生成Bean实体类
# 依据 user数据表,生成set和get方法
# bean 目录创建个 UserBean.java
# 注意: 在application配置文件中mybatis:type-aliases-package:(对应的就是该文件地址)
package com.example.demo.bean;
public class UserBean {
private int id;
private String username;
private String password;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
0x04.2 Mapper层-生成数据库接口
# mapper 目录创建个 UserMapper.java
package com.example.demo.mapper;
import com.example.demo.bean.UserBean;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
UserBean getInfo(String username, String password);
}
0x04.3 Mapper层-生成数据库实现文件
# resources目录下面的 mapper 目录里 创建一个文件叫做 UserMapper.xml
# 注意: 在application配置文件中mybatis:mapper-locations:(对应的就是该文件地址)
# mybatis:mapper-locations == 指定sql映射文件位置,resources目录mapper下的所有.xml文件都是映射文件
# 注意namespace 与 resultType 要填写对应好,不然会爆绑定失败
<?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.example.demo.mapper.UserMapper">
<select id="getInfo" parameterType="String" resultType="com.example.demo.bean.UserBean">
SELECT * FROM user WHERE username = #{username} AND password = #{password}
</select>
</mapper>
0x04.4 Service层-生成业务接口
# service 目录创建个 UserService.java
package com.example.demo.service;
import com.example.demo.bean.UserBean;
public interface UserService {
UserBean loginIn(String username,String password);
}
0x04.5 Service层-生成业务实现接口
# serviceImpl 目录创建个 UserServiceImpl.java
package com.example.demo.serviceImpl;
import com.example.demo.bean.UserBean;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public UserBean loginIn(String username, String password) {
return userMapper.getInfo(username,password);
}
}
0x04.6 项目启动类添加@MapperScan注解
# src.main.java.com.example.demo 这个根目录下的 DemoApplication.java 文件
# 修改为如下:
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
0x04.7 编写单元测试类
# 编写一个单元测试类,查询看看是否可以调用刚刚写的方法,从数据库获取数据
# DemoApplicationTests.java 文件
# 源码如下:
package com.example.demo;
import com.example.demo.bean.UserBean;
import com.example.demo.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Autowired
UserService userService;
@Test
public void contextLoads() {
UserBean userBean = userService.loginIn("admin","admin123");
if (userBean != null) {
System.out.println("该用户输入账号为: " + userBean.getUsername());
System.out.println("该用户输入密码为: " + userBean.getPassword());
System.out.println("返回的用户ID为: " + userBean.getId());
} else {
System.out.println("账号或是密码错误!");
System.out.println("查询不到该用户");
}
}
}
0x04.8 Controller层-生成对应的业务接口
# controller 目录创建个 PublicController.java
package com.example.demo.controller;
import com.example.demo.bean.UserBean;
import com.example.demo.service.UserService;
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 PublicController {
// 将Service注入Web层
@Autowired
UserService userService;
@RequestMapping("/public/login")
public String login() {
return "login";
}
@RequestMapping(value = "/password/login", method = RequestMethod.POST)
@ResponseBody
public String passwordLogin(String username, String password) {
UserBean userBean = userService.loginIn(username, password);
if (userBean != null) {
return "login_success";
} else {
return "login_error";
}
}
}
0x04.9 创建登录界面
# 在resources 里面的 templates文件下新建login.html页面
# login.html 源码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form role="form" action = "/password/login" method="post">
账号:<input type="text" id="username" name = "username"> <br>
密码:<input type="password" id = "password" name = "password"> <br>
<input type="submit" id = "login" value = "login">
</form>
</body>
</html>
0x04.10 启动测试
打开:http://127.0.0.1:8081/public/login