spring整合mybatis errorCode 1045, state 28000

spring整合mybatis报错1045

1.用户名密码错误,使用navicat连接成功说明用户密码没有错误

2.外部连接,这个问题也不存在,是本地连接

3.配置文件读取错误,properties文件中将用户名的键设置成了username导致和本地主机名冲突,我用的jdbc.username,所以这个问题也能排除

4.properties文件中用户名或者密码后多了空格导致报错

常用方法都试了一遍还是没找到解决办法,尝试用mysql直接连接数据库看看是否有问题

public class test2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai", "root", "root");
        String sql = "select * from stu";
        Statement stmt = conn.createStatement();
        ResultSet resultSet = stmt.executeQuery(sql);
        while(resultSet.next()){
            System.out.println(resultSet.getString(2));
        }
    }

连接成功数据也显示出来了,说明问题还是在mybatis和spring整合上面

最终错误druid设置数据源有两个方法

dataSource.setUsername("root");
dataSource.setName("root");

错误的使用了下面这个方法,导致用户名一直为空,所以无法连接数据库

 

在使用 MyBatis 进行数据库操作时,开发者可能会遇到 `uncategorized SQLException` 异常,其表现为 SQL state 为 `null`、error code 为 `0`,并伴有 `java.sql.SQLException` 的嵌套异常信息。这类问题通常表明底层 JDBC 驱动在执行 SQL 语句时遇到了无法分类的错误,且未提供标准的 SQL 状态码或错误代码[^2]。 ### 常见原因与解决方案 #### 1. SQL 语句格式错误 SQL 注入校验失败或语法错误是常见原因。例如,在使用 `<foreach>` 标签构造 `IN` 子句时,若传入的集合为空或未正确处理,可能导致生成的 SQL 语句不完整,从而引发异常。例如: ```xml <select id="queryByIdList" resultMap="inboundDetailMap"> select * from <include refid="TABLE_NAME"/> where id in <foreach collection="idList" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> </select> ``` 如果 `idList` 为空,上述 SQL 将生成类似 `where id in` 而没有后续内容,导致语法错误。解决方法是在 `<foreach>` 标签外包裹 `<if>` 判断,确保集合非空后再构造 `IN` 子句[^2]。 #### 2. 数据类型不匹配 当数据库返回的字段值与 Java Bean 的属性类型不兼容时,也可能引发此类异常。例如,若数据库字段允许 `NULL` 值,而对应的 Java 属性为基本类型(如 `int`),则在映射时会因无法将 `NULL` 转换为基本类型而抛出异常。解决方案是将基本类型改为对应的包装类型(如将 `int` 改为 `Integer`),以支持 `null` 值的映射[^3]。 #### 3. 配置问题 在某些情况下,MyBatis 或底层数据库连接池的配置不当也可能导致此类异常。例如,连接池配置错误、事务管理器未正确启用或 SQL 拦截器配置不当时,可能会在执行 SQL 时抛出未分类异常。建议检查配置文件,确保数据库连接、事务管理及 SQL 拦截器等组件配置正确。若使用 Spring Boot,可尝试通过注解方式简化配置,如使用 `@EnableConfigurationProperties` 或移除冗余的 XML 配置[^4]。 #### 4. 驱动兼容性问题 不同数据库驱动版本之间可能存在兼容性问题。例如,Oracle JDBC 驱动在处理某些 SQL 语句时,若使用了不支持的操作(如批量插入时未启用批处理模式),可能会抛出 `SQLException: 不允许的操作`。解决方法包括升级 JDBC 驱动、启用批处理模式(如使用 `addBatch()` 和 `executeBatch()`)或调整 SQL 语句结构以符合数据库规范[^1]。 ### 示例修复代码 针对 SQL 注入校验失败的问题,修正后的 XML 配置如下: ```xml <select id="queryByIdList" resultMap="inboundDetailMap"> select * from <include refid="TABLE_NAME"/> <where> <if test="idList != null and idList.size() > 0"> and id in <foreach collection="idList" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> </if> </where> </select> ``` 通过 `<if>` 标签确保 `idList` 非空时才构造 `IN` 子句,避免生成无效 SQL。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值