首先声明,个人用的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数据库,可能和依赖有关系;