Java后端开发教程

简介:

emmm一个非常不正经的教程,暂时只是记录开发的步骤,具体原理需要留到下次。

资源:

前后端所有的资源

链接:https://pan.baidu.com/s/1_NRE678mgRl7p6UNd_6Xvg
提取码:1g8k

后端:

Maven开源项目框架

链接:https://pan.baidu.com/s/1-8cRTpmVQHLirZwuNG9L6Q
提取码:se9k

idea编译器及破解工具

注意:该破解工具只对我提供的idea版本有效

链接:https://pan.baidu.com/s/1HbdKnCkZgKYOlB5uZerFyA
提取码:6u5s

Navicat Premium 15

软件安装包及破解工具

链接:https://pan.baidu.com/s/1bwOGRVOyt8K5tlwyPZh1tA
提取码:bsky

对应的破解教程

Navicat_Premium_v15 激活_哔哩哔哩_bilibili

默认大家已配置好jdk8(jdk1.8),并将其添加到了PATH中。

  • 在idea选择Settings
  • 按照截图所示内容,将刚在下载好的Maven项目框架的文件路径,配置到idea中

  • 新建一个project

  • 按照下图所示内容即可
  • Finish之后,需要等待一段时间来完成下载配置

完成上述操作之后,我们就创建好了一个基本的后台项目。


接下来完成数据库以及一个用户注册业务

数据库部分

在Navicat中,新建一个MySQL连接

在example连接中新建一个数据库demo

在demo数据库中,新建一个user表


IDEA部分

初始配置

并按照下面的截图新建好package和directory以及yml


pojo包下的User类

在pojo包中新建一个User类,并完成一些所需的数据库映射对象所需的代码配置

接着空一行,按下ALT+INS,选择Constructor

之间选择Select None 构造一个无参的方法

考虑到用户注册时需要email,password和nickname

我们按照同样的方法,构建一个只含email,password和nickname的方法

同样的,用户登录时需要email和password,那么我们构建一个只含email和password的方法

最后,我们还需要构建一个含全参的方法

仍然是快捷建ALT+INS,这次我们选择Getter and Setter

全选

最后我们同样快捷建ALT+INS,选择toString(),

全选并点击ok即可完成pojo中User类的一个简单的配置

pojo下User类的全部代码如下

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
package com.example.demo.pojo;

import org.apache.ibatis.type.Alias;

@Alias("user")
//起别名,在写sql代码时,如果传入的参数(parameterType)为User类,
//就不用写com.example.demo.pojo.User
//只需要写user就行

public class User {

private Integer id; //用户编号
private String email; //用户邮箱
private String password; //用户密码
private String nickname; //用户昵称

//无参
public User() {
}

//用户注册--需要邮箱,密码,昵称
public User(String email, String password, String nickname) {
this.email = email;
this.password = password;
this.nickname = nickname;
}

//用户登录--需要邮箱,密码
public User(String email, String password) {
this.email = email;
this.password = password;
}

//全参
public User(Integer id, String email, String password, String nickname) {
this.id = id;
this.email = email;
this.password = password;
this.nickname = nickname;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getNickname() {
return nickname;
}

public void setNickname(String nickname) {
this.nickname = nickname;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", email='" + email + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}


application.yml

进行数据库与idea的连接,以及配置mybatis(MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。)

application.yml代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 配置java与数据库的连接
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/demo # 这里我连的是数据库demo,只要将demo改为自己的数据库名字即可
driver-class-name: com.mysql.cj.jdbc.Driver
server:
port: 18081 # 端口号 ,可以自己设置一个,如果运行是发现端口号冲突,重新换一个就行

# 配置sql代码
mybatis:
type-aliases-package: com.example.demo.pojo # pojo的路径
mapper-locations: classpath:mapper/*Mapper.xml # mapper文件地址
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # SQL语句输出日志


config包下WebMvcConfig类

在config包下新建一个WebMvcConfig类,并写入以下代码来设置跨域,以便前后端在url上的统一

WebMvcConfig类代码

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.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
// 允许跨域请求的域名
.allowedOriginPatterns("*")
//允许证书
.allowCredentials(true)
// 允许的方法
.allowedMethods("*")
// 跨域的时间
.maxAge(3600);
}
}

util包下ResponseData类

在util包下新建一个ResponseData类,在后端连接前端时,发出一些成功或者错误的响应

ResponseData类代码

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
package com.example.demo.util;
//自定义响应数据
public class ResponseData<T> {
private boolean success; //是否成功
private Integer code; //响应代码
private String message; //响应提示语句
private T data;

public ResponseData(){
}

public ResponseData(boolean success, Integer code, String message) {
this.success = success;
this.code = code;
this.message = message;
}

public ResponseData(boolean success, Integer code, String message, T data) {
this.success = success;
this.code = code;
this.message = message;
this.data = data;
}

public boolean isSuccess() {
return success;
}

public void setSuccess(boolean success) {
this.success = success;
}

public Integer getCode() {
return code;
}

public void setCode(Integer code) {
this.code = code;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public T getData() {
return data;
}

public void setData(T data) {
this.data = data;
}

@Override
public String toString() {
return "ResponseData{" +
"success=" + success +
", code=" + code +
", message='" + message + '\'' +
", data=" + data +
'}';
}
}

dao包下IUserDao接口

在dao包下新建一个IUserDao接口,该接口直接与SQL语句代码块相连,里面的代码用来调用不同的SQL语句

IUserDao接口代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example.demo.dao;

import com.example.demo.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
// 关于用户表的数据库接口
public interface IUserDao {

/**
* 新增一个用户
* @param user 传入的是用户的邮箱,密码,昵称
* @return 【0:注册失败 1:注册成功】
*/
int addOneUser(User user);
}

mapper文件夹下UserMapper.xml

在mapper文件夹下,新建一个UserMapper.xml用来写SQL语句

UserMapper.xml代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.dao.IUserDao">

<!--新增一个用户-->
<!--这里id="addOneUser"对应着IUserDao接口中的方法addOneUser-->
<insert id="addOneUser" parameterType="user">
INSERT INTO `user`(`email`,`password`,`nickname`)
VALUES (#{email},#{password},#{nickname})
</insert>

</mapper>

service包下IUserService接口

在service包中新建一个IUserService接口

IUserService接口代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.demo.service;

import com.example.demo.pojo.User;

// 关于用户的业务接口
public interface IUserService {

/**
* 用户的注册业务
* @param user 注册的信息【email,password,nickname】
* @return 是否注册成功
*/
boolean userRegister(User user) throws Exception;
}

service包下impl文件夹下UserServiceImpl类

在service包中新建一个impl文件夹,再在该文件夹下创建一个UserServiceImpl类

UserServiceImpl类代码

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
package com.example.demo.service.impl;

import com.example.demo.dao.IUserDao;
import com.example.demo.pojo.User;
import com.example.demo.service.IUserService;
import com.sun.org.apache.xml.internal.resolver.readers.ExtendedXMLCatalogReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

// 关于用户的业务实现层
@Service
public class UserServiceImpl implements IUserService {

@Autowired
private IUserDao userDao; // 关于用户的数据库接口
/**
* 用户的注册业务
*
* @param user 注册的信息【email,password,nickname】
* @return 是否注册成功
*/
@Override
@Transactional(rollbackFor = {Exception.class}) //事务回滚
//传入的user参数是由controller层传过来的,
// 而controller层中的user又是由前端的form表单通过ajax使用url传过来的
public boolean userRegister(User user) throws Exception {

int count = 0;
try {
// 新增一个用户
count = userDao.addOneUser(user);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("该账户已被使用");
}
if(count != 1){
throw new Exception("新增失败");
}

return true;
}
}

controller包下UserControll类

在控制层controller包下创建一个UserControll类,该类直接与前端相连

UserControll类代码

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
package com.example.demo.controller;

import com.example.demo.pojo.User;
import com.example.demo.service.IUserService;
import com.example.demo.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

// 关于用户的控制层【处理web请求】
@CrossOrigin
@RequestMapping("/user") // 设置url中UserController用户控制层都是在/user下的
@RestController
public class UserController {

@Autowired
private IUserService userService; // 关于用户的业务

// 前端传参数给后端,用PostMapping
// 若前端不传参数给后端,则用GetMapping

@PostMapping("/register") // /user/register
public ResponseData register(User user){
// 密码加密
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
try {
userService.userRegister(user);
return new ResponseData(true,2000,"注册成功");
} catch (Exception e){
e.printStackTrace();
return new ResponseData(false,1000,e.getMessage());
}
}
}

测试

按照下图运行成功,并未暂停报错,则至少数据库是配置好了,真正测试前端操作究竟能不能通过ajax修改后端数据库,我们将留到下一篇“java的前后端连接”来测试


本博客所有文章除特别声明外,转载请注明出处!