从零到一:手把手教你用SpringBoot+MyBatis搭建Tlias智能学习辅助系统后端(附完整源码)
2026/4/6 12:49:55 网站建设 项目流程
SpringBootMyBatis实战构建智能学习辅助系统后端全流程1. 项目架构设计与技术选型在当今企业级应用开发中SpringBoot和MyBatis的组合已成为Java后端开发的黄金标准。本系统采用经典的三层架构设计技术栈对比表技术组件优势在本系统中的应用场景SpringBoot 2.7快速启动、自动配置项目基础框架MyBatis 3.5SQL灵活可控、动态SQL支持数据持久层实现MySQL 8.0关系型数据库、事务支持业务数据存储Lombok简化POJO开发实体类Getter/Setter生成PageHelper分页插件员工数据分页查询项目目录结构src/main/java ├── com.tlias │ ├── config # 配置类 │ ├── controller # 控制层 │ ├── service # 业务层 │ ├── mapper # 持久层 │ ├── pojo # 实体类 │ ├── utils # 工具类 │ └── aspect # AOP切面2. 数据库设计与实体映射系统核心业务围绕部门管理和员工管理展开数据库设计遵循第三范式部门表SQLCREATE TABLE dept ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 部门ID, name VARCHAR(10) NOT NULL UNIQUE COMMENT 部门名称, create_time DATETIME NOT NULL COMMENT 创建时间, update_time DATETIME NOT NULL COMMENT 修改时间 ) COMMENT 部门表;员工表SQLCREATE TABLE emp ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 员工ID, username VARCHAR(20) NOT NULL UNIQUE COMMENT 用户名, password VARCHAR(32) DEFAULT 123456 COMMENT 密码, name VARCHAR(10) NOT NULL COMMENT 姓名, gender TINYINT UNSIGNED NOT NULL COMMENT 性别(1男,2女), image VARCHAR(300) COMMENT 头像URL, job TINYINT UNSIGNED COMMENT 职位, entrydate DATE COMMENT 入职日期, dept_id INT UNSIGNED COMMENT 部门ID, create_time DATETIME NOT NULL COMMENT 创建时间, update_time DATETIME NOT NULL COMMENT 修改时间 ) COMMENT 员工表;实体类示例Data NoArgsConstructor AllArgsConstructor public class Dept { private Integer id; private String name; private LocalDateTime createTime; private LocalDateTime updateTime; }3. SpringBoot工程初始化关键依赖配置dependencies !-- SpringBoot基础依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis整合 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.0/version /dependency !-- MySQL驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies数据库连接配置# application.properties spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/tlias?useSSLfalseserverTimezoneUTC spring.datasource.usernameroot spring.datasource.password123456 # MyBatis配置 mybatis.configuration.map-underscore-to-camel-casetrue mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl4. RESTful接口设计与实现采用REST风格设计API接口遵循以下规范REST接口设计原则使用HTTP动词表示操作类型GET/POST/PUT/DELETE资源使用复数名词形式状态码遵循HTTP标准部门管理接口示例RestController RequestMapping(/depts) public class DeptController { Autowired private DeptService deptService; GetMapping public Result list() { ListDept deptList deptService.list(); return Result.success(deptList); } DeleteMapping(/{id}) public Result delete(PathVariable Integer id) { deptService.delete(id); return Result.success(); } PostMapping public Result add(RequestBody Dept dept) { deptService.add(dept); return Result.success(); } PutMapping public Result update(RequestBody Dept dept) { deptService.update(dept); return Result.success(); } }统一响应封装Data NoArgsConstructor AllArgsConstructor public class Result { private Integer code; private String msg; private Object data; public static Result success() { return new Result(1, success, null); } public static Result success(Object data) { return new Result(1, success, data); } public static Result error(String msg) { return new Result(0, msg, null); } }5. MyBatis动态SQL实战XML映射文件示例!-- DeptMapper.xml -- mapper namespacecom.tlias.mapper.DeptMapper select idlist resultTypecom.tlias.pojo.Dept SELECT id, name, create_time, update_time FROM dept /select delete iddeleteById DELETE FROM dept WHERE id #{id} /delete /mapper动态SQL应用!-- 员工条件分页查询 -- select idlist resultTypecom.tlias.pojo.Emp SELECT * FROM emp where if testname ! null and name ! name LIKE CONCAT(%,#{name},%) /if if testgender ! null AND gender #{gender} /if if testbegin ! null and end ! null AND entrydate BETWEEN #{begin} AND #{end} /if /where ORDER BY update_time DESC /select6. 分页查询优化方案原生分页与PageHelper对比分页方式SQL编写复杂度性能功能丰富度LIMIT语句高优低PageHelper低良高PageHelper整合步骤添加依赖dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version1.4.2/version /dependency业务层实现Override public PageBean page(Integer page, Integer pageSize) { // 设置分页参数 PageHelper.startPage(page, pageSize); // 执行查询 ListEmp empList empMapper.list(); PageEmp p (PageEmp) empList; // 封装分页结果 PageBean pageBean new PageBean(p.getTotal(), p.getResult()); return pageBean; }7. 文件上传与云存储本地存储方案PostMapping(/upload) public Result upload(MultipartFile image) throws IOException { // 原始文件名 String originalFilename image.getOriginalFilename(); // 使用UUID生成新文件名 String extname originalFilename.substring(originalFilename.lastIndexOf(.)); String newFileName UUID.randomUUID() extname; // 存储文件 image.transferTo(new File(D:/images/newFileName)); return Result.success(/images/newFileName); }阿里云OSS集成Component public class AliOSSUtils { Value(${aliyun.oss.endpoint}) private String endpoint; Value(${aliyun.oss.accessKeyId}) private String accessKeyId; Value(${aliyun.oss.accessKeySecret}) private String accessKeySecret; Value(${aliyun.oss.bucketName}) private String bucketName; public String upload(MultipartFile file) throws IOException { // 创建OSSClient实例 OSS ossClient new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 生成随机文件名 String fileName UUID.randomUUID() file.getOriginalFilename(); // 上传文件流 ossClient.putObject(bucketName, fileName, file.getInputStream()); // 生成访问URL String url endpoint.split(//)[0] // bucketName . endpoint.split(//)[1] / fileName; ossClient.shutdown(); return url; } }8. 登录认证与JWT集成JWT工具类实现public class JwtUtils { private static String signKey tlias; private static Long expire 3600000L; public static String generateJwt(MapString, Object claims) { return Jwts.builder() .addClaims(claims) .signWith(SignatureAlgorithm.HS256, signKey) .setExpiration(new Date(System.currentTimeMillis() expire)) .compact(); } public static Claims parseJWT(String jwt) { return Jwts.parser() .setSigningKey(signKey) .parseClaimsJws(jwt) .getBody(); } }登录接口实现PostMapping(/login) public Result login(RequestBody Emp emp) { Emp loginEmp empService.login(emp); if(loginEmp ! null) { MapString, Object claims new HashMap(); claims.put(id, loginEmp.getId()); claims.put(username, loginEmp.getUsername()); claims.put(name, loginEmp.getName()); String token JwtUtils.generateJwt(claims); return Result.success(token); } return Result.error(用户名或密码错误); }9. 全局异常处理机制统一异常处理器RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(Exception.class) public Result handleException(Exception ex) { ex.printStackTrace(); return Result.error(操作失败请联系管理员); } ExceptionHandler(SQLIntegrityConstraintViolationException.class) public Result handleSQLException(SQLIntegrityConstraintViolationException ex) { String message ex.getMessage(); if(message.contains(Duplicate entry)) { return Result.error(数据已存在); } return Result.error(数据库操作异常); } }10. AOP实现操作日志记录日志切面实现Aspect Component Slf4j public class LogAspect { Autowired private HttpServletRequest request; Autowired private OperateLogMapper operateLogMapper; Around(annotation(com.tlias.annotation.Log)) public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable { // 获取操作人信息 String token request.getHeader(token); Claims claims JwtUtils.parseJWT(token); Integer operateUser (Integer) claims.get(id); // 记录开始时间 long beginTime System.currentTimeMillis(); // 执行原始方法 Object result joinPoint.proceed(); // 记录结束时间 long endTime System.currentTimeMillis(); long costTime endTime - beginTime; // 记录操作日志 OperateLog operateLog new OperateLog(); operateLog.setOperateUser(operateUser); operateLog.setOperateTime(LocalDateTime.now()); operateLog.setClassName(joinPoint.getTarget().getClass().getName()); operateLog.setMethodName(joinPoint.getSignature().getName()); operateLog.setMethodParams(Arrays.toString(joinPoint.getArgs())); operateLog.setReturnValue(JSONObject.toJSONString(result)); operateLog.setCostTime(costTime); operateLogMapper.insert(operateLog); log.info(操作日志记录{}, operateLog); return result; } }11. 系统安全防护策略安全防护措施SQL注入防护使用MyBatis预编译机制XSS攻击防护Jackson全局HTML转义CSRF防护Spring Security默认启用数据脱敏敏感字段加密存储接口幂等性Token机制防止重复提交安全配置示例Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers(/login).anonymous() .anyRequest().authenticated(); } }12. 项目部署与性能优化部署方案对比部署方式启动速度资源占用适用场景内嵌Tomcat快低开发测试环境外置Tomcat慢中传统部署环境Docker容器化中低云原生环境JVM调优参数java -jar -Xms512m -Xmx1024m -XX:UseG1GC \ -XX:MaxGCPauseMillis200 -XX:ParallelGCThreads4 \ -XX:ConcGCThreads2 tlias-web-management.jar缓存优化方案Cacheable(value deptCache, key #id) public Dept getById(Integer id) { return deptMapper.getById(id); } CacheEvict(value deptCache, key #dept.id) public void update(Dept dept) { deptMapper.update(dept); }通过以上完整实现我们构建了一个功能完善、安全可靠的智能学习辅助系统后端。系统采用模块化设计各层职责明确通过AOP实现了横切关注点的统一处理利用SpringBoot的自动配置特性简化了开发流程MyBatis提供了灵活的SQL控制能力整体架构既保证了开发效率又确保了系统性能。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询