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包
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生成的結果集是什么特性。
? 是否可滾動
? 是否敏感
? 是否可更新
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deepin--解决QQ时间与系统时间不
- 下一篇: 图解HTTP--笔记