weixin_43589025
fan儿
采纳率0%
2020-03-22 19:15

求问如何解决 Could not initialize class JDBC.JDBCUtil?

最近在学JDBC的类的抽取,碰上这个问题了,全程跟着视频写的代码,但是运行不出来,出现这个Could not initialize class错误,搜了一下午还是没头绪,请问各位大佬有类似经历吗,请问是怎么样解决的呢?

这个是JDBC抽取类的代码

package JDBC;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtil {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    // 资源文件读取. 因为只想加载一次,所以写在静态代码块中, 随类的加载而加载到内存(只加载一次)
    static {
        // 读取资源文件, 获取值
        try {
            //1. 创建properties集合类
            Properties pro = new Properties();

            // 获取src路径下的文件方式 --> ClassLoader 类加载器
            ClassLoader classLoader = JDBCUtil.class.getClassLoader();
            URL resource = classLoader.getResource("src/jdbc.properties");
            String path = resource.getPath();
            // System.out.println(path);

            //2. 加载文件
            // pro.load(new FileReader("F:\\JavaEE\\code\\idea_code\\coderZYGui\\day04_jdbc\\src\\jdbc.properties"));
            pro.load(new FileReader(path));

            //3. 获取数据, 赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("Driver");

            //4. 注册驱动
            Class.forName(driver);

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

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

    public static Connection getConnection() throws SQLException {

        // 写死,不好
        // return DriverManager.getConnection("jdbc:mysql://localhost:3306/zy", "root", "1111");
        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 释放资源
     *
     * @param stmt 释放执行sql语句对象
     * @param conn 释放数据库连接对象
     */
    public static void close(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     *
     * @param rs   释放结果集对象
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

这个是JDBC.properties的代码

url=jdbc:mysql:///db1
user=root
password=ftcftc321
Driver=com.mysql.jdbc.Driver

这个是对JDBCUtil抽取类的使用的代码

package JDBC;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;



/**
 * @author xf
 *定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
 */
public class Search {

    public static void main(String[] args) {
        List<Emp> list=new Search().findAll();  
        System.out.print(list);
    }

    public static List<Emp> findAll() {
        // TODO 自动生成的方法存根

         Connection conn=null;
         Statement sttm=null;
         ResultSet rs=null;


        List<Emp> list=new ArrayList<>();
        //1、注册驱动
        try {
            conn=JDBCUtil.getConnection();
            //3、定义SQL语句
            String sql="select *from emp";
            //4、执行SQL对象
            sttm=conn.createStatement();
            //5、执行SQL
            rs=sttm.executeQuery(sql);
            //6、遍历结果集
            Emp emp=null;
            while(rs.next()) {
                int ID=rs.getInt("id");
                String name=rs.getString("ename");
                int job_ID=rs.getInt("job_id");
                int mjr=rs.getInt("mjr");
                Date datetime=rs.getDate("joindate");
                double salary=rs.getDouble("salary");
                double bonus=rs.getDouble("bonus");
                int dep_ID=rs.getInt("dept_id");

                emp=new Emp();
                emp.setID(ID);
                emp.setName(name);
                emp.setJob_ID(job_ID);
                emp.setMjr(mjr);
                emp.setDatetime(datetime);
                emp.setSalary(salary);
                emp.setBonus(bonus);
                emp.setDep_ID(dep_ID);

                list.add(emp);

            }
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }finally {
            JDBCUtil.close(rs, sttm, conn);
        }
        return list;
    }

}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • Foursdream 陈zzyy 8月前

    把jdbc.properties放到src下。 然后:classLoader.getResource("jdbc.properties"); 试一下看看行不行。

    点赞 2 评论 复制链接分享
  • Muzijin0129 Muzijin0129 5月前

    我想请问一下您这个问题解决了没?

    点赞 1 评论 复制链接分享
  • weixin_44741397 GJ_HQQ 1年前

    大概意思是无法初始化,但是单单就只有这个报错是看不出什么的,建议你贴代码

    不过你先看看我说的这几个地方有没有问题,

    这个错误只要可能会出现了applicationContext.xml中的数据库配置中

    一、创建的数据源是否正确,驱动路径,数据库路径,用户名,密码,你是用的是BasicDataSource的话要导入连接池的一些jar包:dbcp,pool这类的,具体的不太记得了,如果你用的是c3p0的数据源,难么你的c3p0的包是否导入了,如果是自带的jdbc貌似不用导什么包
    二、如果你用的是Template是否创建正确,Template中的property是否引用正确,如果你用了jdbcDosuppert这个接口,那么Templae就不应该再xml中出现
    三、jar包是否导入完全正确
    四、这个因该关系不大,需要引用导jdbc的Dao是否再xml中实例化并且将数据源引用
    不知道能不能帮你解决问题,你给的信息我只能帮你到这里了

    点赞 评论 复制链接分享

相关推荐