1. 程式人生 > >最全 jdbc從入門到精通

最全 jdbc從入門到精通

  1. JDBC是什麼?

    jdbc是 java資料庫連線(java DataBase Connectivity)技術的簡稱,由一組使用java語言編寫的類與介面組成,可以為多種關係資料庫提供統一訪問
  2. 沒有使用jdbc之前操作資料庫的操作

    1> 通過MySQL的客戶端工具,登入資料庫伺服器 (mysql -u root -p 密碼); 
    2>編寫sql語句; 
    3>傳送sql語句到資料庫。

  3. 使用jdbc之後操作資料庫的操作

    登入資料庫伺服器(連線資料庫伺服器),獲:取資料庫的IP地址、埠、資料庫使用者名稱、密碼。

/**
 * 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); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

3.jdbc介面核心api

java.sql.*   和  javax.sql.*

        |- 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() : 獲取列的值

4.使用Statement執行sql語句

4.1 執行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);
                }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
4.2 執行DML語句
/**
 * 使用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{
            //關閉資源
            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{
            //關閉資源
            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{
            //關閉資源
            JdbcUtil.close(conn, stmt);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122


/**
 * jdbc工具類
 *
 */
public class JdbcUtil {
    private static String url = null;
    private static String user = null;
    private static String password = null;
    private static String driverClass = null;

    /**
     * 靜態程式碼塊中(只加載一次)
     */
    static{
        try {
            //讀取db.properties檔案
            Properties props = new Properties();
            /**
             *  . 代表java命令執行的目錄
             *  在java專案下,. java命令的執行目錄從專案的根目錄開始
             *  在web專案下,  . java命令的而執行目錄從tomcat/bin目錄開始
             *  所以不能使用點.
             */
            //FileInputStream in = new FileInputStream("./src/db.properties");

            /**
             * 使用類路徑的讀取方式
             *  / : 斜槓表示classpath的根目錄
             *     在java專案下,classpath的根目錄從bin目錄開始
             *     在web專案下,classpath的根目錄從WEB-INF/classes目錄開始
             */
            InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");

            //載入檔案
            props.load(in);
            //讀取資訊
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");
            driverClass = props.getProperty("driverClass");


            //註冊驅動程式
            Class.forName(driverClass);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("驅程程式註冊出錯");
        }
    }

    /**
     * 抽取獲取連線物件的方法
     */
    public static Connection getConnection(){
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }


    /**
     * 釋放資源的方法
     */
    public static void close(Connection conn,Statement stmt){
        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);
            }
        }
    }

    public static void close(Connection conn,Statement stmt,ResultSet rs){
        if(rs!=null)
            try {
                rs.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
                throw new RuntimeException(e1);
            }
        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);
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
4.3 執行DQL語句
/**
 * 使用Statement執行DQL語句(查詢操作)
 */
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);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

5.使用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);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151

PreparedStatement vs Statment 
1)語法不同:PreparedStatement可以使用預編譯的sql,而Statment只能使用靜態的sql 
2)效率不同: PreparedStatement可以使用sql快取區,效率比Statment高 
3)安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。

推薦使用PreparedStatement

6.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(?)"; 
            
           

相關推薦

jdbc入門精通

JDBC是什麼? jdbc是 java資料庫連線(java DataBase Connectivity)技術的簡稱,由一組使用java語言編寫的類與介面組成,可以為多種關係資料庫提供統一訪問。 沒有使用jdbc之前操作資料庫的操作 1> 通過MySQL的客戶端工

史上Python入門到資深書籍資料分享!

暢銷書 jpeg 集成 mar sha 鞏固 技能 ima 能力 今天我來為大家分享十本不可錯過的Python好書,分別適合入門、進階到精深三個不同階段的人來閱讀。 Python高性能編程 Amazon 五星暢銷書。 Python 入門進階必讀。 Python代碼僅僅能夠

最新的Docker入門視頻課程——隨堂筆記

teacher 表示 主機 .gz try 空間 vim 服務 pen 視頻課程鏈接 http://edu.51cto.com/course/14479.html Docker容器技術,主講:湯小洋 一、Docker簡介 1. Docker是什麽? ? 產生背景: 開

今天博主跟大家聊一下__陣列去重__!! 【基本原始到高階,再到一句話!~是不是感覺很厲害哈!】

廢話不多說咱們直接看程式碼!! 博主的審美不太好 湊合看哈! <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8"> &nb

Docker教程——理論到實戰(一)

容器是應用走向雲端之後必然的發展趨勢,因此筆者非常樂於和大家分享我們這段時間對容器的理解、心得和實踐。 本篇教程持續編寫了2個星期左右,只是為了大家更好地瞭解、理解和消化這個技術,能夠搭上這波車。 你可以和我們一起討論,我們希望能夠多多交流,多多分享。 如果覺得不錯,請多多點贊,你們的支援是我們前進的最

Docker教程——理論到實戰(三)

往期連結: https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608.html     寫在前面 容器是應用走向雲端之後必然的發展趨勢,因此筆者非常樂

Docker教程——理論到實戰(四)

變量 參加 屬於 當我 web服務 隔離 方便 當前 context 往期內容鏈接 https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608.

JDBC入門到放棄 02-JDBC的Statement

JDBC從入門到放棄 02-JDBC的Statement 拿到了資料庫連線物件了,我們就可以使用資料庫連線來獲取資料庫資料,這節我們講解Statement的使用。 資料庫進行插入資料 步驟: 1:獲取資料庫連線 2:準備插入資料庫的語句 3:執行插入資料庫語句

JDBC入門到放棄-06:JDBC的批處理

JDBC從入門到放棄 06-JDBC的批處理 當有成批插入或者更新記錄的需求時,可以採用JDBC的批量更新機制,這一機制允許多條語句一次性的提交給資料庫批量處理。通常情況下比單獨處理要更有效率。 批量處理一般流程。 假設我們有100000條資料要插入的資料庫,採用批處

JDBC入門到放棄-07:JDBC的資料庫連線池

JDBC從入門到放棄 07-JDBC的資料庫連線池 傳統資料庫連線 一般的資料庫連線操作 ①獲取或建立資料庫連線。 ②進行sql操作 ③斷開資料庫連線。 這樣的搞發存在很多問題 耗費時間 普通的JDBC資料庫連線使用 DriverManager 來獲取,每次向

Docker教程——理論到實戰(七)

本篇教程持續編寫了3個星期左右並且一直在完善、補充具體的細節和實踐,預計全部完成還需要1到2個月的時間。整個教程完成之後,我們將會出書(目前已聯絡出版社)。在這個過程中,您可以加入我們的QQ群(85318032)一起討論、交流和分享這一塊的技術。根據目前和大家的交流,筆者針對大家的情況進行了

Docker最全教程——理論到實戰(七) Docker最全教程——理論到實戰(一) Docker最全教程——理論到實戰(二) Docker最全教程——理論到實戰(三) Docker最全教程——理論到實戰(四) Docker最全教程——理論到實戰(五) Docker最全教程——理論到實戰

在本系列教程中,筆者希望將必要的知識點圍繞理論、流程(工作流程)、方法、實踐來進行講解,而不是單純的為講解知識點而進行講解。也就是說,筆者希望能夠讓大家將理論、知識、思想和指導應用到工作的實際場景和實踐之中,而不是拿著字典寫文章,抱著寶典寫程式碼。至於很多具體的語法、技術細節,除了常用的知識點,筆者更希望大家

Docker教程——理論到實戰(一) Docker教程——理論到實戰(一)

Docker最全教程——從理論到實戰(一) 目錄 前言 隨著生產力的發展尤其是彈性架構的廣泛應用(比如微服務),許多一流開發者都將應用託管到了應用容器上,比如Google、微軟、亞馬遜、騰訊、阿里、京東和新浪。   從未來的發展方向來看,容器引擎將會越來越成為主流,哪怕不是彈性架構

Docker教程——理論到實戰(二) Docker教程——理論到實戰(二)

Docker最全教程——從理論到實戰(二) Docker和ASP.NET Core Docker 正在逐漸成為容器行業的事實標準,受到 Windows 和 Linux 生態系統領域最重要供應商的支援。 (Microsoft 是支援 Do

Docker教程——理論到實戰(三) Docker教程——理論到實戰(三)

Docker最全教程——從理論到實戰(三) 寫在前面 容器是應用走向雲端之後必然的發展趨勢,因此筆者非常樂於和大家分享我們這段時間對容器的理解、心得和實踐。 本教程持續編寫了2個星期左右並且一直在完善、補充具體的細節和實踐,預計全部完成需要1到2個月的時間。由於編寫的過程中極其費時,並且還需要配合做一些

Docker教程——理論到實戰(五) Docker教程——理論到實戰(五)

Docker最全教程——從理論到實戰(五) 執行 Docker 應用程式 如果應用程式只有一個容器,則可通過將其部署到 Docker 主機(虛擬機器或物理伺服器)來執行該程式。 但如果應用程式包含多項服務,則可使用單個 CLI 命令 (docker-compose up) 或使用 Visual S

Docker教程——理論到實戰(四) Docker教程——理論到實戰(四)

Docker最全教程——從理論到實戰(四) 建立自定義 Docker 映象   建立了Dockerfile之後,需為應用程式中的每項服務建立一個相關映象。如果應用程式由單個服務或 Web 應用程式組成,則只需建立一個映象。 我們可以使用docker build命令來建立映象,例如

Docker教程——理論到實戰(二)

Docker和ASP.NET Core Docker 正在逐漸成為容器行業的事實標準,受到 Windows 和 Linux 生態系統領域最重要供應商的支援。 (Microsoft 是支援 Docker 的主要雲供應商

Docker教程——理論到實戰(一)

容器是應用走向雲端之後必然的發展趨勢,因此筆者非常樂於和大家分享我們這段時間對容器的理解、心得和實踐。 本篇教程持續編寫了2個星期左右,只是為了大家更好地瞭解、理解和消化這個技術,能夠搭上這波車。 你可以關注我們的公眾號“magiccodes”給我們留言,也可以加入我們的QQ群(853180

Docker最全教程——理論到實戰(八) Docker最全教程——理論到實戰(一) Docker最全教程——理論到實戰(二) Docker最全教程——理論到實戰(三) Docker最全教程——理論到實戰(四) Docker最全教程——理論到實戰(五) Docker最全教程——理論到實戰

在本系列教程中,筆者希望將必要的知識點圍繞理論、流程(工作流程)、方法、實踐來進行講解,而不是單純的為講解知識點而進行講解。也就是說,筆者希望能夠讓大家將理論、知識、思想和指導應用到工作的實際場景和實踐之中,而不是拿著字典寫文章,抱著寶典寫程式碼。至於很多具體的語法、技術細節,除了常用的知識點,筆者更希望大家