JDBC获得数据库连接及使用
1.Connection?
- Java.sql.Driver 接口是所有 JDBC 驅動程序需要實現的接口。這個接口是提供給數據庫廠商使用的,不同數據庫廠商提供不同的實現
- 在程序中不需要直接去訪問實現了 Driver 接口的類,而是由驅動程序管理器類(java.sql.DriverManager)去調用這些Driver實現
- ?通常不用顯式調用 DriverManager 類的 registerDriver() 方法來注冊驅動程序類的實例,因為 Driver 接口的驅動程序類都包含了靜態代碼塊,在這個靜態代碼塊中,會調用 DriverManager.registerDriver() 方法來注冊自身的一個實例
@Testpublic void testDBDynamicDriver() throws Exception {// 1.讀取配置文件Properties prop = new Properties();InputStream in = null;try {in = new FileInputStream(new File("jdbc.properties"));prop.load(in);} catch (Exception e1) {e1.printStackTrace();}String url = prop.getProperty("db.url");String user = prop.getProperty("db.user");String password = prop.getProperty("db.password");String driverPath = prop.getProperty("db.driver");// 2.配置properties,Normally at least "user" and "password" properties should be// included in the Properties object. Properties jdbcprop = new Properties();jdbcprop.put("user", user);jdbcprop.put("password", password);Class<?> driverClass = Class.forName(driverPath);Driver driver = (Driver) driverClass.newInstance();Connection conn = driver.connect(url, jdbcprop);in.close();System.out.println(conn);}@Testpublic void testDBDriverManager() throws Exception {// 1.讀取配置文件Properties prop = new Properties();InputStream in = null;try {in = new FileInputStream(new File("jdbc.properties"));prop.load(in);} catch (Exception e1) {e1.printStackTrace();}String url = prop.getProperty("db.url");String user = prop.getProperty("db.user");String password = prop.getProperty("db.password");String driverPath = prop.getProperty("db.driver");// 2.加載數據庫驅動程序//實際應該這樣寫,但是在mysql driver的靜態代碼塊會被執行實例和注冊 DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());//Class.forName(driverPath);Connection conn = DriverManager.getConnection(url, user, password);in.close();System.out.println(conn);}
?2.Statement?
- 通過調用 Connection 對象的 createStatement 方法創建該對象
- 該對象用于執行靜態的 SQL 語句,并且返回執行結果
- Statement 接口中定義了下列方法用于執行 SQL 語句:
–????? ResultSet excuteQuery(String sql)
–????? int excuteUpdate(String sql)
?
@Testpublic void testDBStatement() throws Exception {// 1.讀取配置文件Properties prop = new Properties();InputStream in = null;try {in = new FileInputStream(new File("jdbc.properties"));prop.load(in);} catch (Exception e1) {e1.printStackTrace();}String url = prop.getProperty("db.url");String user = prop.getProperty("db.user");String password = prop.getProperty("db.password");String driverPath = prop.getProperty("db.driver");// 2.加載數據庫驅動程序// 實際應該這樣寫,但是在mysql driver的靜態代碼塊會被執行實例和注冊 DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());// Class.forName(driverPath);Connection conn = DriverManager.getConnection(url, user, password);in.close();System.out.println(conn);// 3.獲得StatementStatement statement = conn.createStatement();ResultSet ret = statement.executeQuery("select * from teacher");while (ret.next()) {System.out.println(ret.getString("name"));}statement.executeUpdate("update teacher set name = 'Johnson李' where id = '1'");// 先關閉Statement statement.close();// 再關閉Connection conn.close();}3.ResultSet
?
- 通過調用 Statement 對象的 excuteQuery() 方法創建該對象
- ResultSet 對象以邏輯表格的形式封裝了執行數據庫操作的結果集,ResultSet 接口由數據庫廠商實現
- ResultSet 對象維護了一個指向當前數據行的游標,初始的時候,游標在第一行之前,可以通過 ResultSet 對象的 next() 方法移動到下一行
- ResultSet 接口的常用方法:
?
–????? boolean next()
–????? getString()
–????? …
?4.PreparedStatement
- 可以通過調用 Connection 對象的 preparedStatement() 方法獲取 PreparedStatement 對象
- PreparedStatement 接口是 Statement 的子接口,它表示一條預編譯過的 SQL 語句
- PreparedStatement 對象所代表的 SQL 語句中的參數用問號(?)來表示,調用 PreparedStatement 對象的 setXXX() 方法來設置這些參數. setXXX() 方法有兩個參數,第一個參數是要設置的 SQL 語句中的參數的索引(從 1 開始),第二個是設置的 SQL 語句中的參數的值
?
public void testDBPreparedStatement() throws Exception {// 1.讀取配置文件Properties prop = new Properties();InputStream in = null;try {in = new FileInputStream(new File("jdbc.properties"));prop.load(in);} catch (Exception e1) {e1.printStackTrace();}String url = prop.getProperty("db.url");String user = prop.getProperty("db.user");String password = prop.getProperty("db.password");String driverPath = prop.getProperty("db.driver");// 2.加載數據庫驅動程序// 實際應該這樣寫,但是在mysql driver的靜態代碼塊會被執行實例和注冊 DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());// Class.forName(driverPath);Connection conn = DriverManager.getConnection(url, user, password);in.close();System.out.println(conn);// 3.獲得StatementPreparedStatement preparedStatement = conn.prepareStatement("insert into teacher (name,address,year) values(?,?,?)");preparedStatement.setString(1, "wiker");preparedStatement.setString(2, "海富大廈");preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));int ret = preparedStatement.executeUpdate();System.out.println(ret);// 先關閉Statement preparedStatement.close();// 再關閉Connection conn.close();}?
5.Oracle LOB 和 Mysql BLOB
Oracle LOB
- LOB,即Large Objects(大對象),是用來存儲大量的二進制和文本數據的一種數據類型(一個LOB字段可存儲可多達4GB的數據)。
- LOB 分為兩種類型:內部LOB和外部LOB。
–????? 內部LOB將數據以字節流的形式存儲在數據庫的內部。因而,內部LOB的許多操作都可以參與事務,也可以像處理普通數據一樣對其進行備份和恢復操作。Oracle支持三種類型的內部LOB:
- BLOB(二進制數據)??
- CLOB(單字節字符數據)?
- NCLOB(多字節字符數據)。
–????? CLOB和NCLOB類型適用于存儲超長的文本數據,BLOB字段適用于存儲大量的二進制數據,如圖像、視頻、音頻,文件等。
目前只支持一種外部LOB類型,即BFILE類型。在數據庫內,該類型僅存儲數據在操作系統中的位置信息,而數據的實體以外部文件的形式存在于操作系統的文件系統中。因而,該類型所表示的數據是只讀的,不參與事務。該類型可幫助用戶管理大量的由外部程序訪問的文件。
?
Mysql BLOB
MySQL中,BLOB是一個二進制大型對象,是一個可以存儲大量數據的容器,它能容納不同大小的數據。
MySQL的四種BLOB類型(除了在存儲的最大信息量上不同外,他們是等同的)
實際使用中根據需要存入的數據大小定義不同的BLOB類型。
需要注意的是:如果存儲的文件過大,數據庫的性能會下降。
?
@Testpublic void testDBBlob() throws Exception {// 1.讀取配置文件Properties prop = new Properties();InputStream in = null;try {in = new FileInputStream(new File("jdbc.properties"));prop.load(in);} catch (Exception e1) {e1.printStackTrace();}String url = prop.getProperty("db.url");String user = prop.getProperty("db.user");String password = prop.getProperty("db.password");String driverPath = prop.getProperty("db.driver");// 2.加載數據庫驅動程序// 實際應該這樣寫,但是在mysql driver的靜態代碼塊會被執行實例和注冊 DriverManager.registerDriver((java.sql.Driver) Class.forName(driverPath).newInstance());// Class.forName(driverPath);Connection conn = DriverManager.getConnection(url, user, password);in.close();System.out.println(conn);// 3.獲得StatementPreparedStatement preparedStatement = conn.prepareStatement("insert into picture (picture) values(?)");InputStream inputStream = new FileInputStream(new File("F:\\照片\\Camera\\IMG_20160719_103500.jpg"));preparedStatement.setBlob(1, inputStream);int ret = preparedStatement.executeUpdate();inputStream.close();System.out.println(ret);// 先關閉Statement preparedStatement.close();// 再關閉Connection conn.close();}?
6.Apache—DBUtils簡介
- commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低,并且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程序的性能。
- API介紹:
–????? org.apache.commons.dbutils.QueryRunner
–????? org.apache.commons.dbutils.ResultSetHandler
- 工具類
– ? ??org.apache.commons.dbutils.DbUtils、
package com.atguigu.jdbc;import java.io.IOException; import java.sql.Connection; import java.sql.Date; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map;import org.apache.commons.dbutils.QueryLoader; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.MapHandler; import org.apache.commons.dbutils.handlers.MapListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.junit.Test;/*** 測試 DBUtils 工具類**/ public class DBUtilsTest {/*** QueryLoader: 可以用來加載存放著 SQL 語句的資源文件.* 使用該類可以把 SQL 語句外置化到一個資源文件中. 以提供更好的解耦* @throws IOException */@Testpublic void testQueryLoader() throws IOException{// / 代表類路徑的根目錄. Map<String, String> sqls = QueryLoader.instance().load("/sql.properties");String updateSql = sqls.get("UPDATE_CUSTOMER");System.out.println(updateSql); }/*** 1. ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最終取決于* query 方法的 ResultHandler 參數的 hanlde 方法的返回值. * * 2. BeanListHandler: 把結果集轉為一個 Bean 的 List, 并返回. Bean 的類型在* 創建 BeanListHanlder 對象時以 Class 對象的方式傳入. 可以適應列的別名來映射 * JavaBean 的屬性名: * String sql = "SELECT id, name customerName, email, birth " +* "FROM customers WHERE id = ?";* * BeanListHandler(Class<T> type)* * 3. BeanHandler: 把結果集轉為一個 Bean, 并返回. Bean 的類型在創建 BeanHandler* 對象時以 Class 對象的方式傳入* BeanHandler(Class<T> type) * * 4. MapHandler: 把結果集轉為一個 Map 對象, 并返回. 若結果集中有多條記錄, 僅返回* 第一條記錄對應的 Map 對象. Map 的鍵: 列名(而非列的別名), 值: 列的值* * 5. MapListHandler: 把結果集轉為一個 Map 對象的集合, 并返回. * Map 的鍵: 列名(而非列的別名), 值: 列的值* * 6. ScalarHandler: 可以返回指定列的一個值或返回一個統計函數的值. */@Testpublic void testScalarHandler(){Connection connection = null;QueryRunner queryRunner = new QueryRunner();String sql = "SELECT name FROM customers " +"WHERE id = ?";try {connection = JDBCTools.getConnection();Object count = queryRunner.query(connection, sql, new ScalarHandler(), 6);System.out.println(count); } catch (Exception e) {e.printStackTrace();} finally{JDBCTools.releaseDB(null, null, connection);}}@Testpublic void testMapListHandler(){Connection connection = null;QueryRunner queryRunner = new QueryRunner();String sql = "SELECT id, name, email, birth " +"FROM customers";try {connection = JDBCTools.getConnection();List<Map<String, Object>> mapList = queryRunner.query(connection, sql, new MapListHandler());System.out.println(mapList); } catch (Exception e) {e.printStackTrace();} finally{JDBCTools.releaseDB(null, null, connection);}}@Testpublic void testMapHandler(){Connection connection = null;QueryRunner queryRunner = new QueryRunner();String sql = "SELECT id, name customerName, email, birth " +"FROM customers WHERE id = ?";try {connection = JDBCTools.getConnection();Map<String, Object> map = queryRunner.query(connection, sql, new MapHandler(), 4);System.out.println(map); } catch (Exception e) {e.printStackTrace();} finally{JDBCTools.releaseDB(null, null, connection);}}/*** 測試 ResultSetHandler 的 BeanListHandler 實現類* BeanListHandler: 把結果集轉為一個 Bean 的 List. 該 Bean* 的類型在創建 BeanListHandler 對象時傳入:* * new BeanListHandler<>(Customer.class)* */@Testpublic void testBeanListHandler(){String sql = "SELECT id, name customerName, email, birth " +"FROM customers";//1. 創建 QueryRunner 對象QueryRunner queryRunner = new QueryRunner();Connection conn = null;try {conn = JDBCTools.getConnection();Object object = queryRunner.query(conn, sql, new BeanListHandler<>(Customer.class)); System.out.println(object); } catch (Exception e) {e.printStackTrace();} finally{JDBCTools.releaseDB(null, null, conn);}}/*** 測試 QueryRunner 的 query 方法*/@SuppressWarnings({ "unchecked", "rawtypes" })@Testpublic void testResultSetHandler(){String sql = "SELECT id, name, email, birth " +"FROM customers";//1. 創建 QueryRunner 對象QueryRunner queryRunner = new QueryRunner();Connection conn = null;try {conn = JDBCTools.getConnection();/*** 2. 調用 query 方法:* ResultSetHandler 參數的作用: query 方法的返回值直接取決于 * ResultSetHandler 的 hanlde(ResultSet rs) 是如何實現的. 實際上, 在* QueryRunner 類的 query 方法中也是調用了 ResultSetHandler 的 handle()* 方法作為返回值的。*/Object object = queryRunner.query(conn, sql, new ResultSetHandler(){@Overridepublic Object handle(ResultSet rs) throws SQLException {List<Customer> customers = new ArrayList<>();while(rs.next()){int id = rs.getInt(1);String name = rs.getString(2);String email = rs.getString(3);Date birth = rs.getDate(4);Customer customer = new Customer(id, name, email, birth);customers.add(customer);}return customers;}}); System.out.println(object); } catch (Exception e) {e.printStackTrace();} finally{JDBCTools.releaseDB(null, null, conn);}}/*** 測試 QueryRunner 類的 update 方法* 該方法可用于 INSERT, UPDATE 和 DELETE*/@Testpublic void testQueryRunnerUpdate() {//1. 創建 QueryRunner 的實現類QueryRunner queryRunner = new QueryRunner();String sql = "DELETE FROM customers " +"WHERE id IN (?,?)";Connection connection = null;try {connection = JDBCTools.getConnection();//2. 使用其 update 方法 queryRunner.update(connection, sql, 12, 13);} catch (Exception e) {e.printStackTrace();} finally{JDBCTools.releaseDB(null, null, connection);}}}?
轉載于:https://www.cnblogs.com/pjlhf/p/8677105.html
總結
以上是生活随笔為你收集整理的JDBC获得数据库连接及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中静态方法和非静态方法的区别
- 下一篇: 2013年上半年 中级数据库工程师