使用JDBC連接並操作數據庫


1.數據庫驅動

介於Java程序和MySQL之間的程序。

2.JDBC

sun公司為了簡化開發人員的操作,提供了一個(Java操作數據庫的)規范,俗稱JDBC。這些規范的實現由具體的廠商去做。

對於開發人員來說,只需要掌握JDBC接口的操作即可。JDBC程序介於數據庫驅動和應用程序之間。

3.第一個JDBC程序

前期工作:

1.創建一個普通的Java項目

2.在項目的根目錄下創建一個名為lib的包

3.將mysql數據庫驅動jar包復制到lib文件夾中

4.右鍵lib文件夾,選中 add as library,這才意味着成功導入了驅動程序包

連接數據庫的步驟總結:

1、加載驅動

2、連接數據庫 DriverManager

3、獲得執行sql的對象 Statement

4、獲得返回的結果集

5、釋放連接

DriverManager

DriverManager.registerDriver(new com.mysql.jdbc.Driver())
Class.forName("com.mysql.jdbc.Driver()"); 
​
/*
    上面這兩行代碼的作用都是一樣的,第一個是通過向DriverManager.registerDriver方法傳遞一個驅動對象
*/
// DriverManager.registerDriver方法源碼如下
    public static synchronized void registerDriver(java.sql.Driver driver)
        throws SQLException {
        registerDriver(driver, null);
    }
// 其內部的registerDriver方法源碼如下
    public static synchronized void registerDriver(java.sql.Driver driver,
            DriverAction da)
        throws SQLException {
​
        /* Register the driver if it has not already been added to our list */
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }
        println("registerDriver: " + driver);
    }
​
// 再來看一下com.mysql.jdbc.Driver()的源碼
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}
/*
    可以看到其內部有一個靜態代碼塊,在加載該類的時候,會執行這個靜態代碼塊,這個靜態代碼塊也是執行的
    DriverManager.registerDriver方法,並且傳遞的是一個驅動對象,所以上面兩種加載驅動的方式的本質是一樣的
*/
​
Connection connection = DriverManager.getConnection(url, username, password);
// connection代表數據庫
//數據庫設置自動提交
connection.setAutoCommit()
//事務提交
connection.commit()
//事務回滾
 connection.rollback()

URL

String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false";
// jdbc:mysql://主機地址:port/數據庫名?參數1&參數2……

Statement 執行SQL的對象,PrepareStatement 執行SQL的對象

String sql = "select * from users";
Statement statement = connection.createStatement();
statement.execute();
statement.executeQuery();    // 查詢操作返回 一個結果集ResultSet
statement.executeUpdate();  // 更新、插入、刪除都是使用這個方法,會返回一個受影響的行數
//5.執行SQL的對象去執行SQL,如果有結果,則查看返回結果

 

ResultSet

獲得指定的數據類型

ResultSet resultSet = statement.executeQuery(sql);  // 結果集封裝了我們全部的查詢出來的結果
// 如果直到要獲取的字段的類型,就指定類型,否則就是要getObject方法
resultSet.getObejct();
resultSet.getString();
resultSet.getInt();
resultSet.getDate();

 

遍歷,指針

resultSet.beforeFirst()   //移動到最前面
resultSet.afterLast()  //移動到最后面
resultSet.next()  // 移動下一個數據
resultSet.previous()  // 移動到前一行
resultSet.absolute(row)  // 移動到指定行

 

釋放資源

   resultSet.close();
   statement.close();
   connection.close();

 

4.Statement對象

JDBC中的Statement對象用於向數據庫發送SQL語句,想完成對數據庫的增刪改查,只需要通過這個對象向數據庫發送增刪改查語句即可。

Statement對象的executeUpdate方法,用於向數據庫發送增、刪、改的sql語句,executeUpdate執行完成之后,,將會返回一個整數(即增刪改語句導致了數據庫幾行數據發生了變化)。

Statement.executeQuery方法用於向數據庫發送查詢語句,executeQuery方法返回代表查詢結果的ResultSet對象。

CRUD操作-insert

使用executeUpdate(String sql) 方法完成數據添加工作,示例操作:

Statement st = conn.createStatement();
String sql = "insert into user(....) values(....)";
int num = st.executeUpdate(sql);
if(num > 0){
    System.out.println("插入成功!!")
}

CRUD操作-delete

使用executeUpdate(String sql)方法完成數據刪除操作,示例操作:

Statement st = conn.createStatement();
String sql = "delete from  user where id=1";
int num = st.executeUpdate(sql);
if(num > 0){
    System.out.println("刪除成功!!")
}

CRUD操作-update

使用executeUpdate(String sql)方法完成數據修改操作,示例操作:

Statement st = conn.createStatement();
String sql = "update user set name= '' where  name = '' ";
int num = st.executeUpdate(sql);
if(num > 0){
    System.out.println("修改成功!!")
}

CRUD操作-read

使用executeQuery方法完成數據查詢操作,示例操作:

Statement st = conn.createStatement();
String sql = "select * from user where id=1";
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
// 根據獲取列的數據類型,分別調用rs的相應方法映射到java對象中
}

4.規范化實現

1.在src文件夾下寫一個配置文件db.properties,用於保存連接數據庫的關鍵信息;

內容如下:

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false
username = 用戶名
password = 密碼

2.新建一個utils包,用於存放連接數據庫的工具類,該工具類的代碼實現如下:

public class jdbcUtils {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    static {
        try{
            InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(in);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
​
            //1.驅動只用加載一次
            Class.forName(driver);
​
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    // 獲取連接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,username,password);
    }
    // 釋放連接資源
    public static void relese(Connection conn, Statement st, ResultSet rs){
        if (rs!=null){
            try{
                rs.close();
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (st!=null){
            try{
                st.close();
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try{
                conn.close();
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

3.在其他的具體業務包里面編寫具體操作數據庫的代碼

增加操作:

public class jdbctest02 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
​
        try {
            conn = jdbcUtils.getConnection(); // 獲取數據庫連接
            st = conn.createStatement();  //獲得SQL的執行對象
            String sql = "insert into users values(4,'lalal','123456','xxx@163.com','2020-01-01')";
            int i = st.executeUpdate(sql);
            if (i>0){
                System.out.println("插入成功");
            }
​
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcUtils.relese(conn,st,rs);
        }
    }
}

刪除操作:

public class jdbctest03 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
​
        try {
            conn = jdbcUtils.getConnection(); // 獲取數據庫連接
            st = conn.createStatement();  //獲得SQL的執行對象
            String sql = "delete from users where id = 4";
            int i = st.executeUpdate(sql);
            if (i>0){
                System.out.println("刪除成功");
            }
​
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcUtils.relese(conn,st,rs);
        }
    }
}

修改操作:

public class jdbctest04 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
​
        try {
            conn = jdbcUtils.getConnection(); // 獲取數據庫連接
            st = conn.createStatement();  //獲得SQL的執行對象
            String sql = "update users set name = '庫卡卡' where id = 1";
            int i = st.executeUpdate(sql);
            if (i>0){
                System.out.println("修改成功");
            }
​
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcUtils.relese(conn,st,rs);
        }
    }
}

查詢操作:

public class jdbctest05 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
​
        try {
            conn = jdbcUtils.getConnection(); // 獲取數據庫連接
            st = conn.createStatement();  //獲得SQL的執行對象
            String sql = "select * from users";
            rs = st.executeQuery(sql);
            while (rs.next()){
                System.out.println("id="+rs.getObject("id"));
                System.out.println("name="+rs.getObject("name"));
                System.out.println("pwd="+rs.getObject("password"));
                System.out.println("email="+rs.getObject("email"));
                System.out.println("birthday="+rs.getObject("birthday"));
            }
​
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcUtils.relese(conn,st,rs);
        }
    }
}

會發現在這些具體的業務實現類里面,除了sql語句之外,其他大致都是一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM