jdbc java数据库连接 6)类路径读取——JdbcUtil的配置文件

时间:2023-03-08 22:33:54

之前的代码中,以下代码很多时候并不是固定的:

     private static String url = "jdbc:mysql://localhost:3306/day1029?useUnicode=true&characterEncoding=GB2312";
// 数据库的用户名和密码
private static String user = "root";
private static String password = "root";
Class.forName("com.mysql.jdbc.Driver");

这时候,我们可以在该类的包的src目录下创建一个bd.properties文件,用来存储这些信息:

url=jdbc:mysql://localhost:3306/day17
user=root
password=root
driverClass=com.mysql.jdbc.Driver

如果是java项目读取该文件的这些信息的话,可以这样读取:

FileInputStream in = new FileInputStream("./src/db.properties");

但是在Web项目中不能这样读取,因为:

  . 代表java命令运行的目录

* 在java项目下,. java命令的运行目录从项目的根目录开始

* 在web项目下, . java命令的而运行目录从tomcat/bin目录开始

* 所以不能使用点.

  

  那么,我们该如何读取,才能让java和Web项目都能读取呢?

这时候就用到了类路径读取

InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");

原因:  

  使用类路径的读取方式
* / : 斜杠表示classpath的根目录

* 在java项目下,classpath的根目录从bin目录开始

* 在web项目下,classpath的根目录从WEB-INF/classes目录开始

java项目中只要更改:  1)第一个代码块,把它们的值都改为null

           2)增加类路径读取即可。

下面是Web项目的代码:

  1)jdbc工具类:

 /**
* jdbc工具类
* @author APPle
*
*/
public class JdbcUtil {
private static String url = null;
private static String user = null;
private static String password = null;
private static String driverClass = null; /**
* 静态代码块中(只加载一次)
*/
static{
try {
//读取db.properties文件
Properties props = new Properties();
/**
* . 代表java命令运行的目录
* 在java项目下,. java命令的运行目录从项目的根目录开始
* 在web项目下, . java命令的而运行目录从tomcat/bin目录开始
* 所以不能使用点.
*/
//FileInputStream in = new FileInputStream("./src/db.properties"); /**
* 使用类路径的读取方式
* / : 斜杠表示classpath的根目录
* 在java项目下,classpath的根目录从bin目录开始
* 在web项目下,classpath的根目录从WEB-INF/classes目录开始
*/
InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties"); //加载文件
props.load(in);
//读取信息
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
driverClass = props.getProperty("driverClass"); //注册驱动程序
Class.forName(driverClass);
} catch (Exception e) {
e.printStackTrace();
System.out.println("驱程程序注册出错");
}
} /**
* 抽取获取连接对象的方法
*/
public static Connection getConnection(){
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} /**
* 释放资源的方法
*/
public static void close(Connection conn,Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
} public static void close(Connection conn,Statement stmt,ResultSet rs){
if(rs!=null)
try {
rs.close();
} catch (SQLException e1) {
e1.printStackTrace();
throw new RuntimeException(e1);
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}

  然后是web登陆连接sql的类:

 public class TestPath extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//连接数据库
//获取连接
Connection conn = JdbcUtil.getConnection();
System.out.println(conn);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }