org.apache.ibatis.exceptions.PersistenceException:报错处理,Mybatis入门案例(不使用三级分层开发)

Mybatis报错与解决方案:JDK9连接MySQL的配置问题
这篇博客介绍了在JDK9环境下,使用mybatis-3.27.jar版本遇到的报错问题,包括ClassNotFoundException: com.mysql.jc.jdbc.Driver。作者分析了错误原因并提供了解决方案,如修改driver、注意框架版本与JDBC依赖版本的匹配,以及处理编码集问题。同时,文章强调了配置文件的正确性和项目结构的重要性,并给出了相关配置文件和测试类的代码示例。

首先声明,个人用的JDK9 ,使用的mybatis-3.27.jar  版本;

JDK9 连接Mysql数据库,jdbc.properties的配置,需要经过cj

但是可能使用的mybatis版本和连接数据库依赖包版本较低,报错没有找到Cannot find class: com.mysql.jc.jdbc.Driver

修改driver,可以解决。

(PS;错误太低级了,害的从新敲了三级架构大改,以为配置文件mapper 的 namespace直接指定实体类不行,使用三级分层开发创建DAO层大改后,可以跑。

然后又报错说数据库中没有user表,记得清楚备份了数据库,回去看了下果然没有user  table    ,)

报错分析;

org.apache.ibatis.exceptions.PersistenceException:

Error querying database.

Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.jc.jdbc.Driver

 

修改后运行如下;

 


 

附上代码如下;

核心配置文件Mybatis.xml;

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbc.properties"/>
<!--

    <typeAliases>
        <typeAlias type="model.User" alias="user"/>
    </typeAliases>


-->

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.DriverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--<package name="config"></package>-->
        <mapper resource="UserDao.xml"></mapper>
    </mappers>
</configuration>

 

表配置文件(注意,一张表对应一个xxx.xml配置文件,这里mapper配置没有采用扫包形式);

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="model.User">
<!-- #{}代表占位符?,表示mybatis框架会接收输入的参数并赋值到sql语句当中
      关于简单类型(int,String,date。long)可以使用value来代表参数名
 -->
 <select id="findUserById"  resultType="model.User">
  select * from user where id=#{id}
 </select>
</mapper>

JDBC配置文件;

jdbc.DriverClassName=com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/zhaoliying?serverTimeZone=UTC&useSSL=false
jdbc.username=root
jdbc.password=root

配置文件结构目录;

 

 

测试类;

package Test;

import model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;


import java.io.IOException;
import java.io.InputStream;

/**
 * @auther SyntacticSugar
 * @data 2018/9/11 0011上午 12:24
 */
public class Demo1 {

    @Test
    public void test1() {
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            SqlSession session = factory.openSession();
            int id = 2;
            User o = (User) session.selectOne("model.User.findUserById", id);
            System.out.println(o);
            session.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

总结;一定注意框架的版本,以及连接的数据库的依赖版本,和本身JDK的版本(JDK9新特性以及连接数据库JDBC更新带来的影响);

有时间自测下新版本Mybatis框架,以及Mysql 依赖,应该driver会遵循JDK9   连接数据库的要求;

 

最后,感谢赵老哥不断测试,虽然一直用三级分成开发大改,中间Junit单元测试仍出错,是因为版本不同,改mybatis框架支持的Junit版本不能过高(PS:个人也倾向于三级分层开发,只能说入门太难)。

 


使用最新版本mybatis,以及mysql测试,会报错;

找不到前言(PS;是因为编码集问题,我勒个去);

Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。

使用Noetepad++      操作下(是因为配置文件中存在UTF-8有BOM格式或者GBK 格式的,设置全局配置都为UTF-8无BOM格式);

然后又出现了

Cannot find class: ${jdbc.DriverClassName}

是因为没有加载jdbc.properties配置文件资源,然后又出现了;

。。。呼呼继续,看一下连接Mysql的JAR包(使用的最新版本的mysql-connector-java-8.0.12.jar  包,兼容低版本的jar,但是JDK版本是9,所以使用要求经过CJ的,而不是jc[PS;记错了记成jc了,低级错误]);

结构如下;

运行如下;

 

 

 


附上使用mysql-connector-java-8.0.12.jar  包,以及mybatis-3.4.6.jar  版本框架测试代码;

项目结构如下;

 

jdbc.properties配置文件;

jdbc.DriverClassName=com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/zhaoliying?serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=root

log4j.properties配置文件;

# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n


mybatis-config.xml配置文件;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="jdbc.properties"/>   <!--没错,就是加入这句,后面的${}的变量名才能用-->

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.DriverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="User.xml"/>
    </mappers>
</configuration>

User.xml配置文件;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">



<mapper namespace="model.User">
    <select id="findUserById"  resultType="model.User">
  select * from user where  id=#{id}
</select>
</mapper>


单元测试;

 

package test;

import model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

/**
 * @auther SyntacticSugar
 * @data 2018/9/11 0011上午 10:55
 */
public class Test01 {
    @Test
    public void test1() throws IOException {
        //加载mybatis-congfig.xml配置文件
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //创建sqlSession工厂,获取sqlSession对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        SqlSession session = factory.openSession();
        Object id=5;
        // 首个参数是 namespace+ id组成
        User o = (User)session.selectOne("model.User.findUserById", id);
        System.out.println(o);

    }

}

运行结果;

另外一个情况就是使用mysql-connector-java-6.0.6.jar   不用更改遵循CJ连接MYSQL数据库,可能和依赖有关系;

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值