执行测试类初始化错误
来源:5-2 自由编程
周鸿宁
2020-03-20 17:00:39
package com.imooc.ibatis; import com.imooc.mybatis.entity.Student; import com.imooc.mybatis.utils.MyBatisUtils; 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.Reader; import java.sql.Connection; import java.util.List; public class Testor { @Test public void testSqlSessionFactory() throws IOException { //利用Reader加载classpath下的mybatis-config.xml核心配置文件 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); //初始化SqlSessionFactory对象,同时解析mybatis-config.xml文件 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); System.out.println("SessionFactory加载成功"); SqlSession sqlSession = null; try { //创建SqlSession对象,SqlSession是JDBC的扩展类,用于与数据库交互 sqlSession = sqlSessionFactory.openSession(); //创建数据库连接(测试用) Connection connection = sqlSession.getConnection(); System.out.println(connection); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { //如果type="POOLED",代表使用连接池,close则是将连接回收到连接池中 //如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关闭连接 sqlSession.close(); } } } @Test public void testSelectAll(){ SqlSession session=null; try { session= MyBatisUtils.openSession(); List<Student>list =session.selectList("student.selectAll"); for(Student s :list){ System.out.println(s.getName()); } }catch (Exception e){ throw e; }finally { MyBatisUtils.closeSession(session); } } public void testInsert(){ SqlSession session=null; try{ session=new MyBatisUtils().openSession(); Student student= new Student(); student.setRegNo(2020031901); student.setName("testStudent"); student.setSex("male"); student.setAge(25); student.setGrade("大二"); student.setMajor("computer"); int num=session.insert("student.insert",student); session.commit(); System.out.println(student.getId()); }catch(Exception e){ if(session!=null){ session.rollback(); }throw e; }finally { MyBatisUtils.closeSession(session); } } }
mybatis-comfig.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="mapUnderscoreTocamlCase" value="ture"/> </settings> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8 "/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/student.xml"></mapper> </mappers> </configuration>
student.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="student"> <select id="selectAll" resultType="com.imooc.mybatis.entity.Student"> select * from student </select> <!--flushCache="true"在sql执行后强制清空缓存--> <insert id="insert" parameterType="com.imooc.mybatis.entity.Student" flushCache="true"> INSERT INTO student(reg_no, name, sex, age, grade, major) VALUES (#{reg_no} , #{name} , #{sex}, #{age}, #{grade}, #{major}) <selectKey resultType="Integer" keyProperty="id" order="AFTER"> select last_insert_id() </selectKey> </insert> </mapper>
MyBatisUtils.java
package com.imooc.mybatis.utils; 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 java.io.IOException; import java.io.Reader; /** * MyBatisUtils工具类,创建全局唯一的SqlSessionFactory对象 */ public class MyBatisUtils { //利用static(静态)属于类不属于对象,且全局唯一 private static SqlSessionFactory sqlSessionFactory = null; //利用静态块在初始化类时实例化sqlSessionFactory static { Reader reader = null; try { reader = Resources.getResourceAsReader("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); //初始化错误时,通过抛出异常ExceptionInInitializerError通知调用者 throw new ExceptionInInitializerError(e); } } /** * openSession 创建一个新的SqlSession对象 * @return SqlSession对象 */ public static SqlSession openSession(){ //默认SqlSession对自动提交事务数据(commit) //设置false代表关闭自动提交,改为手动提交事务数据 return sqlSessionFactory.openSession(false); } /** * 释放一个有效的SqlSession对象 * @param session 准备释放SqlSession对象 */ public static void closeSession(SqlSession session){ if(session != null){ session.close(); } } }
entity.student.java
package com.imooc.mybatis.entity; public class Student { private Integer id; private Integer regNo; private String name; private String sex; private Integer age; private String grade; private String major; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getRegNo() { return regNo; } public void setRegNo(Integer regNo) { this.regNo = regNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } }
1回答
好帮手慕阿满
2020-03-20
同学你好,问一下同学是执行哪个测试时报错?通常初始化错误都会指向MyBatisUtils.closeSession(session);这句代码,建议同学将这个代码注释一下,查看具体的报错。建议同学如果执行代码报错,请将报错信息贴一下。
祝:学习愉快~
相似问题