本文知識點(目錄):html
一、什麼是jdbc
二、jdbc接口的核心API
三、使用JDBC技術鏈接MySQL數據庫的方法
四、使用Statement執行sql語句(DDL、DML、DQL)
五、使用PreparedStatement執行sql語句
六、使用callablestaement執行sql語句,調用存儲過程java
七、附錄(jdbc鏈接數據庫 實操)
八、完整的JDBC封裝過程,及調用jdbc的使用過程實例mysql
簡單的講就是:使用java代碼(程序)發送sql語句的技術,稱爲jdbc技術。sql
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():獲取當前行編號。
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 }
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 }
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 }
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 }
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 歡迎轉載,轉載務必說明出處。(若是本文對您有幫助,能夠點擊一下右下角的 推薦,或評論,謝謝!) |