JDBC學習筆記(2)——Statement和ResultSet


Statement執行更新操作

Statement:Statement 是 Java 執行數據庫操作的一個重要方法,用於在已經建立數據庫連接的基礎上,向數據庫發送要執行的SQL語句。Statement對象,用於執行不帶參數的簡單SQL語句。

通過JDBC向指定的數據表中插入一條記錄,需要注意下面的幾點:

* 1.Statement:用於執行SQL語句的對象
     * 1).通過COnnection的createStatement()方法來獲取
     * 2).通過excuteUpdate(sql)可以執行SQL語句
     * 3).傳入的SQL可以是insert,update或者delete,但是不能是select
    * 2.Connection、Statement都是應用程序和數據庫服務器的連接   資源,使用后一定要關閉
     * 需要在finally中關閉Connection和Statement對象
     * 異常可以不處理,但是連接一定要關閉
     * 3.關閉的順序:先關閉后獲取的,即先關閉Statement,后關閉Connection

具體的代碼實現:

public void testStatement() throws Exception{
        //1.獲取數據庫連接
        //        Connection conn=getConnection();
        Connection conn=null;
        //4.執行插入
                //1).獲取操作SQL語句的Statement對象:調用Connection的createStatement()方法來獲取
                //注意Statement這里是java.sql包中的,而不是java.mysql.jdbc中的
        //        Statement statement=conn.createStatement();
        Statement statement=null;
        try {
            //3.准備插入的SQL語句
            conn=getConnection();
            String sql=null;
            //sql的插入操作
//            sql="insert into customers(NAME,email,birth) values('xyz','xyz@atguigu.com','1988-7-1')";
            //刪除操作
//            sql="delete from customers where id =1";
            //修改操作
            sql="update customers set name='Tom' where id =2";
            statement = conn.createStatement();
            //2).調用Statement對象的excuteUpdate(sql),執行SQL語句進行插入
            statement.execute(sql);
            //5.關閉Statement對象
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {

                // 2.關閉連接
                if (conn != null) {

                    conn.close();
                }
            }
        }
    }

【提示】:代碼中的getConnction方法是在筆記一中定義的,可以看到我們可以對數據庫中的記錄進行插入(insert),更新(update),刪除(delete)操作,使用Connection對象的createStatement( )方法創建一個statement對象,並且調用Statement對象的excuteUpdate(sql),執行SQL語句進行插入;
我們的getConnection方法和關閉statement以及conn的操作稍顯復雜,我們可以定義一個工具類,里面包含一些通用的方法,實現我們的插入、刪除、更新數據的操作

具體代碼:

public class JDBCTools {
    // 關閉conn和statement的操作
    public static void release(Statement statement, Connection conn) {
        if (statement != null) {
            try {
                statement.close();

            } catch (Exception e2) {
                // TODO: handle exception
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 1。獲取連接的方法 通過讀取配置文件從數據庫服務器獲取一個連接
     * 
     * @author Administrator
     * 
     */
    public static Connection getConnection() throws Exception {
        String driverClass = null;
        String jdbcUrl = null;
        String user = null;
        String password = null;
        // 讀取類路徑下的jdbc.properties文件
        InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream(
                "jdbc.properties");
        Properties properties = new Properties();
        properties.load(in);
        driverClass = properties.getProperty("driver");
        jdbcUrl = properties.getProperty("jdbcUrl");
        user = properties.getProperty("user");
        password = properties.getProperty("password");
        // 通過反射創建Driver對象
        Driver driver = (Driver) Class.forName(driverClass).newInstance();
        Properties info = new Properties();
        info.put("user", user);
        info.put("password", password);
        Connection connection = driver.connect(jdbcUrl, info);
        return connection;
    }
}

我們更新數據的操作可以寫成這樣:這里update就是這個通用的方法;

public void update(String sql){
        Connection conn=null;
        Statement statement=null;
        try {
            //用到了我們寫的一個工具類JDBCTools
            conn=JDBCTools.getConnection();
            statement=conn.createStatement();
            statement.execute(sql);
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            JDBCTools.release(statement, conn);
        }
    }

傳入不同的sql,執行相應的操作;

通過ResultSet執行查詢操作

ResultSet:

 /**
     * ResultSet:結果集,封裝了使用JDBC進行查詢的結果
     * 1.調用Statement對象的excuteQuery(sql)方法可以得到結果集
     * 2.ResultSet返回的實際上就是一張數據表,有一個指針
     *   指向數據表的第一樣的前面,可以調用next()方法檢測下一行是否有效,若有效則返回true
     *   ,並且指針下移,相當於迭代器對象的hasNext()和next()的結合體
     * 3.當指針對位到確定的一行時,可以通過調用getXxx(index)或者getXxx(columnName)
     * 獲取每一列的值,例如:getInt(1),getString("name")
     * 4.ResultSet當然也需要進行關閉
     */

ResultSet的返回結果:

具體的代碼實現:

@Test
    public void testResultSet(){
        //獲取id=2的customers數據表的記錄,並打印
        //面向接口的編程
        Connection conn=null;
        Statement statement=null;
        ResultSet rs=null;
        try {
            //1.獲取Connection
            conn=JDBCTools.getConnection();
            System.out.println(conn);
            //2.獲取Statement
            statement=conn.createStatement();
            System.out.println(statement);
            //3.准備SQL
            String sql="select id,name,email,birth from customers";
            //4.執行查詢,得到ResultSet
            rs=statement.executeQuery(sql);
            System.out.println(rs);
            //5.處理ResultSet
            while(rs.next()){
                int id=rs.getInt(1);
                String name=rs.getString("name");
                String email=rs.getString(3);
                Date birth=rs.getDate(4);
                System.out.println(id);
                System.out.println(name);
                System.out.println(email);
                System.out.println(birth);
                System.out.println("--------------");
            }
            //6.關閉數據庫資源
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JDBCTools.release(rs, statement, conn);
        }
    }

 到目前為止的完整代碼:

package com.atguigu.jdbc;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

import org.junit.Test;

import com.mysql.jdbc.Driver;

//JDBC學習
public class JDBCTest {
    /**
     * ResultSet:結果集,封裝了使用JDBC進行查詢的結果
     * 1.調用Statement對象的excuteQuery(sql)方法可以得到結果集
     * 2.ResultSet返回的實際上就是一張數據表,有一個指針
     *   指向數據表的第一樣的前面,可以調用next()方法檢測下一行是否有效,若有效則返回true
     *   ,並且指針下移,相當於迭代器對象的hasNext()和next()的結合體
     * 3.當指針對位到確定的一行時,可以通過調用getXxx(index)或者getXxx(columnName)
     * 獲取每一列的值,例如:getInt(1),getString("name")
     * 4.ResultSet當然也需要進行關閉
     */
    @Test
    public void testResultSet(){
        //獲取id=2的customers數據表的記錄,並打印
        //面向接口的編程
        Connection conn=null;
        Statement statement=null;
        ResultSet rs=null;
        try {
            //1.獲取Connection
            conn=JDBCTools.getConnection();
            System.out.println(conn);
            //2.獲取Statement
            statement=conn.createStatement();
            System.out.println(statement);
            //3.准備SQL
            String sql="select id,name,email,birth from customers";
            //4.執行查詢,得到ResultSet
            rs=statement.executeQuery(sql);
            System.out.println(rs);
            //5.處理ResultSet
            while(rs.next()){
                int id=rs.getInt(1);
                String name=rs.getString("name");
                String email=rs.getString(3);
                Date birth=rs.getDate(4);
                System.out.println(id);
                System.out.println(name);
                System.out.println(email);
                System.out.println(birth);
                System.out.println("--------------");
            }
            //6.關閉數據庫資源
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JDBCTools.release(rs, statement, conn);
        }
    }
    /**
     * 通用的更新的方法:包括insert,update,delete
     * 版本1.
     */
    /*public void update(String sql){
        Connection conn=null;
        Statement statement=null;
        try {
            //用到了我們寫的一個工具類JDBCTools
            conn=JDBCTools.getConnection();
            statement=conn.createStatement();
            statement.execute(sql);
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            JDBCTools.release(statement, conn);
        }
    }*/
    /*
     * 通過JDBC向指定的數據表中插入一條記錄
     * 我這里用的是圖形化界面SQLyog
     * SQLyog圖形化界面連接mysql數據庫,注冊碼:
     * 這個可用【我用了還是可以】
        Name:BAKA! 
        Code:560f17bf57745cf9
     */
    /**
     * 通過JDBC向指定的數據表中插入一條記錄
     * 1.Statement:用於執行SQL語句的對象
     * 1).通過COnnection的createStatement()方法來獲取
     * 2).通過excuteUpdate(sql)可以執行SQL語句
     * 3).傳入的SQL可以是insert,update或者delete,但是不能是select
     * 2.Connection、Statement都是應用程序和數據庫服務器的連接資源,使用
     *   后一定要關閉
     * 需要在finally中關閉Connection和Statement對象
     * 異常可以不處理,但是連接一定要關閉
     * 3.關閉的順序:先關閉后獲取的,即先關閉Statement,后關閉Connection
     * @throws Exception
     */
    @Test
    public void testStatement() throws Exception{
        //1.獲取數據庫連接
        //        Connection conn=getConnection();
        Connection conn=null;
        //4.執行插入
                //1).獲取操作SQL語句的Statement對象:調用Connection的createStatement()方法來獲取
                //注意Statement這里是java.sql包中的,而不是java.mysql.jdbc中的
        //        Statement statement=conn.createStatement();
        Statement statement=null;
        try {
            //3.准備插入的SQL語句
            conn=getConnection();
            String sql=null;
            //sql的插入操作
//            sql="insert into customers(NAME,email,birth) values('xyz','xyz@atguigu.com','1988-7-1')";
            //刪除操作
//            sql="delete from customers where id =1";
            //修改操作
            sql="update customers set name='Tom' where id =2";
            statement = conn.createStatement();
            //2).調用Statement對象的excuteUpdate(sql),執行SQL語句進行插入
            statement.execute(sql);
            //5.關閉Statement對象
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {

                // 2.關閉連接
                if (conn != null) {

                    conn.close();
                }
            }
        }
    }

    public Connection testGetConnection2() throws Exception{
        //1.准備連接數據庫的四個字符串
        //1).創建Properties對象
        Properties properties=new Properties();
        //2).獲取jdbc.properties對應的輸入流
        InputStream in=this.getClass().
                getClassLoader().getResourceAsStream("jdbc.properties");
        //3).加載2)對應的輸入流
        properties.load(in);
        //4).具體決定user,password等四個字符串
        String user=properties.getProperty("user");
        String jdbcUrl=properties.getProperty("jdbcUrl");
        String password=properties.getProperty("password");
        String driver=properties.getProperty("driver");
        //2.加載數據庫驅動程序(對應的Driver實現類中注冊驅動的靜態代碼塊)
        Class.forName(driver);
        //3.通過DriverManager的getConnection()方法獲取數據庫連接
        return DriverManager.getConnection(jdbcUrl,user,password);
    }
    /**
     * DriverManager是驅動的管理類
     * 1).可以通過重載的getConnection()方法獲取數據庫連接,較為方便
     * 2).可以同時管理多個驅動程序:若注冊了多個數據庫連接
     * ,則調用getConnection()方法時傳入的參數不同,即返回不同的數據庫連接
     * @throws Exception 
     */
    public void testDriverManager() throws Exception{
        //1.准備連接數據庫的四個字符串
        //驅動的全類名
        String driverClass="com.mysql.jdbc.Driver";
        //url
        String jdbcUrl="dbc:mysql://localhost:3306/atguigu";
        //user
        String user="root";
        //password
        String password="123456";
        //讀取類路徑下的jdbc.properties文件
        InputStream in=getClass().getClassLoader()
                .getResourceAsStream("jdbc.properties");
        Properties properties=new Properties();
        properties.load(in);
        driverClass=properties.getProperty("driver");
        jdbcUrl=properties.getProperty("jdbcUrl");
        user=properties.getProperty("user");
        //2.加載數據庫驅動程序(對應的Driver實現類中注冊驅動的靜態代碼塊)
        /*
         *使用Drivermanager的好處:可以加載多個驅動
        DriverManager
        .registerDriver(Class.forName(driverClass).newInstance());
         * 
         */
        Class.forName(driverClass);
        password=properties.getProperty("password");
        //3.通過DriverManager的getConnection()方法獲取數據庫連接
        Connection connection=DriverManager
                .getConnection(jdbcUrl, user, password);
        System.out.println(connection);
    }

    /**
     * Driver是一個接口,數據庫廠商必須提供實現的接口
     * 能從其中獲取數據庫連接,可以通過Driver的實現類的對象獲取連接
     * 1.加入mysql驅動
     * 1).解壓mysql-connector-java-5.1.18.zip
     * 2).在當前目錄下新建lib目錄
     * 3).把mysql-connector-java-5.1.18-bin.jar復制到lib目錄
     * 4).右鍵->build-path->add build path加載到類路徑下
     * @throws SQLException 
     * 
     */
        /*
         * MySQL附帶了一個空密碼有的root用戶。成功后安裝了數據庫和客戶端,需要進行如下設置root密碼:
    
    D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root password "123456";
    注:
    
    1. 關閉正在運行的MySQL服務。 
    2. 打開DOS窗口,轉到 D:\software\mysql-5.6.25-winx64\bin 目錄。 
    3. 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啟動MySQL服務的時候跳過權限表認證。 
    4. 再開一個DOS窗口(因為剛才那個DOS窗口已經不能動了),轉到mysql\bin目錄。 
    5. 輸入mysql回車,如果成功,將出現MySQL提示符 >。 
    6. 連接權限數據庫: use mysql; 。 
    6. 改密碼:update user set password=password("123456") where user="root";(別忘了最后加分號) 。 
    7. 刷新權限(必須步驟):flush privileges; 
    8. 退出 quit。 
    9. 注銷系統,再進入,使用用戶名root和剛才設置的新密碼 123456 登錄。
    現在使MySQL服務器的連接,那么使用下面的命令:
     */
    public static void main(String[] args) throws SQLException {
        //1.創建一個Driver實現類的對象
        Driver driver=new com.mysql.jdbc.Driver();
        /*
         * JDBC URL的標准由三部分組成
         * jdbc:<子協議>:<子名稱>
         * 1).協議:JDBC URL中的協議總是JDBC
         * 2).子協議:子協議用於標識一個數據庫驅動程序
         * 3).紫明成:一種標識數據庫的方法。子名稱可以一句不同的
         * 子協議而變化,用子名稱的目的是為了定位數據庫提供足夠的信息
         * 例如:jdbc:mysql://127.0.0.1:3306/test【這是我的主機上的,你的不一定】
         * 查看端口號:在mysql后面輸入show global variables like 'port';別寫錯了,切記別忘記寫英文狀態下的分號
         */
        //2.准備連接數據庫的基本信息,url,user,password
        String url="jdbc:mysql://localhost:3306/test";
        Properties info=new Properties();
        info.put("user", "root");
        info.put("password", "123456");
        //3.調用Driver接口實現類對象的connect(url,info)方法獲取數據庫的連接
        //此處Connection是一個接口,java.sql包下的接口
        Connection connection=driver.connect(url, info);
        System.out.println(connection);
    }
    /**
     * 編寫一個通用的方法,在不修改源程序的情況下,可以獲取任何數據庫的連接
     * 解決方案:把數據庫驅動Driver實現類的全類名、url、user、password
     * 放入一個配置文件中,通過修改配置文件的方法實現和具體的數據庫解耦
     * @throws ClassNotFoundException 
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     */
    public Connection getConnection() throws Exception{
        String driverClass=null;
        String jdbcUrl=null;
        String user=null;
        String password=null;
        //讀取類路徑下的jdbc.properties文件
        InputStream in=getClass().getClassLoader()
                .getResourceAsStream("jdbc.properties");
        Properties properties=new Properties();
        properties.load(in);
        driverClass=properties.getProperty("driver");
        jdbcUrl=properties.getProperty("jdbcUrl");
        user=properties.getProperty("user");
        password=properties.getProperty("password");
        //通過反射創建Driver對象
        Driver driver=(Driver) Class.forName(driverClass).newInstance();
        Properties info=new Properties();
        info.put("user", user);
        info.put("password", password);
        Connection connection=driver.connect(jdbcUrl, info);
        return connection;
    }
    @Test
    public void testGetConnection() throws Exception{
        System.out.println(getConnection());
    }
}

JDBCTools:

package com.atguigu.jdbc;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import com.mysql.jdbc.Driver;

/**
 * 操作JDBC的工具類,其中封裝了一些工具方法
 * Version 1
 * @author Administrator
 *
 */
public class JDBCTools {
    // 關閉conn和statement的操作
    public static void release(ResultSet rs,Statement statement, Connection conn) {
        if(rs!=null){
            try {
                rs.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        if (statement != null) {
            try {
                statement.close();

            } catch (Exception e2) {
                // TODO: handle exception
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 1。獲取連接的方法 通過讀取配置文件從數據庫服務器獲取一個連接
     * 
     * @author Administrator
     * 
     */
    public static Connection getConnection() throws Exception {
        String driverClass = null;
        String jdbcUrl = null;
        String user = null;
        String password = null;
        // 讀取類路徑下的jdbc.properties文件
        InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream(
                "jdbc.properties");
        Properties properties = new Properties();
        properties.load(in);
        driverClass = properties.getProperty("driver");
        jdbcUrl = properties.getProperty("jdbcUrl");
        user = properties.getProperty("user");
        password = properties.getProperty("password");
        // 通過反射創建Driver對象
        Driver driver = (Driver) Class.forName(driverClass).newInstance();
        Properties info = new Properties();
        info.put("user", user);
        info.put("password", password);
        Connection connection = driver.connect(jdbcUrl, info);
        return connection;
    }
}

本文為博主原創文章,轉載請注明出處:http://www.cnblogs.com/ysw-go/
1、本博客的原創原創文章,都是本人平時學習所做的筆記,如有錯誤,歡迎指正。
2、如有侵犯您的知識產權和版權問題,請通知本人,本人會即時做出處理文章。
3、本博客的目的是知識交流所用,轉載自其它博客或網站,作為自己的參考資料的,感謝這些文章的原創人員


免責聲明!

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



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