21、jdbc入門1

guanhang89發表於2016-06-10

jdbc入門

什麼是jdbc

使用java程式碼(程式)傳送sql語句的技術,就是jdbc技術!!!!

連線案例

/**
 * jdbc連線資料庫
 * @author APPle
 *
 */
public class Demo1 {
    //連線資料庫的URL
    private String url = "jdbc:mysql://localhost:3306/day17";
                        // jdbc協議:資料庫子協議:主機:埠/連線的資料庫   //

    private String user = "root";//使用者名稱
    private String password = "root";//密碼

    /**
     * 第一種方法
     * @throws Exception
     */
    @Test
    public void test1() throws Exception{
        //1.建立驅動程式類物件
        Driver driver = new com.mysql.jdbc.Driver(); //新版本
        //Driver driver = new org.gjt.mm.mysql.Driver(); //舊版本

        //設定使用者名稱和密碼
        Properties props = new Properties();
        props.setProperty("user", user);
        props.setProperty("password", password);

        //2.連線資料庫,返回連線物件
        Connection conn = driver.connect(url, props);

        System.out.println(conn);
    }

    /**
     * 使用驅動管理器類連線資料庫(註冊了兩次,沒必要)
     * @throws Exception
     */
    @Test
    public void test2() throws Exception{
        Driver driver = new com.mysql.jdbc.Driver();
        //Driver driver2 = new com.oracle.jdbc.Driver();
        //1.註冊驅動程式(可以註冊多個驅動程式)
        DriverManager.registerDriver(driver);
        //DriverManager.registerDriver(driver2);

        //2.連線到具體的資料庫
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);

    }

    /**
     * (推薦使用這種方式連線資料庫)
     * 推薦使用載入驅動程式類 來 註冊驅動程式 
     * @throws Exception
     */
    @Test
    public void test3() throws Exception{
        //Driver driver = new com.mysql.jdbc.Driver();

        //通過得到位元組碼物件的方式載入靜態程式碼塊,從而註冊驅動程式
        Class.forName("com.mysql.jdbc.Driver");

        //Driver driver2 = new com.oracle.jdbc.Driver();
        //1.註冊驅動程式(可以註冊多個驅動程式)
        //DriverManager.registerDriver(driver);
        //DriverManager.registerDriver(driver2);

        //2.連線到具體的資料庫
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);

    }

}

核心API

|- Driver介面: 表示java驅動程式介面。所有的具體的資料庫廠商要來實現此介面。
    |- connect(url, properties):  連線資料庫的方法。
            url: 連線資料庫的URL 
                URL語法: jdbc協議:資料庫子協議://主機:埠/資料庫
                user: 資料庫的使用者名稱
                password: 資料庫使用者密碼
|- DriverManager類: 驅動管理器類,用於管理所有註冊的驅動程式
    |-registerDriver(driver)  : 註冊驅動類物件
    |-Connection getConnection(url,user,password);  獲取連線物件

|- Connection介面: 表示java程式和資料庫的連線物件。
        |- Statement createStatement() : 建立Statement物件
        |- PreparedStatement prepareStatement(String sql)  建立PreparedStatement物件
        |- CallableStatement prepareCall(String sql) 建立CallableStatement物件

|- Statement介面: 用於執行靜態的sql語句
        |- int executeUpdate(String sql)  : 執行靜態的更新sql語句(DDL,DML)
        |- ResultSet executeQuery(String sql)  :執行的靜態的查詢sql語句(DQL)

    |-PreparedStatement介面:用於執行預編譯sql語句
            |- int executeUpdate() : 執行預編譯的更新sql語句(DDL,DML)
            |-ResultSet executeQuery()  : 執行預編譯的查詢sql語句(DQL)

        |-CallableStatement介面:用於執行儲存過程的sql語句(call xxx)
                |-ResultSet executeQuery()  : 呼叫儲存過程的方法


|- ResultSet介面:用於封裝查詢出來的資料
        |- boolean next() : 將游標移動到下一行
        |-getXX() : 獲取列的值

執行DDL

/**
 * 執行DDL語句(建立表)
 */
@Test
public void test1(){
    Statement stmt = null;
    Connection conn = null;
    try {
        //1.驅動註冊程式
        Class.forName("com.mysql.jdbc.Driver");

        //2.獲取連線物件
        conn = DriverManager.getConnection(url, user, password);

        //3.建立Statement
        stmt = conn.createStatement();

        //4.準備sql
        String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),gender VARCHAR(2))";

        //5.傳送sql語句,執行sql語句,得到返回結果
        int count = stmt.executeUpdate(sql);

        //6.輸出
        System.out.println("影響了"+count+"行!");
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    } finally{
        //7.關閉連線(順序:後開啟的先關閉)
        if(stmt!=null)
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        if(conn!=null)
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
    }
}

執行DML

PreparedStatement vs Statment
1)語法不同:PreparedStatement可以使用預編譯的sql,而Statment只能使用靜態的sql
2)效率不同: PreparedStatement可以使用sql快取區,效率比Statment高
3)安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。
推薦使用PreparedStatement
/**
 * 使用Statement執行DML語句
 * @author APPle
 *
 */
public class Demo2 {
    private String url = "jdbc:mysql://localhost:3306/day17";
    private String user = "root";
    private String password = "root";

    /**
     * 增加
     */
    @Test
    public void testInsert(){
        Connection conn = null;
        Statement stmt = null;
        try {
            //通過工具類獲取連線物件
            conn = JdbcUtil.getConnection();

            //3.建立Statement物件
            stmt = conn.createStatement();

            //4.sql語句
            String sql = "INSERT INTO student(NAME,gender) VALUES('李四','女')";

            //5.執行sql
            int count = stmt.executeUpdate(sql);

            System.out.println("影響了"+count+"行");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally{
            //關閉資源
            /*if(stmt!=null)
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            if(conn!=null)
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }*/
            JdbcUtil.close(conn, stmt);
        }
    }

    /**
     * 修改
     */
    @Test
    public void testUpdate(){
        Connection conn = null;
        Statement stmt = null;
        //模擬使用者輸入
        String name = "陳六";
        int id = 3;
        try {
            /*//1.註冊驅動
            Class.forName("com.mysql.jdbc.Driver");

            //2.獲取連線物件
            conn = DriverManager.getConnection(url, user, password);*/
            //通過工具類獲取連線物件
            conn = JdbcUtil.getConnection();

            //3.建立Statement物件
            stmt = conn.createStatement();

            //4.sql語句
            String sql = "UPDATE student SET NAME='"+name+"' WHERE id="+id+"";

            System.out.println(sql);

            //5.執行sql
            int count = stmt.executeUpdate(sql);

            System.out.println("影響了"+count+"行");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally{
            //關閉資源
            /*if(stmt!=null)
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            if(conn!=null)
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }*/
            JdbcUtil.close(conn, stmt);
        }
    }

    /**
     * 刪除
     */
    @Test
    public void testDelete(){
        Connection conn = null;
        Statement stmt = null;
        //模擬使用者輸入
        int id = 3;
        try {
            /*//1.註冊驅動
            Class.forName("com.mysql.jdbc.Driver");

            //2.獲取連線物件
            conn = DriverManager.getConnection(url, user, password);*/
            //通過工具類獲取連線物件
            conn = JdbcUtil.getConnection();

            //3.建立Statement物件
            stmt = conn.createStatement();

            //4.sql語句
            String sql = "DELETE FROM student WHERE id="+id+"";

            System.out.println(sql);

            //5.執行sql
            int count = stmt.executeUpdate(sql);

            System.out.println("影響了"+count+"行");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally{
            //關閉資源
            /*if(stmt!=null)
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            if(conn!=null)
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }*/
            JdbcUtil.close(conn, stmt);
        }
    }
}

執行DQL

/**
 * 使用Statement執行DQL語句(查詢操作)
 * @author APPle
 */
public class Demo3 {

    @Test
    public void test1(){
        Connection conn = null;
        Statement stmt = null;
        try{
            //獲取連線
            conn = JdbcUtil.getConnection();
            //建立Statement
            stmt = conn.createStatement();
            //準備sql
            String sql = "SELECT * FROM student";
            //執行sql
            ResultSet rs = stmt.executeQuery(sql);

            //移動游標
            /*boolean flag = rs.next();

            flag = rs.next();
            flag = rs.next();
            if(flag){
                //取出列值
                //索引
                int id = rs.getInt(1);
                String name = rs.getString(2);
                String gender = rs.getString(3);
                System.out.println(id+","+name+","+gender);

                //列名稱
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String gender = rs.getString("gender");
                System.out.println(id+","+name+","+gender);
            }*/

            //遍歷結果
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String gender = rs.getString("gender");
                System.out.println(id+","+name+","+gender);
            }

        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally{
            JdbcUtil.close(conn, stmt);
        }
    }
}

使用PreparedStatement執行sql語句

public class Demo1 {

    /**
     * 增加
     */
    @Test
    public void testInsert() {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            //1.獲取連線
            conn = JdbcUtil.getConnection();

            //2.準備預編譯的sql
            String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)"; //?表示一個引數的佔位符

            //3.執行預編譯sql語句(檢查語法)
            stmt = conn.prepareStatement(sql);

            //4.設定引數值
            /**
             * 引數一: 引數位置  從1開始
             */
            stmt.setString(1, "李四");
            stmt.setString(2, "男");

            //5.傳送引數,執行sql
            int count = stmt.executeUpdate();

            System.out.println("影響了"+count+"行");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            JdbcUtil.close(conn, stmt);
        }
    }

    /**
     * 修改
     */
    @Test
    public void testUpdate() {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            //1.獲取連線
            conn = JdbcUtil.getConnection();

            //2.準備預編譯的sql
            String sql = "UPDATE student SET NAME=? WHERE id=?"; //?表示一個引數的佔位符

            //3.執行預編譯sql語句(檢查語法)
            stmt = conn.prepareStatement(sql);

            //4.設定引數值
            /**
             * 引數一: 引數位置  從1開始
             */
            stmt.setString(1, "王五");
            stmt.setInt(2, 9);

            //5.傳送引數,執行sql
            int count = stmt.executeUpdate();

            System.out.println("影響了"+count+"行");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            JdbcUtil.close(conn, stmt);
        }
    }

    /**
     * 刪除
     */
    @Test
    public void testDelete() {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            //1.獲取連線
            conn = JdbcUtil.getConnection();

            //2.準備預編譯的sql
            String sql = "DELETE FROM student WHERE id=?"; //?表示一個引數的佔位符

            //3.執行預編譯sql語句(檢查語法)
            stmt = conn.prepareStatement(sql);

            //4.設定引數值
            /**
             * 引數一: 引數位置  從1開始
             */
            stmt.setInt(1, 9);

            //5.傳送引數,執行sql
            int count = stmt.executeUpdate();

            System.out.println("影響了"+count+"行");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            JdbcUtil.close(conn, stmt);
        }
    }

    /**
     * 查詢
     */
    @Test
    public void testQuery() {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            //1.獲取連線
            conn = JdbcUtil.getConnection();

            //2.準備預編譯的sql
            String sql = "SELECT * FROM student"; 

            //3.預編譯
            stmt = conn.prepareStatement(sql);

            //4.執行sql
            rs = stmt.executeQuery();

            //5.遍歷rs
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String gender = rs.getString("gender");
                System.out.println(id+","+name+","+gender);
            }

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            //關閉資源
            JdbcUtil.close(conn,stmt,rs);
        }
    }
}

CallableStatement執行儲存過程

/**
 * 使用CablleStatement呼叫儲存過程
 * @author APPle
 *
 */
public class Demo1 {

    /**
     * 呼叫帶有輸入引數的儲存過程
     * CALL pro_findById(4);
     */
    @Test
    public void test1(){
        Connection conn = null;
        CallableStatement stmt = null;
        ResultSet rs = null;
        try {
            //獲取連線
            conn = JdbcUtil.getConnection();

            //準備sql
            String sql = "CALL pro_findById(?)"; //可以執行預編譯的sql

            //預編譯
            stmt = conn.prepareCall(sql);

            //設定輸入引數
            stmt.setInt(1, 6);

            //傳送引數
            rs = stmt.executeQuery(); //注意: 所有呼叫儲存過程的sql語句都是使用executeQuery方法執行!!!

            //遍歷結果
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String gender = rs.getString("gender");
                System.out.println(id+","+name+","+gender);
            }

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            JdbcUtil.close(conn, stmt ,rs);
        }
    }

    /**
     * 執行帶有輸出引數的儲存過程
     * CALL pro_findById2(5,@NAME);
     */
    @Test
    public void test2(){
        Connection conn = null;
        CallableStatement stmt = null;
        ResultSet rs = null;
        try {
            //獲取連線
            conn = JdbcUtil.getConnection();
            //準備sql
            String sql = "CALL pro_findById2(?,?)"; //第一個?是輸入引數,第二個?是輸出引數

            //預編譯
            stmt = conn.prepareCall(sql);

            //設定輸入引數
            stmt.setInt(1, 6);
            //設定輸出引數(註冊輸出引數)
            /**
             * 引數一: 引數位置
             * 引數二: 儲存過程中的輸出引數的jdbc型別    VARCHAR(20)
             */
            stmt.registerOutParameter(2, java.sql.Types.VARCHAR);

            //傳送引數,執行
            stmt.executeQuery(); //結果不是返回到結果集中,而是返回到輸出引數中

            //得到輸出引數的值
            /**
             * 索引值: 預編譯sql中的輸出引數的位置
             */
            String result = stmt.getString(2); //getXX方法專門用於獲取儲存過程中的輸出引數

            System.out.println(result);

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            JdbcUtil.close(conn, stmt ,rs);
        }
    }
}

相關文章