Java基礎93 JDBC鏈接MySQL數據庫

本文知識點(目錄):html

    一、什麼是jdbc
    二、jdbc接口的核心API
    三、使用JDBC技術鏈接MySQL數據庫的方法
    四、使用Statement執行sql語句(DDL、DML、DQL)
    五、使用PreparedStatement執行sql語句
    六、使用callablestaement執行sql語句,調用存儲過程java

    七、附錄(jdbc鏈接數據庫 實操)
    八、完整的JDBC封裝過程,及調用jdbc的使用過程實例mysql



一、什麼是jdbc                                      

  簡單的講就是:使用java代碼(程序)發送sql語句的技術,稱爲jdbc技術。sql

二、jdbc接口的核心API                          

 1 |-Driver 接口:表示java驅動程序接口。全部的具體的數據庫廠商要實現的接口.
 2    |-connect(String url, Properties info):鏈接數據庫的方法
 3      Url:鏈接數據庫的URL
 4      URL語法:jdbc協議:數據庫子協議://主機:端口/數據庫名
 5      User:數據庫的用戶名
 6      Password:數據的用戶密碼
 7 |-DriverManager 類:驅動管理器類,用於管理全部的註冊的驅動程序
 8    |-registerDriver(Driver driver):註冊驅動類對象
 9    |-getConnection(String url, String user, String password):獲取鏈接對象
10 |-Connection 接口:表示java程序和數據庫的鏈接對象
11    |-createStatement()
12    |-prepareStatement(String sql):建立PreparedStatement對象
13    |-prepareCall(String sql):建立CallableStatement對象
14 |-statement 接口:用於執行靜態的sql語句
15    |-executeUpdate(String sql): 執行靜態的sql語句(DDL、DML)
16    |-executeQuery(String sql) :靜態的查詢sql語句(DQL)
17    |-PreparedStatement 接口:用於執行預編譯sql語句
18      |-executeUpdate(String sql):執行靜態的sql語句(DDL、DML)
19      |-executeQuery(String sql):靜態的查詢sql語句(DQL)
20    |-CallableStatement 接口:用於執行存儲過程的sql語句(call xxx)
21 |-ResultSet 接口:用於封裝查詢出來的數據
22    |-next():將光標移到下一行
23    |-getxxx(int columnIndex):獲取列的值有getInt()、getString()、getArray()、getURL() 等等
24 |-getRow():獲取當前行編號。

三、使用JDBC技術鏈接MySQL數據庫的方法 

 1 package com.shore.a_jdbc;
 2 
 3 import java.sql.Connection;
 4 import java.sql.Driver;
 5 import java.sql.DriverManager;
 6 import java.util.Properties;
 7 
 8 /**
 9  * @author DSHORE/2019-3-23
10  *
11  */
12 //鏈接MySQL數據庫的幾種方法
13 public class connJDBC {
14     //                 jdbc協議:數據庫的子協議:主機:端口/要鏈接的數據庫名稱
15     private String url = "jdbc:mysql://localhost:3306/school";//鏈接數據庫的URL連接
16     private String user = "root";//用戶名
17     private String password = "123456";//密碼
18     /*
19      * 第一種方法:
20      * */
21     public void test1() throws Exception{
22         //1.建立驅動程序類對象
23         Driver driver = new com.mysql.jdbc.Driver();
24         //Driver driver = new org.gjt.mm.mysql.Driver();//舊版本的建立方法
25         //設置用戶名密碼
26         Properties props = new Properties();
27         props.setProperty("user",user);
28         props.setProperty("password",password);
29         //2.鏈接數據庫,返回鏈接對象
30         Connection conn = driver.connect(url, props);
31         System.out.println(conn);//返回值:com.mysql.jdbc.JDBC4Connection@29c56c60,表示已鏈接成功
32     }
33     /*
34      * 第二種方法:使用驅動管理器類鏈接數據庫
35      * */
36     public void test2()throws Exception{
37         //1.建立驅動程序類對象
38         Driver driver = new com.mysql.jdbc.Driver();//MySQL數據庫
39         //Driver driver2 = new com.oracle.jdbc.Driver();//Oracle數據庫
40         //註冊驅動程序(能夠註冊多個驅動)
41         DriverManager.registerDriver(driver);
42         //DriverManager.registerDriver(driver2);
43         //2.鏈接數據庫
44         Connection conn=DriverManager.getConnection(url, user, password);
45         System.out.println(conn);
46     }
47     /*
48      * 第三種方法:使用加載驅動程序類 來註冊 驅動程序。(推薦使用這種方式鏈接數據庫)
49      * */
50     public void test3() throws Exception{
51         //經過獲得字節碼對象的方式加載靜態代碼塊,從而註冊驅動
52         Class.forName("com.mysql.jdbc.Driver");
53         //2.鏈接數據庫
54         Connection conn = DriverManager.getConnection(url, user, password);
55         System.out.println(conn);    
56     }
57 }

四、使用Statement執行sql語句               

  4.一、執行DDL語句數據庫

 1 package com.shore.b_statement;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7 
 8 import org.junit.Test;
 9 /*
10  *使用statement對象執行靜態sql語句建立表)
11  **/
12 public class Demo1 {
13     //鏈接數據庫的URL
14     private String url="jdbc:mysql://localhost:3306/school";
15                  //jdbc協議:數據庫的子協議:主機:端口/鏈接的數據庫
16     private String user="root";//用戶名
17     private String password="123456";//密碼
18     
19     //執行DDL語句
20     @Test
21     public void test1(){
22         Statement statement = null;
23         Connection connection = null;
24         try {
25             //1.註冊驅動
26             Class.forName("com.mysql.jdbc.Driver");
27             //2.獲取鏈接對象
28             connection = DriverManager.getConnection(url, user, password);
29             //3.建立statement
30             statement = connection.createStatement();
31             //4.準備sql語句
32             String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(32),sex VARCHAR(2));";//建立表 33             int count = statement.executeUpdate(sql);
34             System.out.println("影響行數:"+count+"行!");
35         } catch (ClassNotFoundException e) {
36             e.printStackTrace();
37         } catch (SQLException e) {
38             e.printStackTrace();
39         }finally{
40             //5.關閉鏈接(順序:後代開的先關閉)
41             try {
42                 if(statement != null) statement.close();
43                 if(connection != null) connection.close();
44             } catch (SQLException e) {
45                 e.printStackTrace();
46             }            
47         }
48     }
49 }

    4.二、執行DML語句oracle

封裝工具類(JdbcUtil.java) 文件。(因爲鏈接數據庫和關閉資源的那部分代碼是不變的,因此將他們封裝起來,用到時 就直接調用便可)dom

 1 package com.shore.util;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.sql.Connection;
 7 import java.sql.DriverManager;
 8 import java.sql.ResultSet;
 9 import java.sql.SQLException;
10 import java.sql.Statement;
11 import java.util.Properties;
12 
13 public class JdbcUtil { //把固定不變的那部分代碼封裝起來 14     //動態鏈接數據
15     private static String url = null;
16     private static String user = null;//用戶名
17     private static String password = null;//密碼
18     private static String driverClass = null;
19     //靜態代碼塊中(只加載一次)
20     static{
21         //讀取db.properties
22         Properties props = new Properties();
23         try {
24             FileInputStream fis = new FileInputStream("./src/db.properties");
25             //加載文件
26             props.load(fis);
27             url = props.getProperty("url");
28             user = props.getProperty("user");
29             password = props.getProperty("password");
30             driverClass = props.getProperty("driverClass");
31             //註冊驅動
32             Class.forName(driverClass);
33         } catch (FileNotFoundException e) {
34             e.printStackTrace();
35         } catch (IOException e) {
36             e.printStackTrace();
37         } catch (ClassNotFoundException e) {
38             e.printStackTrace();
39             System.out.println("註冊驅動失敗");
40         }
41     }
42     //獲取鏈接
43     public static Connection getConnection(){
44         try {
45             Connection conn = DriverManager.getConnection(url, user, password);
46             return conn;
47         } catch (SQLException e) {
48             e.printStackTrace();
49             throw new RuntimeException();
50         }
51     }
52     //釋放資源
53     public static void close(Connection conn,Statement stmt,ResultSet rs){
54         try {
55             if(stmt != null) stmt.close();
56             if(conn != null) conn.close();
57             if(rs != null) rs.close();
58         } catch (SQLException e) {
59             e.printStackTrace();
60         }
61     }
62 }

db.properties配置文件(存儲數據庫連接、用戶及密碼等)工具

1 url = jdbc:mysql://localhost:3306/school  //把數據庫的連接入口配置在一個文件中,方便之後操做(更改帳號密碼等等)
2 user = root
3 password = 123456
4 driverClass = com.mysql.jdbc.Driver

執行DML語句 正文url

 1 package com.shore.b_statement;
 2 
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7 
 8 import org.junit.Test;
 9 
10 import com.bw.util.JdbcUtil;
11 
12 /**
13  * 使用statement執行DML語句(添加、刪除、修改數據 14  *
15  */
16 public class Demo2 {
17     /*
18      * 向student表中添加數據
19      * */
20     @Test
21     public void testInsert(){
22         ResultSet rs = null;
23         Connection conn = null;
24         Statement stmt = null;
25         //經過工具類獲取;鏈接對象
26         conn = JdbcUtil.getConnection();
27         //常見statement對象
28         try {
29             stmt=conn.createStatement();
30         } catch (SQLException e) {
31             e.printStackTrace();
32         }
33         String sql = "INSERT INTO student(NAME,sex) VALUES('張三','女');";
34         try {
35             int count = stmt.executeUpdate(sql);
36             System.out.println(count);
37         } catch (SQLException e) {
38             e.printStackTrace();
39         }
40         JdbcUtil.close(conn,stmt,rs);
41     }
42     /*
43      * 修改student表中的數據
44      * */
45     @Test
46     public void testUpdate(){
47         ResultSet rs = null;
48         Connection conn =null;
49         Statement stmt = null;
50         //經過工具類獲取;鏈接對象
51         conn = JdbcUtil.getConnection();
52         //常見statement對象
53         try {
54             stmt = conn.createStatement();
55         } catch (SQLException e) {
56             e.printStackTrace();
57         }
58         String sql = "UPDATE student SET NAME = '王五' WHERE id = 1;";
59         try {
60             int count=stmt.executeUpdate(sql);
61             System.out.println(count);
62         } catch (SQLException e) {
63             e.printStackTrace();
64         }
65         JdbcUtil.close(conn,stmt,rs);
66     }
67     /*
68      * 刪除student表中的數據
69      * */
70     @Test
71     public void testDelete(){
72         ResultSet rs = null;
73         Connection conn = null;
74         Statement stmt = null;
75         //經過工具類獲取;鏈接對象
76         conn = JdbcUtil.getConnection();
77         //常見statement對象
78         try {
79             stmt = conn.createStatement();
80         } catch (SQLException e) {
81             e.printStackTrace();
82         }
83         String sql = "DELETE FROM student WHERE id = 3;";
84         try {
85             int count = stmt.executeUpdate(sql);
86             System.out.println(count);
87         } catch (SQLException e) {
88             e.printStackTrace();
89         }
90         JdbcUtil.close(conn,stmt,rs);
91     }
92 }

    4.三、執行DQL語句spa

 1 package com.shore.b_statement;
 2 
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7 
 8 import org.junit.Test;
 9 
10 import com.bw.util.JdbcUtil;
11 
12 /*
13  * 使用statement執行sql語句(查詢操做語句)
14  * */
15 public class Demo3 {
16     @Test
17     public void test1(){
18         ResultSet rs = null;
19         Connection conn = null;
20         Statement stmt = null;
21         //獲取鏈接
22         conn = JdbcUtil.getConnection();
23         //建立statement
24         try {
25             stmt = conn.createStatement();
26         } catch (SQLException e) {
27             e.printStackTrace();
28         }
29         //準備sql語句
30         String sql = "SELECT * FROM student;";//查詢表中全部數據
31         try {
32             rs=stmt.executeQuery(sql);
33             /*//移動光標
34             boolean flag=rs.next();
35             if(flag){
36                 //取出值
37                 //索引
38                 int id=rs.getInt(1);
39                 String name=rs.getString(2);
40                 String sex=rs.getString(3);
41                 System.out.println(id+","+name+","+sex);
42             }*/
43             //遍歷結果
44             while(rs.next()){
45                 int id=rs.getInt("id");
46                 String name=rs.getString("name");
47                 String sex=rs.getString("sex");
48                 System.out.println(id+","+name+","+sex);
49             }
50         } catch (SQLException e) {
51             e.printStackTrace();
52         }finally{
53             JdbcUtil.close(conn, stmt, rs);
54         }
55     }
56 }

五、使用PreparedStatement執行sql語句         

 1 package com.shore.c_prepared;
 2 
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 
 8 import org.junit.Test;
 9 
10 import com.bw.util.JdbcUtil;
11 
12 /*
13  * preparedStatement執行sql語句(有效防止sql注入的問題)
14  * */
15 public class Demo1 {
16     //增長
17     @Test
18     public void testInsert(){
19         Connection conn = null;
20         PreparedStatement stmt = null;
21         ResultSet rs = null;
22         //1.獲取鏈接
23         conn = JdbcUtil.getConnection();
24         //2準備預編譯的sql
25         String sql = "INSERT INTO student(NAME,sex) VALUES(?,?);";//?表示一個參數的佔位符
26         try {
27             //3執行預編譯的sql語句(檢查語法)
28             stmt = conn.prepareStatement(sql);
29             //4.設置參數
30             stmt.setString(1,"趙六"); //可用name做爲參數表明「趙六」 從頁面傳值來此 31             stmt.setString(2,"女");
32             //5.發送參數,執行sql
33             int count = stmt.executeUpdate();
34             System.out.println("影響了"+count+"行");
35         } catch (SQLException e) {
36             e.printStackTrace();
37         }finally{
38             JdbcUtil.close(conn, stmt, rs);
39         }        
40     }
41 }

六、使用callablestaement執行sql語句,調用存儲過程  

MySQL存儲過程 相關知識點:http://www.javashuo.com/article/p-ookxqvxn-k.html

1 -- 1.帶有輸入參數的存儲過程
2 DELIMITER $
3 CREATE PROCEDURE pro_test(IN sid INT)
4 BEGIN
5     SELECT * FROM student WHERE id=sid;
6 END $
7 
8 CALL pro_test(2);
1 -- 2.執行帶有輸出參數的存儲過程
2 DELIMITER $
3 CREATE PROCEDURE pro_test(IN sid INT,OUT sname VARCHAR(32))
4 BEGIN
5     SELECT NAME INTO sname FROM student WHERE id=sid;
6 END $
7 
8 CALL pro_test(2,@sname);
9 SELECT @sname;

正文代碼

 1 package com.shore.d_callable;
 2 
 3 import java.sql.CallableStatement;
 4 import java.sql.Connection;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 
 8 import org.junit.Test;
 9 
10 import com.bw.util.JdbcUtil;
11 
12 /**
13  * 使用CallableSatement調用存儲過程
14  * @author lx
15  *
16  */
17 public class Demo1 {
18 
19     /*
20      * 1.帶有輸入參數的存儲過程
21      * CALL pro_test(2)
22      * */
23     @Test
24     public void test1(){
25         Connection conn = null;
26         ResultSet rs = null;
27         CallableStatement stmt = null;
28         //獲取鏈接
29         conn = JdbcUtil.getConnection();
30         //準備sql
31         String sql = "CALL pro_test(?);"; //能夠執行預編譯的sql
32         try {
33             //預編譯
34             stmt = conn.prepareCall(sql);
35             //設置參數
36             stmt.setInt(1, 2);
37             //注意:全部的存儲過程的sql語句都是使用executeQuery
38             rs = stmt.executeQuery();
39             //遍歷起結果
40             while(rs.next()){
41                 int id = rs.getInt("id");
42                 String name = rs.getString("name");
43                 String sex = rs.getString("sex");
44                 System.out.println(id+","+name+","+sex);
45             }
46         } catch (SQLException e) {
47             e.printStackTrace();
48         }finally{
49             JdbcUtil.close(conn, stmt, rs);
50         }
51     }
52     /*
53      * 
54      * 2.執行帶有輸出參數的存儲過程
55      * */
56     @Test
57     public void test2(){
58         Connection conn = null;
59         ResultSet rs = null;
60         CallableStatement stmt = null;
61         //獲取鏈接
62         conn = JdbcUtil.getConnection();
63         //準備sql
64         String sql = "CALL pro_test(?,?);"; //第一個?是輸入參數,第二個?是輸出參數
65         try {
66             //預編譯
67             stmt = conn.prepareCall(sql);
68             //設置參數
69             stmt.setInt(1, 2);
70             //設置輸出參數
71             /*
72              *參數 一:參數的位置
73              *參數二:存儲過程當中輸出參數的jdbc類型  varchar(32)
74              * */
75             stmt.registerOutParameter(2,java.sql.Types.VARCHAR);
76             //發送參數,執行
77             stmt.executeQuery();
78             /* //獲得輸出參數的值
79              * 索引值:預編譯sql中的輸出參數的位置
80              * */
81             String result = stmt.getString(2);//getxxx方法專門用於獲取存儲過程當中的輸出參數
82             System.out.println(result);
83         } catch (SQLException e) {
84             e.printStackTrace();
85         }finally{
86             JdbcUtil.close(conn, stmt, rs);
87         }
88     }    
89 }

 

 

 附錄 

建立表:contact

1 create contact(
2     id varchar(32) primary key,
3     name varchar(32),
4     sxe varchar(32),
5     age int,
6     phone varchar(32),
7     email varchar(32),
8     qq varchar(32)
9 );

使用「增刪改查(CRUD)」操做,鏈接數據庫

  1 package com.shore.dao.impl;
  2 
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 import java.util.UUID;
 10 
 11 import com.shore.dao.ContactDAO;
 12 import com.shore.entity.Contact;
 13 import com.shore.util.JdbcUtil;
 14 
 15 public class ContactDAOMySqlImpl implements ContactDAO{
 16 
 17     //添加數據
 18     public void addContact(Contact contact) {
 19         Connection conn;
 20         PreparedStatement stmt = null;
 21         ResultSet rs = null;
 22         conn = JdbcUtil.getConnection();
 23         String sql = "insert into contact(id,name,sex,age,phone,email,qq) values(?,?,?,?,?,?,?)";
 24         try {
 25             //執行預編譯的sql語句(檢查語法)
 26             stmt = conn.prepareStatement(sql);
 27             String id = UUID.randomUUID().toString().replace("-","");
 28             stmt.setString(1, id);
 29             stmt.setString(2, contact.getName());
 30             stmt.setString(3, contact.getSex());
 31             stmt.setInt(4, contact.getAge());
 32             stmt.setString(5, contact.getPhone());
 33             stmt.setString(6, contact.getEmail());
 34             stmt.setString(7, contact.getQq());
 35             stmt.executeUpdate();
 36         } catch (SQLException e) {
 37             e.printStackTrace();
 38         }finally{
 39             JdbcUtil.close(conn, stmt, rs);
 40         }        
 41     }
 42     
 43     //查詢全部數據
 44     public List<Contact> finAll() {
 45         Connection conn;
 46         PreparedStatement stmt = null;
 47         ResultSet rs = null;
 48         //獲取鏈接
 49         conn = JdbcUtil.getConnection();
 50         String sql = "select * from contact";    
 51         try {
 52             //執行預編譯的sql語句(檢查語法)
 53             stmt = conn.prepareStatement(sql);
 54             //執行sql;
 55             rs = stmt.executeQuery();
 56             List<Contact> list = new ArrayList<Contact>();
 57             while(rs.next()){
 58                 //建立Contact對象
 59                 Contact c = new Contact();
 60                 c.setId(rs.getString("id"));
 61                 c.setName(rs.getString("name"));
 62                 c.setSex(rs.getString("sex"));
 63                 c.setAge(rs.getInt("age"));
 64                 c.setPhone(rs.getString("phone"));
 65                 c.setEmail(rs.getString("email"));
 66                 c.setQq(rs.getString("qq"));
 67                 list.add(c);
 68             }
 69             return list;
 70         } catch (SQLException e) {
 71             e.printStackTrace();
 72             throw new RuntimeException();
 73         }finally{
 74             JdbcUtil.close(conn, stmt, rs);
 75         }
 76     }
 77     
 78     //根據id刪除數據
 79     public void delContact(String id) {
 80         Connection conn;
 81         PreparedStatement stmt = null;
 82         ResultSet rs = null;
 83         conn = JdbcUtil.getConnection();
 84         String sql = "delete from contact where id=?";
 85         try {
 86             //執行預編譯的sql語句(檢查語法)
 87             stmt = conn.prepareStatement(sql);
 88             stmt.setString(1,id)
 89             //發送參數,執行sql;
 90             stmt.executeUpdate();
 91         } catch (SQLException e) {
 92             e.printStackTrace();
 93         }finally{//關閉資源
 94             JdbcUtil.close(conn, stmt, rs);
 95         }
 96     }
 97     
 98     //修改數據
 99     public void updateContact(Contact contact) {
100         Connection conn;
101         PreparedStatement stmt = null;
102         ResultSet rs = null;
103         conn = JdbcUtil.getConnection();
104         String sql = "update contact set name=?,sex=?,age=?,phone=?,email=?,qq=? where id=?";
105         try {
106             //執行預編譯的sql語句(檢查語法)
107             stmt=conn.prepareStatement(sql);
108             stmt.setString(1, contact.getName());
109             stmt.setString(2, contact.getSex());
110             stmt.setInt(3, contact.getAge());
111             stmt.setString(4, contact.getPhone());
112             stmt.setString(5, contact.getEmail());
113             stmt.setString(6, contact.getQq());
114             stmt.setString(7, contact.getId());
115             stmt.executeUpdate();
116         } catch (SQLException e) {
117             e.printStackTrace();
118         }finally{
119             JdbcUtil.close(conn, stmt, rs);
120         }
121     }
122 
123     //根據id查詢數據(做用於修改數據的時候)
124     public Contact findById(String id) {
125         Connection conn;
126         PreparedStatement stmt = null;
127         ResultSet rs = null;
128         //獲取鏈接
129         conn = JdbcUtil.getConnection();
130         String sql = "select * from contact where id=?";    
131         try {
132             //執行預編譯的sql語句(檢查語法)
133             stmt = conn.prepareStatement(sql);
134             stmt.setString(1, id);
135             rs = stmt.executeQuery();
136             Contact c = null;
137             while(rs.next()){
138                 //建立Contact對象
139                 c = new Contact();
140                 c.setId(rs.getString("id"));
141                 c.setName(rs.getString("name"));
142                 c.setSex(rs.getString("sex"));
143                 c.setAge(rs.getInt("age"));
144                 c.setPhone(rs.getString("phone"));
145                 c.setEmail(rs.getString("email"));
146                 c.setQq(rs.getString("qq"));                
147             }
148             return c;
149         } catch (SQLException e) {
150             e.printStackTrace();
151             throw new RuntimeException();
152         }finally{
153             JdbcUtil.close(conn, stmt, rs);
154         }
155     }
156     
157     //判斷帳號暱稱是否重複,若重複,頁面端顯示此帳號已存在,請從新取名
158     public boolean checkContact(String name) {
159         Connection conn;
160         PreparedStatement stmt = null;
161         ResultSet rs = null;
162         //獲取數據庫的鏈接
163         conn = JdbcUtil.getConnection();
164         //準備sql
165         String sql = "select * from contact where name = ?";
166         try {
167             //執行預編譯的sql語句(檢查語法)
168             stmt = conn.prepareStatement(sql);
169             //設置參數
170             stmt.setString(1, name);
171             //發送參數,執行sql
172             rs = stmt.executeQuery();
173             if(rs.next()){
174                 return true;            
175             }else{
176                 return false;
177             }
178         } catch (SQLException e) {
179             e.printStackTrace();
180             throw new RuntimeException();
181         }finally{//關閉資源
182             JdbcUtil.close(conn, stmt, rs);
183         }
184     }
185 }

完整的JDBC封裝過程,及調用jdbc的使用過程實例  

db.properties 配置文件(配置了數據庫的驅動、入口鏈接、用戶名、密碼),主要做用:方便之後修改

1 jdbcDriver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/school
3 userName=root
4 passWord=123456

JdbcUtils類,把不變更的、且每次都使用到的那部分代碼封裝起來

 1 package com.shore.utils;
 2 
 3 import java.io.InputStream;
 4 import java.sql.Connection;
 5 import java.sql.DriverManager;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 import java.sql.Statement;
 9 import java.util.Properties;
10 
11 /**
12  * @author DSHORE/2019-5-29
13  *
14  */
15 public class JdbcUtils {
16     //靜態代碼塊執行後,這幾個參數,就有值了
17     private static String jdbcDriver = "";
18     private static String url = "";
19     private static String userName = "";
20     private static String passWord = "";
21 
22     private JdbcUtils() {
23     }
24 
25     static {//靜態代碼塊 26         try {
27             //讀取配置文件db.properties,用於獲取數據庫的入口鏈接url、用戶名、密碼,以及數據庫的驅動
28             InputStream inputStream = JdbcUtils.class.getResourceAsStream("/db.properties");
29             Properties properties = new Properties();
30             properties.load(inputStream);//加載文件
31             inputStream.close();
32             jdbcDriver = properties.getProperty("jdbcDriver");
33             url = properties.getProperty("url");
34             userName = properties.getProperty("userName");
35             passWord = properties.getProperty("passWord");
36             Class.forName(jdbcDriver); //註冊驅動
37         } catch (Exception e) {
38             e.printStackTrace();
39         }
40     }
41 
42     //獲取鏈接
43     public static Connection getConnection() throws SQLException {
44         return DriverManager.getConnection(url, userName, passWord);
45     }
46 
47     //關閉資源(比較嚴謹的寫法)
48     public static void close(Connection connection, Statement statement,ResultSet resultSet) {
49         if (resultSet != null) {
50             try {
51                 resultSet.close();
52             } catch (SQLException e) {
53                 e.printStackTrace();
54             }finally{
55                 if (statement != null) {
56                     try {
57                         statement.close();
58                     } catch (SQLException e) {
59                         e.printStackTrace();
60                     }finally{
61                         if (connection != null) {
62                             try {
63                                 connection.close();
64                             } catch (SQLException e) {
65                                 e.printStackTrace();
66                             }
67                         }
68                     }
69                 }
70             }
71         }
72     }
73 }

↑ 此處封裝已完成。

下面用個簡單的例子來演示怎麼使用:

 1 package com.shore.test;
 2 
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 
 8 import org.junit.Test;
 9 
10 import com.shore.utils.JdbcUtils;
11 
12 /**
13  * @author DSHORE/2019-5-29
14  *
15  */
16 public class jdbcTest {
17 
18     @Test
19     public void testInsert(){
20         Connection connection = null;
21         PreparedStatement preparedStatement = null;
22         ResultSet resultSet = null;
23         try {
24             //1.獲取鏈接
25             connection = JdbcUtils.getConnection();
26             //2.準備預編譯的sql
27             String sql = "insert into teacher(sname,sex) values(?,?);";//?表示一個參數的佔位符
28             //3.執行預編譯的sql語句(檢查語法)
29             preparedStatement = connection.prepareStatement(sql);
30             //4.設置參數
31             preparedStatement.setString(1,"趙六"); //可用name做爲參數表明「趙六」 從頁面傳值來此
32             preparedStatement.setString(2,"女");
33             //5.發送參數,執行sql
34             int count = preparedStatement.executeUpdate();
35             System.out.println("影響了"+count+"行");
36         } catch (SQLException e) {
37             e.printStackTrace();
38         }finally{
39             JdbcUtils.close(connection, preparedStatement, resultSet);
40         }        
41     }
42 }

運行後,結果圖:

 

 

 

 

原創做者:DSHORE

做者主頁:http://www.cnblogs.com/dshore123/

原文出自:http://www.javashuo.com/article/p-gpsfuqrn-m.html

歡迎轉載,轉載務必說明出處。(若是本文對您有幫助,能夠點擊一下右下角的 推薦,或評論,謝謝!

相關文章
相關標籤/搜索