Mybatis在idea基础配置和找不到resources错误的解决
文章目录
前言
前段时间老师让自行导入Mybatis框架和进行基础的查询操作,在网上找了教程配置后运行总会有找不到resources错误
项目结构和代码
项目结构图(maven项目)
接口类和实体类:
package com.stuDB.DAO;
import com.stuDB.test.Student;
import java.util.List;
/**
* Description:
*
* @author Aloha
* @date 2021/3/21 0021 22:37
*/
public interface IStudent {
List<Student> findAll();
}
package com.stuDB.test;
import java.io.Serializable;
/**
* Description:
*
* @author Aloha
* @date 2021/3/21 0021 22:34
*/
public class Student implements Serializable {
private int Sno;
private String Sname;
public void setSno(int sno) {
Sno = sno;
}
public int getSno() {
return Sno;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
@Override
public String toString() {
return "Student{" +
"Sno=" + Sno +
", Sname='" + Sname + '\'' +
'}';
}
}
测试类:
package com.stuDB;
import com.stuDB.DAO.IStudent;
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 com.stuDB.test.Student;
import java.io.InputStream;
import java.util.List;
class MybatisTest {
public static void main(String[] args) throws Exception{
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("sqlMapconfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession sqlSession = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IStudent is = sqlSession.getMapper(IStudent.class);
//5.使用代理对象执行方法
List<Student> students = is.findAll();
for(Student ss : students){
System.out.println(ss);
}
//6.释放资源
sqlSession.close();
in.close();
}
}
sqlMapconfig.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>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql的环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/schooldb?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="18436104"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="com/stuDB/DAO/IStudent.xml"/>
</mappers>
</configuration>
如mapper路径,配置mapper.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">
<!--namespace指的是你的dao接口-->
<mapper namespace="com.stuDB.DAO.IStudent">
<!--配置查询所有 其中id不能乱写必须是dao接口中的方法 resultType写的是实体类的全路径-->
<select id="findAll" resultType="com.stuDB.test.Student">
SELECT sno,sname FROM student
</select>
</mapper>
log4j.properties配置文件:
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=【%c】-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=【%p】【%d{yy-MM-dd}】【%c】%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
数据库:
解决办法:
然后自己一行行Debug,找了些解决办法总结了一下,可能的原因有,如
1.导包错误
import org.apache.ibatis.io.Resources;`
正确的resources包应该如此路径导入,但是看其他大佬的博客说同时在读取配置文件时应该添加.class方法,对比如下
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("sqlMapconfig.xml");
(修改后)
InputStream in = Resources.class.getResourceAsStream("sqlMapconfig.xml");
这样修改后错误确实没有了,但是在创建SqlSessionFactory工厂时会报空指针错误
我也不能解释为什么会这样。。所有又老老实实的改了回去重新找解决办法,有大佬知道的话欢迎留言
2.sqlMapconfig配置文件ID不一致
在程序运行时,映射文件时依靠id来确定客户端,ID和默认default所以必须一致
3.映射文件中namespace路径错误
namespace对应的必须是映像文件对于的接口路径
4.pom.xml中配置build属性便于程序找到配置文件
这个我觉得影响应该不大
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>com/stuDB/sqlMapconfig.xml</include>
</includes>
</resource>
</resources>
</build>
4.接口类和映射配置文件路径不对应
这个我上面说过的,一定要保证路径对应一致
5.我最后的解决办法
最后的最后我实在没找到原因,问了老师后把测试类中resources地址改为路径名:
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("com/stuDB/sqlMapconfig.xml");
然后。。。
就成功了
其实我压根不是一个粗心的人 这次错误也让我反思并写下了这篇博客,希望自己以后踏入工作的时候不要犯这种低级错误并且要多去尝试不同的写法和方法,多多动手。
有不对的表达欢迎大佬们指正!
ALOHA