1. 程式人生 > 實用技巧 >jdbc的基本使用

jdbc的基本使用

1.使用步驟:

  1. 導包
  2. 載入驅動類class.forName(....)
  3. DriverManager獲取sql物件
  4. 寫sql語句
  5. Statement與prepareStatement不一樣的執行sql語句,前者是直接sql物件 . 執行語句,而後者是預處理,即在建立sql物件時,就用sql語句,最後在用物件執行操作。

2.JDBCUtils工具類:

就是把使用步驟的共性,提出來,放在一個類中,這樣以後就能直接呼叫建立sql物件的方法就行了。
值得一提的是,如果我們使用配置檔案,擴充套件性更好,在使用其他資料庫時,我們只需要更改配置檔案properties。獲取配置檔案可以使用properties物件。獲取jar包的絕對路徑可以使用classLoader類載入器。這樣我們就不用自己新增路徑了。

public class JDBCUtils {
        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 = JDBCUtils.class.getClassLoader();
                URL res  = classLoader.getResource("jdbc.properties");
                String path = res.getPath();
                
                //2. 載入檔案
                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();
            }
        }
    
    
        /**
         * 獲取連線
         * @return 連線物件
         */
        public static Connection getConnection() throws SQLException {
    
            return DriverManager.getConnection(url, user, password);
        }
    
        /**
         * 釋放資源
         * @param stmt
         * @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 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();
                }
            }
        }
    
    }

3.DBC控制事務:

在執行sql語句時,如果程式執行過程中,發生了異常。比如有兩個sql語句,一個是轉賬操作,一個人存轉的這筆錢,如果第一個操作結束後發生了異常。那麼這筆錢就會不翼而飛,所以為了避免這樣的情況,可以使用事務。

(1)具體操作

  1. 開啟事務:setAutoCommit( boolean autoCommit ) :呼叫該方法設定引數為false,即開啟事務。
  2. 提交事務:commit( )當所有sql都執行完提交事務。
  3. 回滾事務:rollback( ) 在catch中回滾事務。
public static void main(String[] args) {
    PreparedStatement pstmt1 = null;
    PreparedStatement pstmt2 = null;
    Connection con = null;


    try {
        con = JDBCUtils.getConnection();
        //開啟事務
        con.setAutoCommit(false);
        //2.1 張三 - 500
        String sql1 = "update account set balance = balance - ? where id = ?";
        //2.2 李四 + 500
        String sql2 = "update account set balance = balance + ? where id = ?";


        pstmt1 = con.prepareStatement(sql1);
        pstmt2 = con.prepareStatement(sql2);


        //4. 設定引數,sql語句裡的問號
        pstmt1.setDouble(1,500);//填第一個資料
        pstmt1.setInt(2,1);//填第二個資料


        pstmt2.setDouble(1,500);
        pstmt2.setInt(2,2);
        //5.執行sql
        pstmt1.executeUpdate();
        // 手動製造異常
        int i = 3/0;


        pstmt2.executeUpdate();
        //提交事務
        con.commit();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (Exception e){
        try {
            con.rollback();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    } finally{
       JDBCUtils.close(con,pstmt1);
       JDBCUtils.close(con,pstmt2);
    }
}

4.JDBC連線池

連線池,就是先建立好一些連線物件,要用的的時候,直接使用,提高了效率,用完之後,歸還給連線池,以便其他的使用。

  1. c3p0連線池:
    步驟:

  2. 匯入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,還需要匯入資料庫驅動jar包

  3. 定義配置檔案:

    • 名稱: c3p0.properties 或者 c3p0-config.xml。
    • 路徑:直接將檔案放在src目錄下即可。
  4. 建立核心物件 資料庫連線池物件 ComboPooledDataSource

  5. 獲取連線: getConnection
    程式碼:

 //1.建立資料庫連線池物件
      DataSource ds  = new ComboPooledDataSource();
      //2. 獲取連線物件
      Connection conn = ds.getConnection();
  1. druid:
    這個是阿里的,效能更好,效率更高。
    步驟:
    1. 匯入jar包 druid-1.0.9.jar
    2. 定義配置檔案:
      • 是properties形式的
      • 可以叫任意名稱,可以放在任意目錄下
    3. 載入配置檔案。Properties
    4. 獲取資料庫連線池物件:通過工廠類來獲取 DruidDataSourceFactory
    5. 獲取連線:getConnection
      程式碼:
    //3.載入配置檔案
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.獲取連線池物件
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.獲取連線
Connection conn = ds.getConnection();

由於程式碼還是冗長,重複率高,所以可以自定義個工具類:

public class JDBCUtils {

			    //1.定義成員變數 DataSource
			    private static DataSource ds ;
			
			    static{
			        try {
			            //1.載入配置檔案
			            Properties pro = new Properties();
			            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
			            //2.獲取DataSource
			            ds = DruidDataSourceFactory.createDataSource(pro);
			        } catch (IOException e) {
			            e.printStackTrace();
			        } catch (Exception e) {
			            e.printStackTrace();
			        }
			    }
			
			    /**
			     * 獲取連線
			     */
			    public static Connection getConnection() throws SQLException {
			        return ds.getConnection();
			    }
			
			    /**
			     * 釋放資源
			     */
			    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();
			            }
			        }*/
			
			       close(null,stmt,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();
			            }
			        }
			    }
			
			    /**
			     * 獲取連線池方法
			     */
			
			    public static DataSource getDataSource(){
			        return  ds;
			    }
			
			}
  1. Spring JDBC
  • Spring框架對JDBC的簡單封裝。提供了一個JDBCTemplate物件簡化JDBC的開發
    • 步驟:
      1. 匯入jar包

      2. 建立JdbcTemplate物件。依賴於資料來源DataSource

        • JdbcTemplate template = new JdbcTemplate(ds);
      3. 呼叫JdbcTemplate的方法來完成CRUD的操作

        • update():執行DML語句。增、刪、改語句
        • queryForMap():查詢結果將結果集封裝為map集合,將列名作為key,將值作為value 將這條記錄封裝為一個map集合
          • 注意:這個方法查詢的結果集長度只能是1
        • queryForList():查詢結果將結果集封裝為list集合
          • 注意:將每一條記錄封裝為一個Map集合,再將Map集合裝載到List集合中
        • query():查詢結果,將結果封裝為JavaBean物件
          • query的引數:RowMapper
            • 一般我們使用BeanPropertyRowMapper實現類。可以完成資料到JavaBean的自動封裝
            • new BeanPropertyRowMapper<型別>(型別.class)
        • queryForObject:查詢結果,將結果封裝為物件
          • 一般用於聚合函式的查詢
 //2. 定義sql
 
//1. 獲取JDBCTemplate物件
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "update emp set salary = 10000 where id = 1001";
//3. 執行sql
int count = template.update(sql);
System.out.println(count);

這大大簡化了我們curd的程式碼量。