当前位置: 首页 > news >正文

SpringBoot + MyBatis实战:5分钟搞定用户查询接口(附完整代码)

SpringBoot与MyBatis极速整合实战:从零构建用户管理系统

当Java开发者第一次接触SpringBoot和MyBatis的组合时,往往会惊讶于其开发效率的提升。想象一下,原本需要数十行配置的数据库操作,现在只需几个注解就能完成;曾经繁琐的项目搭建过程,现在通过starter依赖就能一键搞定。本文将带你体验这种"现代Java开发"的高效范式,用最短路径实现用户查询和注册功能。

1. 环境搭建与基础配置

在开始编码之前,我们需要准备一个标准的SpringBoot项目骨架。与传统的SSM框架不同,SpringBoot的初始化过程简单得令人难以置信:

# 使用Spring Initializr创建项目(命令行方式) curl https://start.spring.io/starter.zip \ -d dependencies=web,mybatis-spring-boot-starter,mysql,lombok \ -d type=maven-project \ -d language=java \ -d bootVersion=2.7.0 \ -d groupId=com.example \ -d artifactId=user-management \ -o user-management.zip

解压后,你会得到一个完整的Maven项目结构。关键的pom.xml已经自动配置了所有必要依赖:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</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> </dependencies>

数据库配置同样简洁,只需在application.yml中声明连接信息:

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/user_db?useSSL=false&serverTimezone=UTC username: root password: yourpassword mybatis: configuration: map-underscore-to-camel-case: true

提示:使用YAML格式的配置文件比properties更易读,且支持多环境配置。map-underscore-to-camel-case配置会自动将数据库的user_name映射到Java的userName属性。

2. 用户查询功能实现

2.1 实体类设计

我们首先定义用户实体,使用Lombok简化代码:

@Data @NoArgsConstructor @AllArgsConstructor public class User { private Integer userId; private String userName; private String passWord; private LocalDateTime createTime; }

2.2 Mapper接口开发

MyBatis的注解方式让DAO层变得异常简单:

@Mapper public interface UserMapper { @Select("SELECT * FROM t_user WHERE user_id = #{id}") User selectById(Integer id); @Select("SELECT * FROM t_user WHERE user_name LIKE CONCAT('%',#{name},'%')") List<User> selectByUserName(String name); }

2.3 控制器层实现

SpringMVC的控制器现在只需关注业务逻辑:

@RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserMapper userMapper; @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable Integer id) { User user = userMapper.selectById(id); return ResponseEntity.ok(user); } @GetMapping public ResponseEntity<List<User>> searchUsers(@RequestParam String name) { return ResponseEntity.ok(userMapper.selectByUserName(name)); } }

启动应用后,访问http://localhost:8080/api/users/1就能获取ID为1的用户信息。整个过程没有编写任何XML配置文件,没有手动创建SqlSessionFactory,这就是SpringBoot+MyBatis的魅力所在。

3. 用户注册功能进阶

3.1 服务层设计

在注册功能中,我们需要添加业务逻辑验证:

@Service @RequiredArgsConstructor public class UserService { private final UserMapper userMapper; public Result register(UserRegisterDTO dto) { if (userMapper.existsByUserName(dto.getUserName())) { return Result.fail("用户名已存在"); } User user = new User(); user.setUserName(dto.getUserName()); user.setPassWord(encodePassword(dto.getPassWord())); user.setCreateTime(LocalDateTime.now()); userMapper.insert(user); return Result.success(user); } private String encodePassword(String raw) { return DigestUtils.md5DigestAsHex(raw.getBytes()); } }

3.2 增强版Mapper

使用MyBatis的注解实现插入操作并返回主键:

@Mapper public interface UserMapper { // ...其他方法 @Select("SELECT COUNT(*) FROM t_user WHERE user_name = #{userName}") boolean existsByUserName(String userName); @Insert("INSERT INTO t_user(user_name, pass_word, create_time) " + "VALUES(#{userName}, #{passWord}, #{createTime})") @Options(useGeneratedKeys = true, keyProperty = "userId") int insert(User user); }

3.3 控制器与DTO

使用DTO进行参数校验:

@Data public class UserRegisterDTO { @NotBlank(message = "用户名不能为空") @Size(min = 4, max = 20, message = "用户名长度4-20个字符") private String userName; @NotBlank(message = "密码不能为空") @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$", message = "密码至少8位,包含字母和数字") private String passWord; } @RestController @RequestMapping("/api/auth") @RequiredArgsConstructor public class AuthController { private final UserService userService; @PostMapping("/register") public Result register(@Valid @RequestBody UserRegisterDTO dto) { return userService.register(dto); } }

4. 异常处理与API规范

4.1 全局异常处理

@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public Result handleValidationException(MethodArgumentNotValidException ex) { List<String> errors = ex.getBindingResult() .getFieldErrors() .stream() .map(FieldError::getDefaultMessage) .collect(Collectors.toList()); return Result.fail(errors.toString()); } @ExceptionHandler(Exception.class) public Result handleOtherException(Exception ex) { return Result.fail("系统繁忙,请稍后再试"); } }

4.2 统一返回格式

@Data @NoArgsConstructor @AllArgsConstructor public class Result<T> implements Serializable { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { return new Result<>(200, "success", data); } public static <T> Result<T> fail(String message) { return new Result<>(400, message, null); } }

5. 项目优化与扩展

5.1 MyBatis XML配置方式

虽然注解方式简便,但复杂SQL建议使用XML配置:

<!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.example.entity.User"> <id column="user_id" property="userId" /> <result column="user_name" property="userName" /> <result column="pass_word" property="passWord" /> <result column="create_time" property="createTime" /> </resultMap> <select id="selectWithConditions" resultMap="BaseResultMap"> SELECT * FROM t_user <where> <if test="userName != null"> AND user_name LIKE CONCAT('%', #{userName}, '%') </if> <if test="startTime != null"> AND create_time >= #{startTime} </if> </where> </select> </mapper>

5.2 分页查询实现

整合PageHelper实现优雅分页:

@GetMapping("/page") public Result<PageInfo<User>> getUsersByPage( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectAll(); return Result.success(PageInfo.of(users)); }

5.3 多数据源配置

当需要连接多个数据库时:

@Configuration @MapperScan(basePackages = "com.example.mapper.primary", sqlSessionTemplateRef = "primarySqlSessionTemplate") public class PrimaryDataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/primary/*.xml")); return bean.getObject(); } @Bean public SqlSessionTemplate primarySqlSessionTemplate( @Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }

在实际项目中,这种SpringBoot+MyBatis的组合能够将开发效率提升数倍。我曾在一个用户管理模块的开发中,原本需要3天的工作量,采用这种模式后仅用半天就完成了核心功能的开发。特别是在快速迭代的互联网项目中,这种高效开发模式已经成为Java后端开发的事实标准。

http://www.jsqmd.com/news/621755/

相关文章:

  • Qwen Pixel Art实战案例:用‘8-bit robot wearing sunglasses’生成可商用素材
  • Qwen2.5-7B-Instruct完整指南:从部署到应用,一站式解决方案
  • 为什么你读论文这么慢?可能不是英语问题
  • CCS工程报错找不到库?别慌,手把手教你用XGCONF和工程属性搞定RTSC/裸机配置
  • 生命科学+AI深度融合:未来六年复合年增长率锁定20.3%,产业增长动能强劲
  • Revit插件越装越卡?选品茗HiBIM搞定建模、深化、机电出图......
  • OpenClaw 安装配置教程 - 峰哥版
  • 系统复位与防护总结
  • 保姆级教程:手把手教你为ROS机器人定制Rviz多目标点导航插件(基于move_base)
  • Mac 预览应用隐藏技巧:快速编辑图片的完整指南
  • 2025最权威的五大降AI率神器推荐
  • 知识资产沉睡率高达68%?重构AI原生研发知识平台的4步激活法,立即见效
  • 光伏运维:从规模扩张到技术驱动的产业升级之路
  • 效率提升80%:AI全流程研发真实项目落地复盘
  • 带交互动画角色的登录页面 html开源项目
  • MySQL语句执行深度剖析:从连接到执行的全过程颈
  • 哈德爱因斯坦奶粉成分分析:核心成分详解
  • 智能自动化测试系统:全面覆盖FCT、ATE、ICT和PCBA测试需求
  • MySQL 常用数据类型的系统总结
  • Java 核心四大基石:从 Object 源码到包装类陷阱的全维度复盘够
  • Qt 6实战:用Q3DScatter在C++中实现动态3D点云可视化(附完整源码)
  • OBS StreamFX插件深度解析:12个高级特效实现原理与实战指南
  • Kandinsky-5.0-I2V-Lite-5s镜像免配置优势:预装VAE/CLIP/Qwen2.5-VL依赖详解
  • 2026年市场上Geo获客投放,究竟有何独特魅力与效果?
  • 避开这些坑!Unity WebGL本地部署Nginx的5个关键配置点
  • 04华夏之光永存:黄大年茶思屋榜文解法「第3期4题」
  • 2026年PCB在线清洗机选型指南:PCB在线清洗机/PCB清洗机/SMT行业清洗机/刮刀清洗机/半导体清洗机/选择指南 - 优质品牌商家
  • 2026滚动喷漆加工哪家强:电泳涂装加工/电泳烤漆加工/五金彩色电泳加工/五金滚动喷漆加工/五金滚喷漆加工/五金烤漆加工/选择指南 - 优质品牌商家
  • AI原生供应商尽调必查的9个代码层证据:从Dockerfile中CUDA版本锁定,到LangChain trace日志留存策略(附自动化扫描脚本)
  • Python网络爬虫高级技巧:从入门到精通