JDBC(一)——一個方法簡單實現連接數據庫

JDBC

JDBC( Java Database Connection)由一組java類和接口組成。是java程序和數據庫系統通信的標準API。JDBC API使得開發人員可以使用純java的方式來連接數據庫,並執行操作。

訪問數據庫流程

在這裏插入圖片描述

步驟

完整代碼

public static void main(String[] args) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            //加載驅動類
	        Class.forName("com.mysql.cj.jdbc.Driver");
	        //建立連接,包含了一個socket對象,耗時,真正開發時用連接池管理連接對象
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc?serverTimezone=UTC","root","root");
            String sql = "select * from student where id = ?";
            ps = con.prepareStatement(sql);
            ps.setInt(1,2969);
            rs = ps.executeQuery();
            while(rs.next()){
                System.out.println(rs.getInt(1) + "---" + rs.getString(2) + "---" + rs.getString(3));
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //先開後閉,分開關閉
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(ps != null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(con != null){
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

導入jar包
不同數據庫會提供不同jar包,也就是jdbc驅動程序,從官網即可下載。然後在自己的編譯器上導入外部庫。

加載驅動類

Class.forName("com.mysql.cj.jdbc.Driver");

建立連接
建立的連接裏包含一個socket對象,很耗時,所以真正的開發中通常用連接池來管理連接對象。

//mysql的jdbc6.0+在連接字符串中要加入時區
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫名稱?serverTimezone=UTC","數據庫用戶名","密碼");

執行sql語句
執行sql有多種方式,這裏只介紹兩種。
通過連接的createStatement方法獲得sql語句對象,statement或者prepareStatement。前者很少使用,因爲只能用字符串拼接的方式來傳值,並且會發生sql注入(例:“5 or 1= 1”,傳入這樣的值會更改sql語句邏輯);後者通過預編譯,提高了效率,也一定程度上防止了sql注入。調用execute方法執行sql語句.

Statement stmt = con.createStatement();
String sql = "insert into student values (3366,'張大炮','123')";
stmt.execute(sql);
//等價於
String sql = "insert  into student values (?,?,?)";//?是佔位符
PreparedStatement ps = con.prepareStatement(sql);
//根據傳入值的類型使用不同方法,以此來防止sql注入
//如果不在乎類型的話可以使用setobject方法
ps.setString(1,"1234");
ps.setString(2,"zdp");
ps.setString(3,"123");
ps.execute();

返回結果集
執行查詢語句使用executeQuery()返回結果集。
執行更新語句使用executeUpdate()返回更新行數。

executeQuery()返回ResultSet對象儲存結果集,next()方法是光標在結果集向下移一行,返回是否還有下一行,使用get方法返回不同列的值。

String sql = "select * from student where id = ?";
ps = con.prepareStatement(sql);
ps.setInt(1,2969);
ResultSet rs = ps.executeQuery();//執行sql語句並返回結果集
while(rs.next()){//當還有下一行
	System.out.println(rs.getInt(1) + "---" + rs.getString(2) + "---" + rs.getString(3));
}

關閉連接
遵循先開後關,獨立關閉的原則。

 //先開後閉,分開關閉
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(ps != null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(con != null){
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章