本文开发一用户注册与登录的后端java平台。开发完后的网页效果:http://user-front.66bond.com/

后端主要提供用户的注册、查询、删除等操作。使用到的开发工具:

  • IDEA2021; 关注公众号”青椒工具”,发送”IDEA”,获取windows下的IDEA安装包
  • mysql 5.7;关注公众号”青椒工具”,发送”mysql”,获取windows下的mysql5.7安装包;

之前我们已经创建mapper和model目录,接下来再创建controller,service,utils三个目录;

  • controller,控制层负责接受网络请求;
  • utils,存放一些通用的工具类;
  • service,实现业务逻辑;
  • mapper,数据库访问;
  • model,对应数据库的对象;
1、创建user对象与数据库关联

之前我们在使用mybaits-plus时有写过User.java代码,那现在我们是否要根据simpleuser中的user表来写User.java代码呢?

我们的User表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
id           bigint auto_increment
primary key,
username varchar(256) null comment '用户名',
userAccount varchar(256) null comment '账户名',
avatarUlr varchar(1024) null comment '用户头像',
gender tinyint null comment '性别',
userPassword varchar(512) null comment '密码',
phone varchar(128) null,
email varchar(512) null,
userStatus int null,
updateTime datetime default CURRENT_TIMESTAMP null,
createTime datetime default CURRENT_TIMESTAMP null,
isDelete tinyint null,
userRole int default 0 null comment '表示用户角色, 0 普通用户, 1 管理员'

对应上述的表,我们在User.java要写这些变量,手动还能勉强写,但是如果user表中有成百上千的变量,那么再手动来写肯定不现实,我们需要自动根据数据库来写User.java代码的方法:

我们点击IDEA中settings->plugin中,搜索并安装mybatisX插件,然后点击IDEA右侧的database,选择要生成代码的表格/simpleuser/user,右键然后选择”MybatisX-Generate”:

图2.1开启mybatis-generator

图1 右键启动MybatisX-Generator

图2.2options

图2 配置参数

图2.3设置选项

图3 配置生成代码参数

根据上述的参数配置,可以看到自动生成的代码目录generator:

图2.4自动生成的代码与目录

图4 自动生成的目录与代码

我们再将其中的generator中domain, mapper与service目录中的代码分别拷贝到backend中的model, mapper与service;

注意:要删除错误的import语句,以及添加新的import语句,import语句的添加可以使用快捷键: alt+enter;

现在的问题:User.java中的变量名与数据库中的不一致,数据库中的是驼峰变量名,而我们生成的全部是小写,所以我们要增加勾选图3中的”Actual Column”条目,重新生成即可。

2、测试生成的代码访问数据库

我们来测试UserService.java是否可以访问数据库中的数据;

将鼠标光标停留到UserService.java源代码中的UserService字段,然后alt+enter,选择Create Test;使用Junit5来创建测试文件,在/test/java/com.tfzhang.backend/service下自动创建UserServiceTest.java文件,代码框架:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.tfzhang.backend.service;

import com.tfzhang.backend.model.User;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class UserServiceTest {

@Resource
private UserService userService;

@Test
public void testAddUser(){
User user = new User();
//1、设置user的初始化值;
//2、将user对象存储到数据库;
}
}

此处步骤1中的user初始化,就是调用user对象的set方法;因为有那么多个变量,每个都自己写不方便,我们可以装一个generateallset插件来实现自动填充代码:

安装插件的过程settting->plugins,再搜索安装即可。

具体使用:将光标停留到user变量,然后alt+enter,选择”generate all setter with default values”即可,生成的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void testAddUser(){
User user = new User();
user.setId(0L);
user.setUsername("");
user.setUserAccount("");
user.setAvatarUlr("");
user.setGender(0);
user.setUserPassword("");
user.setPhone("");
user.setEmail("");
user.setUserStatus(0);
user.setUpdateTime(new Date());
user.setCreateTime(new Date());
user.setIsDelete(0);
user.setUserRole(0);
}

然后将自动会设置默认值的变量去掉,比如Id是插入数据时自动生成的,还有updateTime,createTime等等,修改后最终的代码如下:

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.tfzhang.backend.service;
import java.util.Date;

import com.tfzhang.backend.model.User;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class UserServiceTest {

@Resource
private UserService userService;

@Test
public void testAddUser(){
User user = new User();

user.setUsername("test");
user.setUserAccount("tfzhang");
user.setAvatarUlr("xxx");
user.setGender(0);
user.setUserPassword("xxx");
user.setPhone("12432342");
user.setEmail("tfzhang@123@456");

boolean result = userService.save(user);
System.out.println(user.getId());
Assertions.assertEquals(true, result);

}
}

我们点击上述testAddUser()方法左边的绿色小三角,开始运行testAddUser方法,会出现如下的错误:

1
Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'baseMapper': Error creating bean with name 'userMapper' defined in file [C:\Users\bigbug\Desktop\usercode\backend\target\classes\com\tfzhang\backend\mapper\UserMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory': Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception with message: Failed to parse mapping resource: 'file [C:\Users\bigbug\Desktop\usercode\backend\target\classes\mapper\UserMapper.xml]'

去查看UserMapper.xml文件,原来这个文件我们没有修改,还是之前generator时候的参数,我们根据当前的model和mapper位置修改如下:

1
2
3
4
<mapper namespace="com.tfzhang.backend.mapper.UserMapper">

<resultMap id="BaseResultMap" type="com.tfzhang.backend.model.User">
...

保存后,再次点击运行测试程序,发现有新的错误:

1
2
3
4
5
6
7
8
org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'user_account' in 'field list'
### The error may exist in com/tfzhang/backend/mapper/UserMapper.java (best guess)
### The error may involve com.tfzhang.backend.mapper.UserMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO user ( username, user_account, avatar_ulr, gender, user_password, phone, email ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'user_account' in 'field list'
; bad SQL grammar []

根据提示是代码往数据库插入了user_account 变量的值,但是我们的数据库中只有userAccount,根本不存在user_account这样的变量值。

那这个user_account又是哪里来的呢?采用ctrl+shift+F的全局搜索,我们在代码中并不能找到user_account,所以很可能是我们的mybatis自动生成的操作数据库的代码。我们以下面的关键词开始百度:

1
mybatis 数据库变量下划线

最终找到解决方法是,在application.yml中加入下的配置语句:

1
2
3
mybatis-plus:
configuration:
map-underscore-to-camel-case: false

保存后,我们再次启动测试文件,这次可以顺利通过测试,数据库返回值的Id值为1,如下图所示:

图2.5测试程序启动

图5 测试代码通过

至此,我们的用户数据库可以正常访问,项目文件目录也建设完毕,接下来我们实现业务逻辑。

3、参考资料:

本文参考自如下知识星球中的视频教程,更多的完整的相关视频教程,见如下的收费知识星球,近3万人的学习社区,

编程有人同行,学习不再迷茫

编程导航知识星球