开发查询用户信息功能

用户表设计

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(256) DEFAULT NULL COMMENT '用户名',
`password` varchar(512) DEFAULT NULL COMMENT '密码',
`real_name` varchar(256) DEFAULT NULL COMMENT '真实姓名',
`phone` varchar(128) DEFAULT NULL COMMENT '手机号',
`mail` varchar(512) DEFAULT NULL COMMENT '邮箱',
`deletion_time` bigint(20) DEFAULT NULL COMMENT '注销时间戳',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` tinyint(1) DEFAULT NULL COMMENT '删除标识 0:未删除 1:已删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在父工程的pom.xml文件中引入持久层框架以及Lombok依赖

在dependencyManagement标签中引入的依赖并不会真实下载,在子工程中定义使用了相关依赖才会真实下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

在dependencies标签中引入的依赖会真实下载

1
2
3
4
5
6
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

在子工程的application.yml文件中添加持久层配置项

1
2
3
4
5
6
7
8
9
10
11
12
spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/link?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
connection-test-query: select 1
connection-timeout: 20000
idle-timeout: 300000
maximum-pool-size: 5
minimum-idle: 5

添加@MapperScan注解

在启动类中添加持久层接口扫描器,减少不必要的性能消耗
1
@MapperScan("com.xxx.dao.mapper")

创建DO

在src/main/java/.../dao/entity路径下新建数据库表实体类
将建表语句粘贴到凝聚力JAVA开发可自动生成
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
/**
* 用户持久层实体
*/
@Data
@TableName("t_user")
public class UserDO extends BaseDO {

/**
* id
*/
private Long id;

/**
* 用户名
*/
private String username;

/**
* 密码
*/
private String password;

/**
* 真实姓名
*/
private String realName;

/**
* 手机号
*/
private String phone;

/**
* 邮箱
*/
private String mail;

/**
* 注销时间戳
*/
private Long deletionTime;
}

创建mapper

在src/main/java/.../dao/mapper路径下新建数据持久层接口XXXMapper
1
2
3
4
5
/**
* 用户持久层
*/
public interface UserMapper extends BaseMapper<UserDO> {
}

创建对应的service和impl

在src/main/java/.../service路径下创建XXX接口层
1
2
3
4
5
/**
* 用户接口层
*/
public interface UserService extends IService<UserDO> {
}
在src/main/java/.../service/impl路径下创建XXX接口实现类
1
2
3
4
5
6
7
/**
* 用户接口实现层
*/
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService {
}

新建XXXRespDTO

在src/main/java/.../dto/resp路径下新建UserRespDTO,用作返回响应参数实体
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
/**
* 用户返回参数响应
*/
@Data
public class UserRespDTO {

/**
* id
*/
private Long id;

/**
* 用户名
*/
private String username;

/**
* 真实姓名
*/
private String realName;

/**
* 手机号
*/
@JsonSerialize(using = PhoneDesensitizationSerializer.class)
private String phone;

/**
* 邮箱
*/
private String mail;

/**
* 注销时间戳
*/
private Long deletionTime;

/**
* 创建时间
*/
private Date createTime;

/**
* 修改时间
*/
private Date updateTime;

/**
* 删除标识 0:未删除 1:已删除
*/
private Integer delFlag;
}

在controller中新建接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@RequiredArgsConstructor
public class UserController {

private final UserService userService;//通过构造器的方式注入userService

/**
* 根据用户名查询用户信息
*/
@GetMapping("/api/short-link/admin/v1/user/{username}")
public Result<UserRespDTO> getUserByUsername(@PathVariable("username") String username) {
return Results.success(userService.getUserByUsername(username));
}
}

Alt+Enter

对着controller中的getUserByUsername按Alt+Enter
用户接口层的userService中自动新增以下内容
因为controller中用的是userService.getUserByUsername()
1
2
3
4
5
6
7
/**
* 根据用户名查询用户信息
*
* @param username 用户名
* @return 用户返回实体
*/
UserRespDTO getUserByUsername(String username);
对着userService中的getUserByUsername按Alt+Enter
在UserServiceImpl中会自动生成以下代码
1
2
3
@Override
public UserRespDTO getUserByUsername(String username) {
}

编写SQL语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public UserRespDTO getUserByUsername(String username) {

LambdaQueryWrapper<UserDO> queryWrapper = Wrappers.lambdaQuery(UserDO.class)
.eq(UserDO::getUsername, username);
UserDO userDO = baseMapper.selectOne(queryWrapper);
if (userDO == null) {
throw new ClientException(UserErrorCodeEnum.USER_NULL);
}
UserRespDTO result = new UserRespDTO();
BeanUtils.copyProperties(userDO, result); // 此方法需要判空才可以,否则会报错
return result;

}