通过之前的几篇文章相信大家已经对SpringBoot项目开发有了一个基本的了解。本篇,介绍下如何使用SpringBoot搭建一个简单的服务端,实现一个新用户注册的场景,供前端和移动端去使用。本篇需要你对SpringBoot的starter,mysql,jpa等有一些基本的了解。不过即使你没有任何的基础,直接跟着我的步骤来也是ok的。
目录
一、导入starter和mysql
二、创建Dao类
三、创建JpaRepository
四、创建返回对象类RegisterResult
五、实现Controller
六、创建数据库和表
七、SpringBoot连接mysql数据库
八、运行项目并测试
九、可能遇到的问题
上篇介绍过spring-boot-starter-web,既然是服务端,我们依然需要导入它,在这里不再赘述。然后,导入mysql,因为我们接受到新用户的注册信息后,需要持久化到数据库,在这里我们使用mysql。此外,java程序需要跟mysql数据库交互,大学课程上我们是使用JDBC,大家应该都很熟悉。但是,在这里我们使用JPA(一种ORM规范,用来解决面向对象和关系数据库不匹配问题),导入spring-boot-starter-data-jpa。
org.springframework.boot
spring-boot-starter-web
com.mysql
mysql-connector-j
runtime
org.springframework.boot
spring-boot-starter-data-jpa
Dao做java后端的同学肯定都很熟悉,Android也有一个非常优秀的ORM框架GreenDao。上面也提到过,ORM是为了解决对象和关系数据库的映射问题,因此需要注意:Dao类的表名和字段名需要跟后面在mysql创建的表名和字段名一致。
@Entity
@Table(name="user_info")
public class UserDao {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userId;
@Column(name = "user_name")
private String userName;
@Column(name = "user_password")
private String userPassword;
@Column(name = "user_phone")
private String userPhone;
@Column(name = "user_token")
private String userToken;
@Column(name = "user_register_time")
private String userRegisterTime;
@Column(name = "user_last_login_time")
private String userLastLoginTime;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserPhone() {
return userPhone;
}
public void setUserPhone(String userPhone) {
this.userPhone = userPhone;
}
public String getUserToken() {
return userToken;
}
public void setUserToken(String userToken) {
this.userToken = userToken;
}
public String getUserRegisterTime() {
return userRegisterTime;
}
public void setUserRegisterTime(String userRegisterTime) {
this.userRegisterTime = userRegisterTime;
}
public String getUserLastLoginTime() {
return userLastLoginTime;
}
public void setUserLastLoginTime(String userLastLoginTime) {
this.userLastLoginTime = userLastLoginTime;
}
}
使用JPA,我们只需要定义一个接口就可以轻松地操作数据库,不用写SQL,这个接口继承JpaRepository接口。JpaRepository接口已经提供了几乎非常全面的增删改查方法,自定义的Repository主要是去实现自定义的一些增删改查方法,比如如下示例中的通过用户名和token去查询:
@Repository
public interface UserRepository extends JpaRepository {
public UserDao findByUserName(String userName); //通过UserName查询
public UserDao findByUserToken(String token);//通过UserToken查询
}
客户端访问服务端,服务端需要返回数据。如下示例中,code可以表示状态码(例如200),status表示注册成功或失败(例如fail),msg则是附加的信息(例如因用户名重复注册失败)。因为是个demo,暂时我们就这么些。
public class RegisterResult {
private int code;
private String status;
private String msg;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
请求API的实现在controller中,我实现了简单的注册逻辑,附带基本的校验。注册成功后,会把新用户的信息写入mysql数据库:
@RestController
public class RegisterController {
@Autowired
private UserRepository userRepository;
@GetMapping("register")
public RegisterResult register(String name, String phone, String password) {
int code = 0;
String status = "未知状态";
String msg = "未知信息";
String token = "";
RegisterResult registerResult = new RegisterResult();
if (TextUtils.isEmpty(name)) {
status = "fail";
msg = "用户名不能为空";
} else if (TextUtils.isEmpty(phone)) {
status = "fail";
msg = "手机号不能为空";
} else if (TextUtils.isEmpty(password)) {
status = "fail";
msg = "密码不能为空";
} else if (userRepository.findByUserName(name) != null) {
status = "fail";
msg = "用户名已存在";
} else {
status = "success";
msg = "注册成功";
addUser(name, phone, password);
}
registerResult.setCode(code);
registerResult.setStatus(status);
registerResult.setMsg(msg);
return registerResult;
}
/**
* 添加用户
*
* @param name name
* @param password password
* @param phone phone
*/
public void addUser(String name, String password, String phone) {
UserDao userDao = new UserDao();
userDao.setUserName(name);
userDao.setUserPassword(password);
userDao.setUserPhone(phone);
Timestamp timestamp = new Timestamp(new Date().getTime());
userDao.setUserRegisterTime(timestamp + "");
userRepository.save(userDao);
}
}
在这里我使用mysql workbench建表,在此不详细介绍如何使用mysql workbench。特别需要注意的是,user_id设置主键,设置自增。如下:
在application.properties文件中,增加如下配置:
spring.datasource.url=jdbc:mysql://localhost:3306/android_server?&useSSL=false
spring.datasource.username=root
spring.datasource.password=888888
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
运行项目,在浏览器中输入:http://localhost:8080/register?name=zj&phone=1234567890&password=123456
查看mysql数据库,看是否成功写到表里:
1、java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)。检查数据库用户名或密码是否拼写错误。
2、com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure。数据库端口号不对,mysql通常是3306。
简单总结一下,本篇介绍了如何通过ItelliJ社区版创建的SpringBoot项目搭配mysql和jpa搭建简单的服务端,去模拟实现新用户注册这样的场景。也整理了新手在开发和配置过程中可能遇到的一些问题,希望对大家有所帮助。