Java对象模型现代化实践:基于Spring Boot与MyBatis-Plus的实现方案
一、技术选型与环境准备
本实践采用以下技术栈:
- Spring Boot 3.1.2
- MyBatis-Plus 3.5.3.1
- Lombok 1.18.26
- MapStruct 1.5.5.Final
- MySQL 8.0
- SpringDoc OpenAPI 2.1.0 (Swagger替代方案)
首先创建Maven项目,添加核心依赖:
<dependencies>
<!-- Spring Boot 基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 数据库相关 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 工具类 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
<!-- API文档 -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
二、数据库设计与PO对象实现
设计用户表和订单表:
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '用户状态:0-禁用,1-正常',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`user_id` bigint NOT NULL COMMENT '用户ID',
`order_no` varchar(50) NOT NULL COMMENT '订单编号',
`total_amount` decimal(10,2) NOT NULL COMMENT '订单金额',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '订单状态:1-待支付,2-已支付,3-已取消',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
使用Lombok简化PO对象:
// UserPO.java
@Data
@TableName("user")
public class UserPO {
@TableId(type = IdType.AUTO)
private Long id;
@TableField("username")
private String username;
@TableField("email")
private String email;
@TableField("phone")
private String phone;
@TableField("status")
private Integer status;
@TableField("create_time")
private LocalDateTime createTime;
}
三、DAO层实现(使用MyBatis-Plus)
// UserDAO.java (继承BaseMapper自动获得CRUD方法)
public interface UserDAO extends BaseMapper<UserPO> {
// 自定义方法示例
@Select("SELECT * FROM user WHERE status = 1 ORDER BY create_time DESC LIMIT #{limit}")
List<UserPO> listActiveUsers(int limit);
}
四、BO对象与业务逻辑实现
// UserBO.java
@Service
@RequiredArgsConstructor
public class UserBO {
private final UserDAO userDAO;
private final OrderService orderService;
public UserDTO getUserDetail(Long userId) {
UserPO userPO = userDAO.selectById(userId);
if (userPO == null) {
throw new BusinessException("用户不存在");
}
// 获取用户订单统计
Integer orderCount = orderService.countOrdersByUserId(userId);
// 转换为DTO
UserDTO dto = UserMapper.INSTANCE.toDTO(userPO);
dto.setOrderCount(orderCount);
dto.setStatusDesc(UserStatusEnum.getDescByCode(userPO.getStatus()));
return dto;
}
public void disableUser(Long userId) {
UserPO userPO = userDAO.selectById(userId);
if (userPO == null) {
throw new BusinessException("用户不存在");
}
if (userPO.getStatus() == 0) {
throw new BusinessException("用户已禁用");
}
// 执行业务逻辑:禁用用户前检查订单状态
boolean hasActiveOrders = orderService.hasActiveOrders(userId);
if (hasActiveOrders) {
throw new BusinessException("用户存在未完成订单,无法禁用");
}
// 更新用户状态
userPO.setStatus(0);
userDAO.updateById(userPO);
}
}
五、DTO与VO设计及对象转换
// UserDTO.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {
private Long userId;
private String username;
private String email;
private String phone;
private String statusDesc;
private Integer orderCount;
private LocalDateTime createTime;
}
// UserVO.java (用于前端展示)
@Data
public class UserVO {
private Long id;
private String name;
private String contactEmail;
private String contactPhone;
private String userStatus;
private Integer totalOrders;
private String registerDate;
}
// 使用MapStruct实现对象转换
@Mapper(componentModel = "spring")
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mappings({
@Mapping(source = "id", target = "userId"),
@Mapping(source = "createTime", target = "createTime",
dateFormat = "yyyy-MM-dd HH:mm:ss")
})
UserDTO toDTO(UserPO userPO);
@Mappings({
@Mapping(source = "userId", target = "id"),
@Mapping(source = "username", target = "name"),
@Mapping(source = "email", target = "contactEmail"),
@Mapping(source = "phone", target = "contactPhone"),
@Mapping(source = "statusDesc", target = "userStatus"),
@Mapping(source = "orderCount", target = "totalOrders"),
@Mapping(source = "createTime", target = "registerDate",
dateFormat = "yyyy-MM-dd")
})
UserVO toVO(UserDTO userDTO);
}
六、Controller层实现与VO处理
// UserController.java
@RestController
@RequestMapping("/api/users")
@Api(tags = "用户管理")
public class UserController {
private final UserBO userBO;
private final UserMapper userMapper;
@Autowired
public UserController(UserBO userBO, UserMapper userMapper) {
this.userBO = userBO;
this.userMapper = userMapper;
}
@GetMapping("/{userId}")
@ApiOperation("获取用户详情")
public ResponseEntity<UserVO> getUser(@PathVariable Long userId) {
UserDTO dto = userBO.getUserDetail(userId);
UserVO vo = userMapper.toVO(dto);
return ResponseEntity.ok(vo);
}
@PutMapping("/{userId}/disable")
@ApiOperation("禁用用户")
public ResponseEntity<Void> disableUser(@PathVariable Long userId) {
userBO.disableUser(userId);
return ResponseEntity.ok().build();
}
@PostMapping
@ApiOperation("创建用户")
public ResponseEntity<UserVO> createUser(@RequestBody @Valid UserCreateDTO createDTO) {
// 转换为PO
UserPO userPO = UserMapper.INSTANCE.toPO(createDTO);
// 保存用户
userDAO.insert(userPO);
// 返回创建结果
UserDTO dto = UserMapper.INSTANCE.toDTO(userPO);
UserVO vo = UserMapper.INSTANCE.toVO(dto);
return ResponseEntity.status(HttpStatus.CREATED).body(vo);
}
}
七、测试与验证
- 单元测试示例
@SpringBootTest
class UserBOTest {
@Autowired
private UserBO userBO;
@Test
void testGetUserDetail() {
// 创建测试数据
UserPO userPO = new UserPO();
userPO.setUsername("testuser");
userPO.setEmail("test@example.com");
userPO.setStatus(1);
userDAO.insert(userPO);
// 测试
UserDTO dto = userBO.getUserDetail(userPO.getId());
// 验证
assertNotNull(dto);
assertEquals(userPO.getUsername(), dto.getUsername());
assertEquals("正常", dto.getStatusDesc());
}
}
- API文档访问
启动应用后,访问:http://localhost:8080/swagger-ui.html
可查看自动生成的API文档和测试接口。
八、性能优化与最佳实践
- DTO字段过滤
// 使用Jackson注解控制序列化
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class UserDTO {
// 字段定义
}
- 分页查询
// 在DAO接口中添加分页方法
IPage<UserPO> selectUserPage(Page<UserPO> page, @Param("status") Integer status);
// 在Service中使用
Page<UserPO> page = new Page<>(1, 10);
IPage<UserPO> userPage = userDAO.selectUserPage(page, 1);
- 事务管理
@Transactional
public void transferUserOrder(Long fromUserId, Long toUserId) {
// 业务逻辑
}
九、现代化扩展
- 集成Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
return http.build();
}
}
- 使用Redis缓存
@Cacheable("users")
public UserDTO getUserDetail(Long userId) {
// 查询逻辑
}
- 异步处理
@Async("taskExecutor")
public CompletableFuture<UserDTO> getUserDetailAsync(Long userId) {
// 异步查询
}
十、总结
通过本实践,我们基于最新技术实现了Java对象模型的完整应用:
- 使用MyBatis-Plus简化DAO层开发
- 通过Lombok和MapStruct提高开发效率
- 遵循RESTful规范设计API接口
- 利用SpringDoc自动生成API文档
- 实现了完整的对象模型转换流程(PO→BO→DTO→VO)
这种分层设计使代码结构清晰,各模块职责明确,同时兼顾了性能和可维护性,是现代化Java企业应用开发的典型实践。
Java, 对象模型,现代化实践,Spring Boot,MyBatis Plus, 实现方案,深度解析,Java 开发,对象模型设计,Spring 框架,MyBatis 技术,企业级开发,后端开发,软件开发,编程框架
代码获取方式
https://pan.quark.cn/s/14fcf913bae6