尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

spring练习——构建项目时候的注意点+Mapper理解+MyBatis学习点总结+报错学习

spring练习——构建项目时候的注意点+Mapper理解+MyBatis学习点总结+报错学习 构建项目注意点MyBatis配置模版1.spring.datasource.driver-class-name驱动类名当前值com.mysql.cj.jdbc.Driver怎么填直接保持不变。这个是新版 MySQL 驱动MySQL 8.0的标准写法。注意如果你用的是非常老的 MySQL 5.7 且驱动包版本低于 6.0才需要改成com.mysql.jdbc.Driver少个.cj否则就用现在的。2.spring.datasource.url数据库连接地址——重点看这里当前值jdbc:mysql://localhost:3306/springboot-vue?...怎么填拆解来看localhost:3306不用改除非你的 MySQL 装在别的服务器或改了端口。springboot-vue这是数据库名称必须改成你实际创建的库名之前建表时我用的是demo_db如果你建库时用了demo_db这里就必须改成jdbc:mysql://localhost:3306/demo_db?...如果你在 Navicat 或命令行里实际创建的库叫test或mybatis_db这里就填什么。后面的参数useUnicode...保持不动这是防止乱码和时区报错的。3.spring.datasource.username数据库用户名当前值root怎么填一般不用改。这是 MySQL 的超级管理员账号。如果你当初安装 MySQL 时设置了别的用户名就填那个。4.spring.datasource.password数据库密码——最容易报错的地方当前值123怎么填必须改成你安装 MySQL 时设置的root密码注意如果你的 root 密码不是123比如是root、123456或空密码启动项目时就会报Access denied错误。请务必确认你的 MySQL 真实密码。✅ 给你一个最稳妥的填写方案基于之前的教程如果你之前没有手动创建过名为springboot-vue的库建议把它改掉。最终推荐的完整配置如下假设你按我上条回复建了demo_db库且密码是123propertiesspring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/demo_db?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password123⚠️ 最后检查一个小细节如果你的 MySQL 版本是8.0且url中没加serverTimezone会报时区错误你现在的配置里有serverTimezoneAsia/Shanghai这点做得很好不需要动。改完之后启动项目如果报连不上优先检查密码和数据库名springboot-vue / demo_db是否真实存在。你可以先在命令行用mysql -uroot -p123试试能不能登进去。 MySQL 装在云服务器上但代码在本地跑远程连接如果你本地电脑上没有MySQL数据库实际在云服务器上那么localhost必须改成云服务器的公网 IP。示例jdbc:mysql://123.123.123.123:3306/demo_db?...password填云服务器上 MySQL 的真实密码大概率不是123是你设的复杂密码。⚠️ 远程连接云服务器 MySQL 必做 3 步否则 100% 报错云控制台放行端口去阿里云/腾讯云/华为云后台找到“安全组”添加入方向规则端口 3306授权对象先临时设为0.0.0.0/0测试完记得改成你本地电脑的公网 IP。登录云服务器 MySQL 开启远程权限必须操作sql-- 允许 root 从任意主机连接测试用 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 你的密码 WITH GRANT OPTION; FLUSH PRIVILEGES;检查 MySQL 配置文件/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf找到bind-address 127.0.0.1改成0.0.0.0然后重启 MySQLsystemctl restart mysql。text模版spring.datasource.urljdbc:mysql://123.123.123.123:3306/demo_db?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue拆解一下?后面每个参数的作用方便你理解参数值作用必填/推荐useUnicodetrue必填。启用 Unicode 字符集转换防止中文乱码。characterEncodingUTF-8必填。指定编码格式为 UTF-8配合上面使用。serverTimezoneAsia/Shanghai必填MySQL 8.0。指定时区为上海否则会报时区错误。useSSLfalse强烈推荐。关闭 SSL 加密连接。云服务器远程连接时开启 SSL 需要配置证书非常麻烦本地开发直接关掉最省心。allowPublicKeyRetrievaltrue推荐。允许客户端获取服务器的公钥。当useSSLfalse且使用caching_sha2_passwordMySQL 8 默认认证时必须加这个参数否则会报Public Key Retrieval is not allowed错误。⚠️ 云服务器 IP 的额外提醒非常重要因为你填的是公网 IP123.123.123.123除了这串 URL 写对云服务器的安全组和 MySQL 权限必须配置好否则启动项目会报连接超时Communications link failure云控制台放行 3306 端口入方向规则。MySQL 必须开启远程访问权限登录云服务器 MySQL 执行sqlGRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 你的密码 WITH GRANT OPTION; FLUSH PRIVILEGES;修改 MySQL 配置文件云服务器上将bind-address 127.0.0.1改为bind-address 0.0.0.0然后重启 MySQL。把上面这整行url复制到你的application.properties或application.yml中把123.123.123.123换成你真实的云服务器 IP密码填对就可以连上了。Mapper SUMMARY必须搞懂的几个点1.#{}和${}的区别面试必问#{id}预编译占位符MyBatis 会转成?帮你防 SQL 注入 ✅ 99% 情况用它${id}字符串拼接直接把值拼进 SQL有注入风险 ⚠️ 只有动态表名/列名等少数情况用2. 字段名映射的坑数据库列update_time下划线和 Java 属性updateTime驼峰对不上怎么办两种办法properties复制# 办法一全局开启驼峰映射推荐 mybatis.configuration.map-underscore-to-camel-casetruejava复制// 办法二SQL 里起别名 Select(SELECT update_time AS updateTime FROM user)3. 注解式 vs XML 式注解式SQL 写在接口方法上适合简单 SQL就是上面那样XML 式SQL 写在resources/mapper/UserMapper.xml里适合复杂 SQL多表联查、动态 SQLxml复制!-- resources/mapper/UserMapper.xml -- mapper namespacecom.example.demo.dao.UserMapper select idfindAll resultTypecom.example.demo.entity.User SELECT * FROM user WHERE age #{minAge} /select /mapper两种可以混用XML 是 MyBatis 的完全体注解只是快捷方式。4. 动态 SQL复杂查询的核心if、where、foreach这些标签让你按条件拼 SQL比如年龄和姓名都是可选条件xml复制select idsearch resultTypeUser SELECT * FROM user where if testname ! nullAND name #{name}/if if testage ! nullAND age #{age}/if /where /select别忘了还有 MyBatis-Plus现在的主流你本地仓库里有mybatis-plus 3.5.3.1。MyBatis-Plus 是 MyBatis 的增强版连 SQL 都不用写BaseMapper自带增删改查java复制Mapper public interface UserMapper extends BaseMapperUser { // 一个方法都不用写自带 // selectList(null) / selectById(1) / insert(user) / updateById(user) / deleteById(1) ... } // 用法 ListUser users userMapper.selectList(null); // 全查 User u userMapper.selectById(1); // 按 id 查 userMapper.insert(user); // 插入报错的分析英文一、先学会看结构一段报错长啥样Exception in thread main java.lang.NullPointerException ← 第1行异常类型 一句话描述 at com.example.demo.dao.UserDao.findAll(UserDao.java:42) ← 调用栈哪个类哪一行抛的 at com.example.demo.service.UserService.findAll(UserService.java:20) at com.example.demo.controller.BasicController.list(BasicController.java:18) Caused by: java.io.FileNotFoundException: static/user.txt ← Caused by: 才是根因 at ...三条铁律看第一行的异常类型NullPointerException、FileNotFoundException…它决定了问题类别。at开头的是调用栈stack trace一行接一行往上追溯是谁调用了谁。真正定位要找最上面那个指向你自己项目的at行com.example.demo...开头的那行就是你代码里出错的地方。Caused by:后面才是根因。很多时候外层异常如BeanCreationException只是包装真正的病根在最后一个Caused by:里。所以从最底下往上读。二、常见异常英文速查表运行时异常红字一大片英文含义常见原因NullPointerException(NPE)空指针对 null 调方法/取属性变量没赋值、getXxx()返回 null、getResourceAsStream找不到文件返回 nullClassCastException类型转换失败(String) obj但 obj 不是 StringNumberFormatException字符串转数字失败Integer.parseInt(abc)常见于解析文本/JSONArrayIndexOutOfBoundsException数组越界parts[5]但这一行只有 4 段比如逗号分隔的数据不齐StringIndexOutOfBoundsException字符串下标越界substring()参数超出长度IllegalArgumentException非法参数方法收到不合法值如空字符串、负数IllegalStateException非法状态对象状态不对如流已关闭还在用IndexOutOfBoundsException下标越界总称List/数组越界ConcurrentModificationException并发修改遍历 List 时又往里 add/removeStackOverflowError栈溢出无限递归方法不停调自己OutOfMemoryError内存溢出加载太多数据/没释放连接类与依赖相关最常见于启动失败英文含义ClassNotFoundException: xxx运行时找不到某个类缺 jar 或 jar 版本不对NoClassDefFoundError: xxx类在编译时有、运行时丢了NoSuchMethodError: xxx方法签名对不上典型的 jar 版本冲突比如 Spring 5 和 6 混用UnsatisfiedDependencyException依赖注入失败比如构造器要的 Bean 没有NoSuchBeanDefinitionException容器里没有这个 Bean忘了加Service/RepositoryBeanCreationException创建 Bean 失败后面往往跟Caused by:真因文件 / 网络 / 数据库英文含义FileNotFoundException文件不存在或路径不对Connection refused/ConnectException连不上端口没开/服务没启动/IP 错了UnknownHostException域名解析不了hosts 或 DNS 问题Address already in use: bind/Port 8080 was already in use端口被占用换个端口或杀掉占用进程SocketTimeoutException连接/读取超时SQLException/CannotGetJdbcConnection连数据库失败URL、账号密码、驱动问题bad SQL grammarSQL 语法错误DataIntegrityViolationException数据违反约束主键重复、外键失败、非空字段为空Spring Boot 特有英文含义Failed to configure a DataSource没配数据源。后面常跟Consider the following: If you want an embedded database...意思是你引入了数据库依赖但没配连接Error creating bean with name xxx创建 xxx 这个 Bean 失败看 Caused by 找真因Whitelabel Error Page页面显示这个 后端抛了 500打开浏览器 F12 → Network 看具体报错HTTP 状态码前端看到的现象状态码英文含义400Bad Request请求参数格式不对401Unauthorized没登录/没带 token403Forbidden没权限404Not Found路径不存在URL 写错、Controller 没这个映射405Method Not Allowed方法不对GET 的接口用 POST 调了500Internal Server Error后端代码炸了看后端控制台日志502/503Bad Gateway / Service Unavailable网关/服务没起来编译期报错IDE 里红波浪线英文含义cannot find symbol找不到符号——类/方法/变量名写错或没导入咱们上次的com.sun.tools.doclint.Entity.part就是这个package xxx does not exist包不存在——缺 import 或缺依赖incompatible types类型不匹配上次的return userList返回String就是它cannot be applied to given types方法参数个数/类型不对required: ... found: ...需要什么类型、给了什么类型三、用咱们这次遇到的真实报错拆解例子 1编译期复制D:\...\BasicController.java:61: error: incompatible types: return userList; ^ required: String found: ListUser→ 一眼定位第 61 行方法声明要返回String实际给的是ListUser。改返回类型即可。例子 2编译期乱码也挡不住复制BasicController.java:31: 错误: 找不到符号 import static com.sun.tools.doclint.Entity.part;→找不到符号 cannot find symbol说明com.sun.tools.doclint.Entity.part这个东西不存在/不可见。就算英文原版是package com.sun.tools.doclint is not visible本质就一句话import 的东西不存在。例子 3Maven 构建期复制[ERROR] Non-resolvable import POM: ... spring-boot-dependencies:pom:2.7.6 (absent): Cannot access aliyunmaven (https://maven.aliyun.com/repository/public) in offline mode→ 拆开看关键词Non-resolvable 解析不了下载不到(absent) 仓库里没有Cannot access ... in offline mode 离线模式下无法访问镜像结论没网 本地仓库没有这个包。所以上次我说这是环境问题不是代码问题依据就是这几个词。四、实操技巧总结看日志的先后顺序先看异常类型 → 找Caused by:→ 找指向你自己代码的第一个at行。at行里带文件名行号(BasicController.java:61)直接点过去看。跳过噪音at org.apache.maven...、at java.base...、at org.springframework...这些框架内部的行一般不用管重点看你项目包名com.example.demo下的行。陌生英文别慌抓住异常类型名 最后一句描述丢进翻译或搜索引擎基本都有答案。固定搭配看到incompatible types、cannot find symbol、required/found、already in use、refused、does not exist、is missing、could not be resolved、failed to中文意思基本一眼可猜。
返回列表