Spring Boot+Jpa(MYSQL)做一个登陆注册系统(前后端数据库一站式编程)
Spring Boot最好的学习方法就是实战训练,今天我们用很短的时间启动我们第一个Spring Boot应用,并且连接我们的MySQL数据库. 我将假设读者为几乎零基础,在实战讲解中会渗透Spring框架中的一些知识点,并提供相关官方文档链接, 让我们一起在实战中高效学习。
在这个实战学习中, 我们将使用Spring Boot与MySQL数据库构建一个简单的登陆系统,功能包含注册账户和登陆两个功能,并用Spring Boot官方推荐使用的thymeleaf模板来生成简单的前端页面。 我们将使用Spring Boot与MySQL数据库构建一个简单的登陆系统,功能包含注册账户和登陆两个功能,并用Spring Boot官方推荐使用的thymeleaf模板来生成简单的前端页面。
看完该文章, 你将学会:
- 使用MySQL shell工具连接到MySQL server, 创建一个用户, 并创建一个数据库.
- 学习在Spring中配置并连接到你的MySQL数据库.
- 学习并掌握Jpa的Entity, Repository的使用方法.
配置MySQL数据库
第一步我们需要将MySQL数据库下载到电脑里, 下载地址: 下载MySQL完整工具包
在页面中点击红线框住的部分:

点进去, 拉到页面下方, 点击红框部分右侧的download:

下载后, 按照安装包提示的步骤操作, 安装完毕后, 你会获得几个新应用, 我们只用其中一个, 它是:

它是MySQL的命令行工具, 我们用它来操作我们的MySQL数据库.
但是我们不直接点开它, 我们在Windows自带的Command Prompt中使用它.
- 打开Command Prompt, 输入:
mysql -u root -p
进入Mysql命令行工具, 会提示你输入密码:

输入在安装过程中设置的密码, 进入mysql命令行工具.
- 创建一个MySQL用户, 在命令行中输入命令(其实是SQL语句):
CREATE USER 'niudai'@'localhost' IDENTIFIED BY 'niudai';
这个语句的目的是创建一个用户名为'niudai', 登陆密码为'niudai'的MySQL数据库管理员, 用这个账号可以管理我们的数据库, 也就是说如果你要管理数据库, 你必须要有这么一个账号.
- 再输入如下语句:
CREATE DATABASE springdb;
熟悉SQL语言的同学应该很熟悉上面这句, 就是创建一个名为springdb的数据库, 这个数据库就是我们的Spring Boot应用要连接的.
- 赋予刚创建的用户名为"niudai"的用户管理
springdb数据库的所有权限:
GRANT ALL ON springdb.* TO 'niudai'@'localhost';
创建一个Spring Boot应用
https://start.spring.io/这是Spring官网的依赖,把你所需要的依赖打包下载到本地,然后用idea打开即可。
我们所需要的四个依赖, 全是Spring Boot官方支持的库, 知识点讲解:
Thymeleaf是现代服务端的Java模板引擎, 我们用它来生成HTML页面.JPA是Java Persistence API, 也就是Java持久层API, 它的本质是一套将Java的对象映射到数据库中的关系表的标准, 而Spring-Boot的JPA依赖包含一个重要子依赖, 你一定听过它的名字:Hibernate. 它是JPA的具体实现, 也是Spring Boot的默认JPA实现.官方文档相关知识点阅读MySQL是用来实现从Java到MySQL连接的一个中间件.Web是Spring Boot重要核心组件, 网络应用的必须品, 它包含了Tomcat容器,Spring MVC等核心组件.
所以我们也可以看到Spring Boot其实相当于一个依赖打包器, 比如网络模块, 大家都需要Tomcat容器, 也需要Spring MVC框架, 那索性就放到一个包里, 也就是Web包, 这样一个依赖就解决了问题.
配置application.properties文件
application.properties文件的作用有点类似于pom, 但也不太一样, pom是管理你应用和其他库的依赖关系,
而application.properties则是去设置, 或是配置这些依赖, 是Spring应用的重要组成部分.
该文件可以在maven工程的src/main/java/resources/applicatio.properties下找到.
在该文件中输入如下属性:
spring.datasource.username=niudai
spring.datasource.password=niudai
spring.datasource.url=jdbc:mysql://localhost:3306/springdb
spring.jpa.hibernate.ddl-auto=create
讲解:
第三行的url就是我们数据库的地址, 3306是MySQL默认的本地端口, 而springdb正是我们之前创建的数据库.
第一行和第二行声明了我们之前创建的用户名密码和账户名, 都为niudai
第四行的create为开发模式, 就是每次应用启动都重新创建一个新表, 原有的表会清空, 开发结束后可以将其设置为none.
声明了这些之后, 启动应用后, Spring会自动用上述的信息连接并登陆你的MySQL中名为springdb的数据库.
创建你的Entity(编写代码开始)
什么是Entity呢? 说白了就是会被映射到数据库中的Java Object, 比如我们将要创建的User类.
在src/main/java/下创建一个文件User.java :
package org.springframework.gsloggingdatamysql;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
private String email;
private String password;
@Override
public String toString() {
return "{" +
" id='" + getId() + "'" +
", name='" + getName() + "'" +
", email='" + getEmail() + "'" +
", password='" + getPassword() + "'" +
"}";
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
加了@Entity注解, Spring框架会得知这个类是一个Entity, Hibernate会把这个类映射到数据库中的关系表, 这个关系表的列与User的所有属性一一对应.
相当于SQL语言中的:
CREATE TABLE User(id int, name varchar(255), email varchar(255), password varchar(255));
创建UserRepository
如果说User代表每个用户, 或是用户的信息, 那么UserRepository就代表储存这些用户的"库", 我们创建一个UserRepository.java, 注意它是一个接口, 也就是Interface, 而不是Class. 继承JpaRepository接口也可以。
package org.springframework.gsloggingdatamysql;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Integer> {
List<User> findByEmail(String email);
void deleteByEmail(String email);
}
你可能会疑惑这只是一个接口, 并没有具体实现, 如何完成对User信息的储存, 但事实上你只需声明这个接口, 剩下的交给Spring, 它会自动为你进行它的实现.
该类继承了CrudRepository, 也就是支撑"增删改查"的一个Repository, 你可以在别的地方直接调用这个接口的方法, 方法名有规范, 比如你想通过邮箱查找, 那你就使用findByEmail(String email)方法, Spring会自动帮你将findByEmail转换成SQL语言中的`SELECT * FROM UserRepository WHERE email = 'email'
创建你的UserController
Controller是接受用户的url请求, 将url映射到某个具体的方法, 处理url请求, 再返回一个Model的东西, 是Spring MVC中的C层.
知识点: Spring MVC中的三层分别是Model, View, Controller. 当用户向你的服务器发送了请求后, 比如HTTP请求, Controller先将请求映射到某个方法上, 方法根据该请求进行相应处理, 返回Model, 这个Model可以被理解成一个抽象的数据模型, 它储存了网页必须包含的信息, 但是它不是网页本身, Model会被送到View层, 也就是用户界面层, View层将自己本身的模板和Model内部的数据结合成为完整的一个页面, 作为response返还给用户, 用户便看到了你的页面,.
但是现在随着前后端的分离, View层的意义已经不大,作为后端开发, 主要专注于Model和Controller.
创建一个文件: UserController.java:
package org.springframework.gsloggingdatamysql;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserRepository userRepository;
@GetMapping(path="/add") // Map ONLY GET REQUESTs.
public @ResponseBody String addNewUser (@RequestParam String name
, @RequestParam String email, @RequestParam String password, User user) {
// @ResponseBody means the returned String is a response, not a view name.
user.setName(name);
user.setEmail(email);
user.setPassword(password);
userRepository.save(user);
log.info(user.toString()+" saved to the repo");
return "Saved";
}
/**
* 登陆方法, 用户输入邮箱和密码, 查询数据库检验是否有该账户,如果有,
* 返回原先页面 ,登陆成功。
* @param email 用户邮箱
* @param password 用户密码
* @param model Spring MVC中的Model,用来储存经过controller处理后的信息,再由View层渲染
* 得到前端页面。
* @return
*/
@GetMapping(path = "/login")
public String login(@RequestParam String email, @RequestParam String password, Model model) {
List<User> users = userRepository.findByEmail(email);
// 如果数据库中未查到该账号:
if (users == null) {
log.warn("attempting to log in with the non-existed account");
return "该用户不存在";
} else {
User user = users.get(0);
if (user.getPassword().equals(password)) {
// 如果密码与邮箱配对成功:
model.addAttribute("name", user.getName());
log.warn(user.toString()+ " logged in");
} else {
// 如果密码与邮箱不匹配:
model.addAttribute("name", "logging failed");
log.warn(user.toString()+ " failed to log in");
}
return "index";
}
}
/**
* 查看所有用户的注册信息,按照Spring Boot的设定,以Json的形式输送给用户端。
* @return
*/
@GetMapping(path="/all")
public @ResponseBody Iterable<User> getAllUsers() {
return userRepository.findAll();
}
/**
* 域名的根目录,然后返回的“index”会映射到
* java/resources/templates/index.html文件。
* @param name
* @return
*/
@GetMapping(path="/")
public String welcomePage(@RequestParam(name="name", required=false, defaultValue="World")
String namel){
return "index";
}
}
知识点讲解:
@AutoWired被注有它的注解会被Spring得知,Spring会自动为你注入依赖. 比如上述的userRepository,Spring在运行过程中会通过IoC容器为你注入一个UserRepository的实例给userRepository. 相关知识点:依赖注入、设计模式.@GetMapping将使用Get方法的HTTP请求映射到被注的方法. 相关知识点:HTTP请求,HTTP方法.@RequestParam将HTTP请求中用户传入的参数映射到变量中括号内指定变量中. 相关知识点:HTTP参数@ResponseBody它表示该方法返回的值就是Response本身, 不需传递至View被渲染, 用户直接得到该方法的返回值.
其余讲解在代码内的注解中.
创建前端页面模板
在resources/templates/目录下创建一个index.html文件, 它便是我们应用的入口界面.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Spring Boot实战训练: Spring+Mysql 构建一个简单的登陆注册系统</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="index.css">
</head>
<body>
<h2>实例驱动学习之Spring框架: </h2>
<p>----Spring Boot+MySQL 构建一个简单的登陆注册系统</p><br>
<p th:text="'Hello, ' + ${name} + '!'" />
<div class="add">
<h2>注册新账号</h2>
<form action="/add" method="GET">
用户名:<input type="text" name="name"><br>
邮箱:<input type="text" name="email"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="注册">
</form>
</div>
<div class="login">
<h2>登陆已有账号</h2>
<form action="/login" method="GET">
邮箱:<input type="text" name="email"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登陆">
</form>
</div>
<div class="all">
<h2><a href="/all">查看所有注册账号信息</a></h2>
</div>
</body>
</html>
运行我们的Spring Boot应用
运行成功, 可以用浏览器输入网址localhost:8080来使用我们的应用.
如果端口被占用在配置文件里面输入
server.port=xxxx 再次启动就
Spring Boot+Jpa(MYSQL)做一个登陆注册系统(前后端数据库一站式编程)的更多相关文章
- spring boot++jpa+ mysql +maven
项目结构图: 一. 添加mysql 配置 1 在pom.xml中添加 maven依赖 <!--mysql--> <dependency> <groupId>mysq ...
- spring boot 解决 跨域 的两种方法 -- 前后端分离
1.前言 以前做项目 ,基本上是使用 MVC 模式 ,使得视图与模型绑定 ,前后端地址与端口都一样 , 但是现在有些需求 ,需要暴露给外网访问 ,那么这就出现了个跨域问题 ,与同源原则冲突, 造成访问 ...
- java web程序 上机考试做一个登陆注册程序
大二期末 java web.用到数据库,jdbc.myeclipse实现用户的注册,登陆 并且不能出现500错误,用户不能重复注册.当用户任意点击时也不能出现500错误! 这里.我只写注册成功的页面. ...
- Node.js Express连接mysql完整的登陆注册系统(windows)
windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...
- Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- Spring Boot Jpa 的使用
Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...
- (转)Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html 我知道大家这段时间看了 ...
- (转)Spring Boot(五):Spring Boot Jpa 的使用
http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...
随机推荐
- The Preliminary Contest for ICPC Asia Shenyang 2019 C Dawn-K's water (完全背包)
完全背包为什么要取到M,可以取到2*M嘛,这题需要整取,对于不能整取的背包容量,dp[k]=INF,以及dp[j-water[i].weight]=INF时,dp[j]也不需要更新.如果不整取的话,后 ...
- oracle 12cR2 RAC deconfig CRS过程记录
已经停了该节点的crs所有服务: [root@jhjzksrv02 install]# ./rootcrs.sh -force -deconfig -verboseUsing configuratio ...
- makefile的书写
工作中会遇到makefile的书写,有必要做一些笔记.尽管网上有”万能模板“可以使用,但我觉得还是有必要从最基础的写起. 平常在windows下开发,不知道自己用过makefile,其实大部分IDE里 ...
- java 生成/解读 二维码
package com.rails.util; import com.swetake.util.Qrcode; import jp.sourceforge.qrcode.QRCodeDecoder; ...
- webservice笔记
Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...
- Java读文件夹
使用JAVA读取文件夹中的多个文件 package hx.ReadFile; import java.io.FileNotFoundException; import java.io.IOExcept ...
- JNJP节点指定端口
jenkins节点机通过jnjp的方式访问jenkins服务器,端口号默认是随机分配,断开再连接则端口号会变. 由于公司管控较严,服务器开放的端口需要申请,因此不希望是随机分配的,而是可以指定端口. ...
- acm数论之旅(转载)--素数
https://www.cnblogs.com/linyujun/p/5198832.html 前言:好多学ACM的人都在问我数论的知识(其实我本人分不清数学和数论有什么区别,反正以后有关数学的知识我 ...
- 使刚编辑的vim编辑器配置文件立即生效(实为自动生效)
简单的说,在虚拟机下安装的Centos6.3系统后,默认的是没有vim编辑器的配置文件,此时如果有必要,可以按照自己的习惯定制或配置自己的vim编辑器: 1,如果你是root权限,进入root目录下: ...
- Spring Boot 中使用 HttpClient 进行 POST GET PUT DELETE
有的时候,我们的 Spring Boot 应用需要调用第三方接口,这个接口可能是 Http协议.可能是 WebService.可能是 FTP或其他格式,本章讨论 Http 接口的调用. 通常基于 Ht ...