JDBC, Java Database Connecive, Java 數(shù)據(jù)庫連接,是一組專門負(fù)責(zé)連接并操作數(shù)據(jù)庫的標(biāo)準(zhǔn),在整個(gè)JDBC 中實(shí)際上大量的提供的是接口。針對(duì)于各個(gè)不同的數(shù)據(jù)庫生產(chǎn)商 ,只要想使用JAVA 進(jìn)行數(shù)據(jù)庫的開發(fā),則對(duì)這些標(biāo)準(zhǔn)有所支持。
JDBC 在使用中常見的有以下三類:
JDBC-ODBC 橋連接:是SUN 在JDK的開發(fā)包中提供的最標(biāo)準(zhǔn)的一套JDBC 操作類庫,使用的時(shí)候?qū)DBC-ODB-數(shù)據(jù)庫,中間要經(jīng)過一個(gè)ODBC 的連接,那么就意味著整體的性能將會(huì)降低,所以在開發(fā)中是絕對(duì)不會(huì)去使用JDBC-ODBC的連接方式的。
JDBC 連接,使用各個(gè)數(shù)據(jù)庫提供商給定的數(shù)據(jù)庫驅(qū)動(dòng)程序,完成JDBC的開發(fā),使用的時(shí)候需要在classpath中配置數(shù)據(jù)庫的驅(qū)動(dòng)程序
JDBC 網(wǎng)絡(luò)連接:主要使用通過網(wǎng)絡(luò)連接數(shù)據(jù)庫
JDBC 的操作步驟
在進(jìn)行JDBC 操作的時(shí)候可以按照以下的步驟完成:
1、加載數(shù)據(jù)庫驅(qū)動(dòng)程序,加載的時(shí)候需要將驅(qū)動(dòng)程序配置到classpath之中
2、連接數(shù)據(jù)庫,通過Connection 接口和 DriverManager 類完成
3、操作數(shù)據(jù)庫,通過Statement、PreparedStatement、ResultSet 三個(gè)接口完成
4、關(guān)閉數(shù)據(jù)庫,在實(shí)際開發(fā)中數(shù)據(jù)庫資源非常有限,操作完之后必須關(guān)閉
數(shù)據(jù)庫連接操作
在JDBC 的操作中,如果要想進(jìn)行數(shù)據(jù)庫的連接,則必須按照以上的幾步完成
1、通過Class.forName()加載數(shù)據(jù)庫的驅(qū)動(dòng)程序
2、通過DriverManager 類進(jìn)行數(shù)據(jù)庫的連接,連接的時(shí)候要輸入數(shù)據(jù)庫的連接地址、用戶名、密碼
3、通過Connection 接口接收連接
- package org.connectiondemo;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
-
- public class ConnectionJDBC {
-
- /**
- * @param args
- */
- //驅(qū)動(dòng)程序就是之前在classpath中配置的JDBC的驅(qū)動(dòng)程序的JAR 包中
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- //連接數(shù)據(jù)庫的用戶名
- public static final String DBUSER = "root";
- //連接數(shù)據(jù)庫的密碼
- public static final String DBPASS = "";
-
-
- public static void main(String[] args) throws Exception {
- Connection con = null; //表示數(shù)據(jù)庫的連接對(duì)象
- Class.forName(DBDRIVER); //1、使用CLASS 類加載驅(qū)動(dòng)程序
- con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、連接數(shù)據(jù)庫
- System.out.println(con);
- con.close(); // 3、關(guān)閉數(shù)據(jù)庫
- }
-
- }
數(shù)據(jù)庫更新操作
如果要想執(zhí)行數(shù)據(jù)庫的更新操作,則可以使用Statement接口,數(shù)據(jù)庫更新就是增加、修改、刪除
增加、更新、刪除操作
- package org.updatedemo;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.Statement;
-
- public class UpdateDemo {
-
- /**
- * @param args
- */
- //驅(qū)動(dòng)程序就是之前在classpath中配置的JDBC的驅(qū)動(dòng)程序的JAR 包中
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- //連接數(shù)據(jù)庫的用戶名
- public static final String DBUSER = "root";
- //連接數(shù)據(jù)庫的密碼
- public static final String DBPASS = "";
-
-
- public static void main(String[] args) throws Exception {
- Connection con = null; //表示數(shù)據(jù)庫的連接對(duì)象
- Statement stmt = null;
- Class.forName(DBDRIVER); //1、使用CLASS 類加載驅(qū)動(dòng)程序
- con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、連接數(shù)據(jù)庫
- stmt = con.createStatement(); //3、Statement 接口需要通過Connection 接口進(jìn)行實(shí)例化操作
- stmt.executeUpdate("insert into java_study.person values(\'Tom\',20,\'SH\')"); //執(zhí)行SQL 語句,插入、更新、刪除數(shù)據(jù)
- stmt.executeUpdate("update java_study.person set name='Jery' where age = 20");
- stmt.executeUpdate("delete from java_study.person where age = 20");
- con.close(); // 4、關(guān)閉數(shù)據(jù)庫
- }
-
- }
數(shù)據(jù)庫查詢操作
通過SELECT 語句,可以查詢數(shù)據(jù)中的內(nèi)容,在mysql 中直接查詢的時(shí)候可以發(fā)現(xiàn)將返回全部的查詢結(jié)果給用戶看,那么對(duì)于程序的操作中也是一樣的,所有的查詢結(jié)果要返回到程序處進(jìn)行輸出查看,那么程序通過ResultSet 接口保存全部的查詢結(jié)果,通過Statement 接口中的executeQuery()方法查詢。
查詢之后的數(shù)據(jù)需要分別的取出。通過 next ()方法找到返回的每一行數(shù)據(jù),每一行中各個(gè)列的數(shù)據(jù)需要通過getXxx()方法取得,例如:
取得整型:getInt()
取得字符串:getString()
取得日期:getDate()
取得小數(shù):getFloat()
- package org.querydemo;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
-
- public class QueryDemo {
-
- /**
- * @param args
- */
- //驅(qū)動(dòng)程序就是之前在classpath中配置的JDBC的驅(qū)動(dòng)程序的JAR 包中
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- //連接數(shù)據(jù)庫的用戶名
- public static final String DBUSER = "root";
- //連接數(shù)據(jù)庫的密碼
- public static final String DBPASS = "";
-
-
- public static void main(String[] args) throws Exception {
- Connection con = null; //表示數(shù)據(jù)庫的連接對(duì)象
- Statement stmt = null; //表示數(shù)據(jù)庫的更新操作
- ResultSet result = null; //表示接收數(shù)據(jù)庫的查詢結(jié)果
- Class.forName(DBDRIVER); //1、使用CLASS 類加載驅(qū)動(dòng)程序
- con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、連接數(shù)據(jù)庫
- stmt = con.createStatement(); //3、Statement 接口需要通過Connection 接口進(jìn)行實(shí)例化操作
- result = stmt.executeQuery("select name,age,address from java_study.person"); //執(zhí)行SQL 語句,查詢數(shù)據(jù)庫
- while (result.next()){
- String name = result.getString("name");
- int age = result.getInt("age");
- String address = result.getString("address");
- System.out.println(name+age+address);
- }
- result.close();
- con.close(); // 4、關(guān)閉數(shù)據(jù)庫
- }
-
- }
PreparedStatement
此接口是在實(shí)際的開發(fā)中使用最廣泛的一個(gè)操作接口,此接口是Statement接口的子接口,采用預(yù)處理的方式完成
完成增加操作
- package org.preparedstatementdemo;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.util.Date;
-
- public class PreparedStatementDemo {
-
- /**
- * @param args
- */
-
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- //連接數(shù)據(jù)庫的用戶名
- public static final String DBUSER = "root";
- //連接數(shù)據(jù)庫的密碼
- public static final String DBPASS = "";
-
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- Connection con = null; //表示數(shù)據(jù)庫的連接對(duì)象
- PreparedStatement pstmt = null; //表示數(shù)據(jù)庫更新操作
-
- String name = "Tom";
- int age = 20;
- Date date = new Date();
- String sql = "insert into java_study.person values(?,?,?)";
-
- Class.forName(DBDRIVER); //1、使用CLASS 類加載驅(qū)動(dòng)程序
-
- System.out.println(sql);
- con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、連接數(shù)據(jù)庫
- pstmt = con.prepareStatement(sql); //使用預(yù)處理的方式創(chuàng)建對(duì)象
- pstmt.setString(1, name); //第一個(gè)?號(hào)的內(nèi)容
- pstmt.setInt(2, age); //第二個(gè)?號(hào)的內(nèi)容
- pstmt.setDate(3, new java.sql.Date(date.getTime()));
- pstmt.executeUpdate(); //執(zhí)行SQL 語句,更新數(shù)據(jù)庫
- pstmt.close();
- con.close(); // 4、關(guān)閉數(shù)據(jù)庫
- }
-
- }
完成模糊操作
模糊查詢要使用LIKE 語句,那么LIKE 語句需要使用%進(jìn)行匹配
- package org.preparedstatementquery;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.util.Date;
-
- public class PreparedStatementQuery {
-
- /**
- * @param args
- */
- // TODO Auto-generated method stub
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- //連接數(shù)據(jù)庫的用戶名
- public static final String DBUSER = "root";
- //連接數(shù)據(jù)庫的密碼
- public static final String DBPASS = "";
-
- public static void main(String[] args) throws Exception {
- Connection con = null; //表示數(shù)據(jù)庫的連接對(duì)象
- PreparedStatement pstmt = null; //表示數(shù)據(jù)庫更新操作
- ResultSet result = null;
-
- String like_name ="Tom1";
- int like_age = 12;
-
- String sql = "select name,age,birthday from java_study.person where name like ? or age = ?";
-
- Class.forName(DBDRIVER); //1、使用CLASS 類加載驅(qū)動(dòng)程序
-
- System.out.println(sql);
- con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、連接數(shù)據(jù)庫
- pstmt = con.prepareStatement(sql); //使用預(yù)處理的方式創(chuàng)建對(duì)象
- pstmt.setString(1, "%"+like_name+"%");
- pstmt.setInt(2, like_age);
-
- result = pstmt.executeQuery(); //執(zhí)行SQL 語句,更新數(shù)據(jù)庫
- while (result.next()){
- String name = result.getString("name");
- int age = result.getInt("age");
- Date date = result.getDate("birthday");
- System.out.println(name+","+age+","+date);
- }
- <pre name="code" class="java"> result.close();</pre> pstmt.close();con.close(); // 4、關(guān)閉數(shù)據(jù)庫}}<p></p>
- <p><br>
- </p>
- <pre></pre>
- <p></p>
- <p><br>
- </p>
- <p><strong>批處理</strong></p>
- <p>批處理,多條SQL 語句可以一次性執(zhí)行完畢,稱為批處理操作</p>
- <p><br>
- </p>
- <p></p><pre name="code" class="java">package org.addbetchdemo;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.util.Date;
-
- public class AddDetchDemo {
-
- /**
- * @param args
- */
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- //連接數(shù)據(jù)庫的用戶名
- public static final String DBUSER = "root";
- //連接數(shù)據(jù)庫的密碼
- public static final String DBPASS = "";
-
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- Connection con = null; //表示數(shù)據(jù)庫的連接對(duì)象
- PreparedStatement pstmt = null; //表示數(shù)據(jù)庫更新操作
-
- String sql = "insert into java_study.person values(?,?,?)";
-
- Class.forName(DBDRIVER); //1、使用CLASS 類加載驅(qū)動(dòng)程序
-
- System.out.println(sql);
- con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、連接數(shù)據(jù)庫
- pstmt = con.prepareStatement(sql); //使用預(yù)處理的方式創(chuàng)建對(duì)象
-
- for (int i = 0;i<10;i++){
- pstmt.setString(1, "org"+i); //第一個(gè)?號(hào)的內(nèi)容
- pstmt.setInt(2, i); //第二個(gè)?號(hào)的內(nèi)容
- pstmt.setDate(3, new java.sql.Date(new java.util.Date().getTime()));
- pstmt.addBatch();
- }
- int[] i = pstmt.executeBatch(); //執(zhí)行SQL 語句,更新數(shù)據(jù)庫
- System.out.println(i);
- pstmt.close();
- con.close(); // 4、關(guān)閉數(shù)據(jù)庫
- }
-
- }
- </pre><br>
- <p></p>
- <p><strong>事務(wù)處理</strong><br>
- </p>
- <p>通過設(shè)置 connection 的autocommit(false) 提交事務(wù) con.commit(); 回滾事務(wù) con.rollback()<br>
- </p>
- <p></p><pre name="code" class="java">package org.transactiondemo;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.Statement;
-
- public class TransactionDemo {
-
- /**
- * @param args
- */
- //驅(qū)動(dòng)程序就是之前在classpath中配置的JDBC的驅(qū)動(dòng)程序的JAR 包中
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- //連接數(shù)據(jù)庫的用戶名
- public static final String DBUSER = "root";
- //連接數(shù)據(jù)庫的密碼
- public static final String DBPASS = "";
-
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- Connection con = null; //表示數(shù)據(jù)庫的連接對(duì)象
- Statement stmt = null;
- Class.forName(DBDRIVER); //1、使用CLASS 類加載驅(qū)動(dòng)程序
- con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、連接數(shù)據(jù)庫
-
- con.setAutoCommit(false);
-
- stmt = con.createStatement(); //3、Statement 接口需要通過Connection 接口進(jìn)行實(shí)例化操作
-
- try{
- stmt.addBatch("insert into java_study.person values(\'Tom\',20,\'2012-01-01\')"); //執(zhí)行SQL 語句,插入、更新、刪除數(shù)據(jù)
- stmt.addBatch("insert into java_study.person values(\'Tom\',20,\'2012-01-01\')");
- stmt.addBatch("insert into java_study.person values(\''Tom\',20,\'2012-01-01\')");
- stmt.executeBatch();
- con.commit();
- } catch(Exception e){
- con.rollback();
- }
-
-
-
- stmt.close();
- con.close(); // 4、關(guān)閉數(shù)據(jù)庫
- }
-
- }
- </pre><br>
- <br>
- <p></p>
- <p><br>
- </p>
- <p><br>
- </p>
- <p></p>