package com.hx.jdbc.connection; import java.sql.Connection; import java.sql.Statement; import com.mysql.jdbc.UpdatableResultSet; import junit.framework.TestCase; public class JDBCText extends TestCase { /** * 創建一個insert,update,delete通用的方法 * @param sql */ public void upDate(String sql){ Connection conn=null; Statement statement=null; try { conn=JDBCTools.getConnection2();//調用工具類中的getConnection2()方法完成數據庫連接 statement=conn.createStatement(); statement.executeUpdate(sql);//執行sql語句 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JDBCTools.guanbi(statement, conn);//調用工具類中的guanbi()方法來完成關閉statement和conn } }
以上是一個JDBC訪問數據庫的增加,修改,刪除通用的方法。其中完成數據庫連接和關閉數據庫的***重復且通用***的操作寫在了工具類JDBCTools.java中,如下:
package com.hx.jdbc.connection; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCTools { /** * 這是連接數據庫的方法,放到此工具類中 * @return * @throws Exception */ public static Connection getConnection2() throws Exception{ //1.創建數據庫的4個字符串 //2.創建Properties對象 Properties properties=new Properties(); //3.獲取jdbc.pro對應的輸入流 InputStream in= JDBCTools.class.getClassLoader().getResourceAsStream("com/hx/jdbc/connection/jdbc.properties");
//******此處重點關注******
//**********************
//******因為我出錯了******
//**********************
System.out.println(in);//當時我報錯上面一行代碼空指針異常,此處打印in,輸出null,
//知道上面一句代碼並沒訪問到jdbc.properties配置文件,開始我直接寫的jdbc.properties
//應該寫根目錄下的jdbc.properties //4.加載輸入流 properties.load(in); //5.具體決定4個字符串的值 String driver=properties.getProperty("driver"); String jdbcUrl=properties.getProperty("jdbcUrl"); String user=properties.getProperty("user"); String password=properties.getProperty("password"); //6.加載數據庫驅動程序 Class.forName(driver); //7.通過DriverManager的getConnection()方法獲取數據庫連接 Connection conn=DriverManager.getConnection(jdbcUrl, user, password); return conn; }
/**
*這是關閉數據庫的工具方法,因為曾刪改都需要用,所以寫在此工具方法中
*/
public static void guanbi(Statement statement,Connection conn){ if(statement!=null){ try { statement.close(); } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } }
以上的工具代碼中我出錯了,出錯的原因如下:
首先用類加載資源文件的方式可以有以下三種: (包結構圖)
1)InputStreaminStream=DaoFactory.class.getResourceAsStream("dao.properties");
2)inStream=DaoFactory.class.getResourceAsStream("/com/jdbc/dao/dao.properties")
3)inStream=DaoFactory.class.getClassLoader().getResourceAsStream("com/jdbc/dao/dao.properties");
第一種和第二種方式是采用Class對象去加載,第三種采用ClassLoader對象去加載資源文件,之所以Class對象也可以加載資源文件是因為Class類封裝的ClassLoader的getResourceAsStream方法。從Class類中的源碼中可以看出:
之所以這樣做無疑還是方便客戶端的調用,省的每次獲取ClassLoader才能加載資源文件的麻煩。
路徑問題:
1. 第三種是最本質的做法,前兩種也是基於第三種去實現的。JVM會使BootstrapLoader去加載資源文件。所以路徑還是這種相對於工程的根目錄即"com/jdbc/dao/dao.properties"(不需要“/”)。
2. 第一種是采用的相對路徑,資源文件相對於當前這個類即(DaoFactory類)的位置,這種方式Class對象做了一些處理。即resloveName(name)這個方法。最終name還是會轉換成適合第三方式的name參數
3. 第二種是采用絕對路徑,絕對路徑是相對於classpath根目錄的路徑(工程里src目錄對應bin目錄(存放.class文件的目錄))。
然后下面是我的jdbc.properties配置文件
driver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/students
user=root
password=5678
下面是調用upDate()方法進行增刪改操作:
package com.hx.jdbc.connection; public class Test { public static void main(String[] args) { String sql="INSERT INTO t_student(NAME,age,email) VALUES('78878','22','999999999')"; //String sql="DELETE FROM t_student where id=3"; //String sql="UPDATE t_student set name='66666',age='100',email='000' where id=3"; JDBCText j=new JDBCText(); j.upDate(sql); } }