注册 登录
编程论坛 JAVA论坛

使用JDBC获取数据库连接,在使用InputStream获取对应的Properties文件的数据库连接时,获取不成功,导致程序报空指针异常

mudi 发布于 2019-03-26 22:55, 4604 次点击
以下是客户程序:
程序代码:
import import import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Properties;

import org.junit.Test;
public class JDBCTest1 {

    /**
     * ResultSet:结果集,封装了使用JDBC进行查询的结果
     * 1、调用Statement对象的ExecuteQuery(sql)可以的到结果集
     * 2、ResultSet 返回的实际是一张数据比哦啊,有一个指针指向数据表的第一行的前面
     *   可以调用next()方法检测下一行是否有效,若有效则该方法返回true,且指针下移,
     *   相当于Iterator对象的hasNext()和Next()方法的结合体
     *  

     *3、当指针对位到一行时,可以通过调用getXxx(index)或者getXxx(conlumnname)
     *  获取每一列的遏制,例如getInt(1),getString("name")
     *

     *4、ResultSet也需要进行关闭
     
*/
    @Test
    public void testResultSet() {
       //获取id=4的customer数据表的记录,并打印
        Connection conn =null;
        Statement statement =null;
        ResultSet rs =null;
        try {
            //1、获取Connection
            conn = JDBCTools.getConnection();
            //2、获取Statement
            statement = conn.createStatement();
            //3、准备Sql
            String sql = "SELECT id,NAME,email,birth \r\n" +

                    "FROM customers WHERE id=1;";
           

            //4、执行查询,得到ResultSet
            rs = statement.executeQuery(sql);
           

            //5、处理ResultSet
            if(rs.next()) {
                int id =rs.getInt(1);
                String name =rs.getString("name");
                String email =rs.getString(3);
                Date birth = rs.getDate(4);
               

                System.out.println(id);
                System.out.println(name);
                System.out.println(email);
                System.out.println(birth);
            }
            //6、关闭数据库资源
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            JDBCTools.releaseResouce(rs, statement, conn);
        }
    }
    }
以下是工具类程序:
程序代码:
import 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 JDBCTools {
   

    /**
     * 关闭statement,connection
     *

     *
@param statement
     *
@param conn
     
*/
    public static void releaseResouce (ResultSet rs,
            Statement statement,Connection conn) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(statement!=null) {
            try {
                //5、关闭statement对象
                statement.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
            if(conn != null) {
            try {
                //2、关闭连接
                conn.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
    }
    /**
     * 操作JDBC的工具类,其中封装了一些工具方法
     *

     * Version 1
     *

     * 1.获取连接 的方法
     * 通过读取配置文件从数据库获取一个连接
     *
@return
     *
@throws Exception
     
*/
    public static Connection getConnection() throws Exception {
        //1、准备连接数据库的4个字符串。
        
//1)、创建Properties对象
        Properties properties = new Properties();
      

        //2)、获取jdbc.properties对应的输入流
        InputStream in =

                JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
      

        //3)、加载2)对应的输入流
        properties.load(in);
      

        //4)、具体确定user,password等4个字符串
        String user = properties.getProperty("root");
        String password = properties.getProperty("1230");
        String jdbcUrl = properties.getProperty("jdbcUrl");
        String driver = properties.getProperty("driver");
      

        //2、加载数据库驱动程序(对应的Driver实现类中有注册驱动的静态代码块
        Class.forName(driver);
      

        //3、通过DriverManager的getConnection()方法获取数据库连接
        return  DriverManager.getConnection(jdbcUrl, user, password);
    }
}
以下是jdbc.Properties文件的内容
driver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/atguigu
user=root
password=1230

17 回复
#2
林月儿2019-03-27 08:55
程序代码:

        //4)、具体确定user,password等4个字符串
        String user = properties.getProperty("root");
        String password = properties.getProperty("1230");
        String jdbcUrl = properties.getProperty("jdbcUrl");
        String driver = properties.getProperty("driver");



        //4)、具体确定user,password等4个字符串
        String user = properties.getProperty("root");
        String password = properties.getProperty("password");
        String jdbcUrl = properties.getProperty("jdbcUrl");
        String driver = properties.getProperty("driver");
#3
mudi2019-03-27 11:13
回复 2楼 林月儿
版主,这个修改了password依然报空指针异常,不知道问题点具体出在哪里(ー_ー)!!
#4
林月儿2019-03-27 11:30
哪一行报的错
#5
mudi2019-03-27 15:20
回复 4楼 林月儿
只有本站会员才能查看附件,请 登录

就是通过properties加载驱动器这个步骤报错的
,应该是获取InputStream不成功,所以使用in这个对象就报了空指针异常
#6
rind2019-03-27 16:23
回复 6楼 mudi
JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
使用这种加载器定位资源,
相对路径是相对于JDBCTools的类文件的路径。
需要资源文件和类JDBCTools的类文件在同一目录下。




#7
mudi2019-03-27 16:35
回复 7楼 rind
是的,是放在同一个目录下
#8
疯狂的小a2019-03-27 21:04
能把错误贴出来么
#9
rind2019-03-28 08:22
回复 8楼 mudi
在什么环境编的?
不会是windows下没开显示扩展名,然后实际上是个txt文档?
linux下没有读权限?

检查一下实际文件,看看名称(包括扩展名)对不对,文件有没有足够权限。


[此贴子已经被作者于2019-3-28 08:26编辑过]

#10
mudi2019-03-28 10:04
回复 10楼 rind
检查了实际的properties文件,是扩展名对的,但是还是不能获取到流对象
#11
rind2019-03-28 11:07
回复 11楼 mudi
你这没有个环境说明的,很多时候只能猜你的环境。

使用IDE开发?
也有可能是资源文件放到src目录里面,但是没有同步到bin目录去。
也就是src目录显示有文件,但是bin目录实际上没有。
而bin目录才是在classpath里面。
不同IDE的操作不一样,但大概思路都是清空原有的,重新部署一下。


就最后猜一次,其他不知道。


[此贴子已经被作者于2019-3-28 11:09编辑过]

#12
guoguo19902019-03-29 10:51
只有本站会员才能查看附件,请 登录

这里对应不上吧
#13
bccn_cxs2019-03-31 23:31
1.java命令运行的是class字节码文件,所以应检查一下资源文件jdbc.properties与字节码文件JDBCTools.class是否在同一个目录。
2.如果是使用eclipse等IDE工具,也可以不在同一个目录下,需要在IDE中指定jdbc.properties为资源文件,并指定编译输出的位置(不同IDE工具指定方式可能不一样),所以要检查一下指定的编译输出位置是否有这个jdbc.properties文件。



--------------------------
仅供参考,欢迎指正
#14
bccn_cxs2019-03-31 23:42
回复 10楼 mudi
1.java命令运行的时class字节码文件,所以检查一下JDBCTools.class与jdbc.properties是否在同一目录。
2.如果是使用eclipse等IDE工具,需要指定要编译的资源文件(如这里的jdbc.properties)和指定编译之后输出的位置(输出文件所在目录),所以要检查一下指定输出位置是否存在jdbc.properties文件。




-----------------------
仅供参考,欢迎指正
#15
mudi2019-04-01 21:33
回复 9楼 rind
非常感谢各位论坛的小伙伴,我自己的原因导致的连接错误,我的mysql密码是7923,实际的写成了1230,才导致一直连不上,各位的方法都是有用的,是我自己的问题
#16
mudi2019-04-01 21:35
回复 10楼 mudi
是我数据库密码写错了,导致一直连不上,感谢各位小伙伴
#17
殷玥2019-04-11 20:53
jdbc.Properties文件的路径在哪里啊,你把目录结构发来一下
#18
疯狂的小a2019-04-12 14:51
牛逼牛逼
1