日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

JDBC: Java连接MySQL

發布時間:2025/3/21 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC: Java连接MySQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、Java連接MySQL數據庫步驟
  • 二、JDBC基本操作:CRUD
    • 2.1 Statement
    • 2.2 ResultSet 之滾動結果集(了解)
    • 2.3 示例: 查詢用戶
    • 2.4 DBUtils簡介
  • 三、PreparedStatement
  • 四、數據庫連接池
  • 五、DAO與JavaBean

一、Java連接MySQL數據庫步驟

1.加載驅動
新建一個動態網頁項目后,首先在WebContent目錄下WEB-INF下的lib文件夾添加mysql-connector-java-5.1.19-bin.jar,然后右鍵項目名稱,構建配置路徑,選擇庫,選擇剛剛添加的jar包

Class.forName("com.mysql.jdbc.Driver");

2.打開連接

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫表","root","password");

3.執行查詢

stmt = (Statement) con.createStatement(); //運行結果返回一個ResultSet對象 rst = stmt.executeQuery("select * from wp_users");

或者

String sql = "select * from wp_users";

4.處理結果

while(rst.next()){System.out.println(rst.getString(1)+"\t"+rst.getString(2)+"\t"+rst.getString(3)+"\t"+rst.getString(4)+"\t"+rst.getString(5)+"\t"+rst.getString(6)+"\t"+rst.getString(7)); }

5.清理環境

public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {try {if (rs != null)rs.close();if (stmt != null)stmt.close();if (conn != null)conn.close();} catch (SQLException e) {// TODO: handle exceptione.printStackTrace();} }

二、JDBC基本操作:CRUD

2.1 Statement

Statement最為重要的方法是:

  • int executeUpdate (String sql):執行更新操作,即執行insert、update、delete語句,其實這個方法也可以執行create table、alter table,以及drop table等語句,但我們很少會使用JDBC來執行這些語句;
  • ResultSet executeQuery (String sql):執行查詢操作,執行查詢操作會返回ResultSet,即結果集。

2.2 ResultSet 之滾動結果集(了解)

ResultSet表示結果集,它是一個二維的表格!ResultSet內部維護一個行光標(游標),ResultSet提供了一系列的方法來移動游標:
下一行:默認只能使用它,其他的方法存在,但不能使用!默認的結果集不可滾動!上一行,下N行,上N行,到N行!

前面的查詢都是預先知道列的名字, 例如name,然后通過rs.getString(“name”)來獲取當前行中name列的內容, 實際上JSBC可以直接獲取result set對象的列名.根據取到的表的列名, 可以動態的顯示查詢的各列內容, result對象的列名可由ResultSet MetaData元數據獲得, ResultSet MetaData可以返回原數據,遍歷原數據 即可獲知ResultSet 中哪些列, 每一列是什么類型.
獲取結果集元數據
? 得到元數據:rs.getMetaData(),返回值為ResultSetMetaData;
? 獲取結果集列數:int getColumnCount()
? 獲取指定列的列名:String getColumnName(int colIndex)

結果集特性
當使用Connection的createStatement時,已經確定了Statement生成的結果集是什么特性。
? 是否可滾動
? 是否敏感
? 是否可更新

con.createSttenextment()//生成的結果集:不滾動、不敏感、不可更新!con.createStatement(int,int)//具體看下面解釋

Statement默認返回的Result是只可以往后滾動的,因此只有next(),last()方法是可用的,要想使用previous(),first()方法,可以通過這么定義Statement:

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,CONCUR_UPDATABLE); stmt.executeQuery("...");

參數解釋:
? ResultSet.TYPE_FORWARD_ONLY:不滾動結果集;
? ResultSet.TYPE_SCROLL_INSENSITIVE:滾動結果集,但結果集數據不會再跟隨數據庫而變化;
? ResultSet.TYPE_SCROLL_SENSITIVE :滾動結果集,但結果集數據不會再跟隨數據庫而變化;
第二個參數:
? CONCUR_READ_ONLY:結果集是只讀的,不能通過修改結果集而反向影響數據庫;
? CONCUR_UPDATABLE:結果集是可更新的,對結果集的更新可以反向影響數據庫。

2.3 示例: 查詢用戶

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.Statement;public class Conn {Connection conn = null;Statement stmt = null;ResultSet rst = null;Connection con;public Connection getConnection() throws ClassNotFoundException, SQLException {try {Class.forName("com.mysql.jdbc.Driver");System.out.println("數據庫驅動加載成功");con = DriverManager.getConnection("jdbc:mysql://localhost/shopping", "root", "password");System.out.println("數據庫連接成功");stmt = (Statement) con.createStatement();rst = stmt.executeQuery("select * from users");while (rst.next()) {System.out.println(rst.getString(1) + "\t" + rst.getString(2) + "\t" + rst.getString(3) + "\t"+ rst.getString(4) + "\t" + rst.getString(5));}} catch (SQLException e) {e.printStackTrace();} finally {if (rst != null)rst.close();if (stmt != null)stmt.close();if (conn != null)conn.close();}return con;}public static void main(String[] args) throws ClassNotFoundException, SQLException {Conn c = new Conn();c.getConnection();} }

利用手動實現DbUtils進行改進, 將連接操作封裝到 jdbcutils.java , 調用方法:

Connection con = JdbcUtils.getConnection();

package jdbcutils;import java.io.IOException; import java.io.InputStream; import java.util.Properties;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JdbcUtils {private static final String dbconfig = "dbconfig.properties";private static Properties prop = new Properties();static {try {InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(dbconfig);prop.load(in);Class.forName(prop.getProperty("driverClassName"));} catch (IOException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection() {try {return DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("username"),prop.getProperty("password"));} catch (Exception e) {throw new RuntimeException(e);}} }

2.4 DBUtils簡介

DBUtils是Apache Commons組件中的一員,開源免費!
DBUtils是對JDBC的簡單封裝,但是它還是被很多公司使用!
DBUtils的Jar包:dbutils.jar

DBUtils主要類

  • DbUtils:都是靜態方法,一系列的close()方法;
  • QueryRunner:
    • update():執行insert、update、delete;
    • query():執行select語句;
    • batch():執行批處理。

使用JDBC的基本用法和操作來與數據庫交互,由于每操作一次數據庫,都會執行一次創建和斷開Connection對象的操作,這種頻繁的操作Connection對象十分影響數據庫的訪問效率,并且增加了代碼量,所以在實際開發中,開發人員通常會使用數據庫連接池來解決這些問題。Apache組織還提供了一個DBUtils工具類庫,該類庫實現了對JDBC的簡單封裝,能在不影響性能的情況下極大地簡化JDBC的編碼工作。

三、PreparedStatement

PreparedStatement與Statement的最大區別是PreparedStatement可以使用參數, 也就是?號. PreparedStatement允許使用不完整的SQL語句,空缺的部分使用問號代替 ,直到執行前的時候設置進去.

PreparedStatement叫預編譯聲明,PreparedStatement是Statement的子接口,你可以使用PreparedStatement來替換Statement。

1. PreparedStatement的好處:

  • 防止SQL攻擊;
  • 提高代碼的可讀性,以可維護性;
  • 提高效率 。

防止SQL攻擊的幾種方法:

  • 過濾用戶輸入的數據中是否包含非法字符;
  • 分步交驗!先使用用戶名來查詢用戶,如果查找到了,再比較密碼;
  • 使用PreparedStatement。

2. PreparedStatement預處理的原理:

  • 前提:連接的數據庫必須支持預處理!幾乎沒有不支持的!
  • 每個pstmt都與一個sql模板綁定在一起,先把sql模板給數據庫,數據庫先進行校驗,再進行編譯。執行時只是把參數傳遞過去而已!
  • 若二次執行時,就不用再次校驗語法,也不用再次編譯!直接執行!

3. PreparedStatement批處理
Statement與PreparedStatement都能夠批處理SQL語句, 也就是同時執行多條SQL語句, 這些SQL語句必須是insert update delete等SQL語句, 他們執行后都返回一個int類型數,表示影響的行數,Statement與PreparedStatement通過addBatch()方法添加一條SQL語句, 通過executeBatch()方法批量執行SQL語句,返回一個int數組, 代表各句SQL的返回值.

PreparedStatement的批處理有所不同,因為每個PreparedStatement對象都綁定一條SQL模板。所以向PreparedStatement中添加的不是SQL語句,而是給“?”賦值。

con = JdbcUtils.getConnection(); String sql = "insert into stu values(?,?,?,?)"; pstmt = con.prepareStatement(sql); for(int i = 0; i < 10; i++) {pstmt.setString(1, "S_10" + i); //設置第一個參數pstmt.setString(2, "stu" + i);pstmt.setInt(3, 20 + i);pstmt.setString(4, i % 2 == 0 ? "male" : "female");pstmt.addBatch() ; //將這一組參數保存到集合中 } pstmt.executeBatch (); //執行批處理

注意: MySQL的批處理需要在連接時將rewriteBatchedStatements設為true才有效.

jdbc:mysql://localhost/shopping?rewriteBatchedStatements=true

四、數據庫連接池

1.數據庫連接池的概念
使用JDBC的基本用法和操作來與數據庫交互,由于每操作一次數據庫,都會執行一次創建和斷開Connection對象的操作,這種頻繁的操作Connection對象十分影響數據庫的訪問效率,并且增加了代碼量,所以在實際開發中,開發人員通常會使用數據庫連接池來解決這些問題。

用池來管理Connection,這可以重復使用Connection。有了池,所以我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection后,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。池就可以再利用這個Connection對象了。

知乎 – 數據庫連接和C3P0連接池的學習筆記

https://zhuanlan.zhihu.com/p/28831891

2. 使用c3p0

有兩種方式,第一種是用代碼,第二種是使用配置文件.

import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource;public class Conn2 {public static void fun1() throws PropertyVetoException, SQLException {ComboPooledDataSource dataSource = new ComboPooledDataSource();dataSource.setDriverClass("com.mysql.jdbc.Driver");dataSource.setJdbcUrl("jdbc:mysql://localhost/shopping");dataSource.setUser("root");dataSource.setPassword("password");dataSource.setAcquireIncrement(5) ;dataSource.setInitialPoolSize(20) ;dataSource.setMinPoolSize(2) ;dataSource.setMaxPoolSize(50) ;Connection con = dataSource.getConnection();System.out.println(con);con.close();}public static void main(String[] args) throws PropertyVetoException, SQLException {fun1();} }

五、DAO與JavaBean

Dao(數據庫操作對象database access object)是JDBC下常用的模式,保存數據時, 他將JavaBean的屬性拆分成正確的sql語句, 并保存到數據庫中, 讀取數據時將數據從數據庫中取出來, 并通過setter方法設置到JavaBean中, DAO出現之前操作數據庫的代碼與業務代碼都出現在servlet或者JSP中, 不利于業務代碼的分離,DAO出現后改變了這一情況, 所有與數據庫相關的操作都被拿到了 DAO層實現,servlet或者JSP只操作JavaBean與Dao層, 而Dao層只操作數據庫.

entity文件夾 下有部門類Department.java與員工類Employee.java (JavaBean)
dao文件夾 下有DepartmentDao.java 與 EmployeeDao.java, 包括插入、修改、刪除、列出所有數據等.

當我們添加一個Department時,addDepartment.jsp代碼如下:

<%request.setCharacterEncoding(...);String action = request.getParameter("action");if("add".equals(action){Department department = new Department();department.setName(request.getParameter("name"));DepartmentDao.insert(department);} %>

總結

以上是生活随笔為你收集整理的JDBC: Java连接MySQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。