【工具类】JDBCUtils,数据库连接池
生活随笔
收集整理的這篇文章主要介紹了
【工具类】JDBCUtils,数据库连接池
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JDBC
概念:Java DataBase Connectivity Java 數據庫連接, Java語言操作數據庫
* JDBC本質:其實是官方(sun公司)定義的一套操作所有關系型數據庫的規則,即接口。各個數據庫廠商去實現這套接口,提供數據庫驅動jar包。我們可以使用這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類。
基本入門
* 代碼實現:Statement stmt = null;Connection conn = null;try {//1. 注冊驅動Class.forName("com.mysql.jdbc.Driver");//2. 定義sql//account表 添加一條記錄String sql = "insert into account values(null,'王五',3000)";//account表 修改記錄String sql = "update account set balance = 1500 where id = 3";//account表 刪除一條記錄String sql = "delete from account where id = 3";//3.獲取Connection對象conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");//4.獲取執行sql的對象 Statementstmt = conn.createStatement();//5.執行sqlint count = stmt.executeUpdate(sql);//影響的行數//6.處理結果System.out.println(count);if(count > 0){System.out.println("添加成功!");}else{System.out.println("添加失敗!");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally {//stmt.close();//7. 釋放資源//避免空指針異常if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}DriverManager:驅動管理對象
1. 注冊驅動:告訴程序該使用哪一個數據庫驅動jarstatic void registerDriver(Driver driver) :注冊與給定的驅動程序 DriverManager 。 寫代碼使用: Class.forName("com.mysql.jdbc.Driver");這段代碼會初始化下面的靜態代碼塊通過查看源碼發現:在com.mysql.jdbc.Driver類中存在靜態代碼塊static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}注意:mysql5之后的驅動jar包可以省略注冊驅動的步驟。 2. 獲取數據庫連接:* 方法:static Connection getConnection(String url, String user, String password) * 參數:* url:指定連接的路徑* 語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱* 例子:jdbc:mysql://localhost:3306/db3* 細節:如果連接的是本機mysql服務器,并且mysql服務默認端口是3306,則url可以簡寫為:jdbc:mysql:///數據庫名稱* user:用戶名* password:密碼 //獲取數據庫連接對象//Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");Connection conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");Connection:數據庫連接對象
功能:1. 獲取執行sql 的對象,獲取執行平臺,一個預編譯的執行平臺* Statement createStatement()* PreparedStatement prepareStatement(String sql) 注意:* 一定要保證處于同一個事物中的所有材質使用的是同一個connection對象* 一個事務中的多次操作必須是同一個連接2. 管理事務:* 開啟事務:setAutoCommit(boolean autoCommit) :調用該方法設置參數為false,即開啟事務* 提交事務:commit() * 回滾事務:rollback()Statement:執行sql的對象
1. boolean execute(String sql) :可以執行任意的sql 了解,因為這個方法可以執行任意的sql語句,如果執行的是查詢語句,執行完成之后需要我們自己去獲取查詢結果 2. int executeUpdate(String sql) :執行DML(insert、update、delete)語句、DDL(create,alter、drop)語句* 返回值:影響的行數,可以通過這個影響的行數判斷DML語句是否執行成功 返回值>0的則執行成功,反之,則失敗。 3. ResultSet executeQuery(String sql) :執行DQL(select)語句,只能執行查詢語句ResultSet:結果集對象,封裝查詢結果
* boolean next(): 游標向下移動一行,判斷當前行是否是最后一行末尾(是否有數據),如果是,則返回false,如果不是則返回true * getXxx(參數):獲取數據* Xxx:代表數據類型 如: int getInt() , String getString()* 參數:1. int:代表列的編號,從1開始 如: getString(1)2. String:代表列名稱。 如: getDouble("balance")* 注意:* 使用步驟:1. 游標向下移動一行2. 判斷是否有數據3. 獲取數據//循環判斷游標是否是最后一行末尾。while(rs.next()){//獲取數據//6.2 獲取數據int id = rs.getInt(1);String name = rs.getString("name");double balance = rs.getDouble(3);System.out.println(id + "---" + name + "---" + balance);}PreparedStatement:執行sql的對象
1. SQL注入問題:在拼接sql時,有一些sql的特殊關鍵字參與字符串的拼接。會造成安全性問題1. 輸入用戶隨便,輸入密碼:a' or 'a' = 'a2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 2. 解決sql注入問題:使用PreparedStatement對象來解決 3. 預編譯的SQL:參數使用?作為占位符 4. 注意:建議使用PreparedStatement來完成增刪改查的所有操作1. 可以防止SQL注入2. 效率更高數據庫連接池
1. 概念:其實就是一個容器(集合),存放數據庫連接的容器。當系統初始化好后,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,從容器中獲取連接對象,用戶訪問完之后,會將連接對象歸還給容器。2. 好處:1. 節約資源2. 用戶訪問高效3. 實現:1. 標準接口:DataSource javax.sql包下的1. 方法:* 獲取連接:getConnection()* 歸還連接:Connection.close()。如果連接對象Connection是從連接池中獲取的,那么調用Connection.close()方法,則不會再關閉連接了。而是歸還連接2. 一般我們不去實現它,有數據庫廠商來實現1. C3P0:數據庫連接池技術2. Druid:數據庫連接池實現技術,由阿里巴巴提供的C3P0:數據庫連接池技術
* 步驟:1. 導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,2. 定義配置文件:* 名稱: c3p0.properties 或者 c3p0-config.xml* 路徑:直接將文件放在src目錄下即可。3. 創建核心對象 數據庫連接池對象 ComboPooledDataSource4. 獲取連接: getConnection * 代碼:/* * 創建數據庫連接池對象,c3p0是一個開源的JDBC連接池,* 它相對于Druid來說有一個更方便的配置連接方式,就是自動讀取配置文件**/DataSource ds = new ComboPooledDataSource();// 獲取連接對象Connection conn = ds.getConnection();Druid:數據庫連接池實現技術,由阿里巴巴提供的
1. 導入jar包 druid-1.0.9.jar 2. 定義配置文件:* 是properties形式的* 可以叫任意名稱,可以放在任意目錄下 3. 加載配置文件。Properties 4. 獲取數據庫連接池對象:通過工廠來來獲取 DruidDataSourceFactory 5. 獲取連接:getConnection//加載配置文件Properties pro = new Properties();InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//獲取連接池對象DataSource ds = DruidDataSourceFactory.createDataSource(pro);//獲取連接Connection conn = ds.getConnection();抽取JDBC工具類 : JDBCUtils
1. 定義一個類 JDBCUtils 2. 提供靜態代碼塊加載配置文件,初始化連接池對象 3. 提供方法1. 獲取連接方法:通過數據庫連接池獲取連接2. 釋放資源3. 獲取連接池的方法代碼:
/* * 1. 聲明靜態數據源成員變量 * 2. 創建連接池對象 * 3. 定義公有的得到數據源的方法 * 4. 定義得到連接對象的方法 * 5. 定義關閉資源的方法 **/ public class JDBCUtils {// 1. 聲明靜態數據源成員變量private static DataSource ds;// 2. 創建連接池對象static {// 加載配置文件中的數據InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");Properties pp = new Properties();try {pp.load(is);// 創建連接池,使用配置文件中的參數ds = DruidDataSourceFactory.createDataSource(pp);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}// 3. 定義公有的得到數據源的方法public static DataSource getDataSource() {return ds;}// 4. 定義得到連接對象的方法public static Connection getConnection() throws SQLException {return ds.getConnection();}// 5.定義關閉資源的方法public static void close(Connection conn, Statement stmt, ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {}}if (conn != null) {try {conn.close();} catch (SQLException e) {}}}// 6.重載關閉方法public static void close(Connection conn, Statement stmt) {close(conn, stmt, null);} }4,SpringJDBC框架
1,步驟
* Spring框架對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發 * 步驟:1. 導入jar包2. 創建JdbcTemplate對象。依賴于數據源DataSource* JdbcTemplate template = new JdbcTemplate(ds);3. 調用JdbcTemplate的方法來完成CRUD的操作* update():執行DML語句。增、刪、改語句* queryForMap():查詢結果將結果集封裝為map集合,將列名作為key,將值作為value 將這條記錄封裝為一個map集合* 注意:這個方法查詢的結果集長度只能是1* queryForList():查詢結果將結果集封裝為list集合* 注意:將每一條記錄封裝為一個Map集合,再將Map集合裝載到List集合中* query():查詢結果,將結果封裝為JavaBean對象* query的參數:RowMapper* 一般我們使用BeanPropertyRowMapper實現類。可以完成數據到JavaBean的自動封裝* new BeanPropertyRowMapper<類型>(類型.class)* queryForObject:查詢結果,將結果封裝為對象* 一般用于聚合函數的查詢總結
以上是生活随笔為你收集整理的【工具类】JDBCUtils,数据库连接池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SSM框架系列】Spring IoC(
- 下一篇: 【SSM框架系列】Spring 的 AO