Statement執行更新操作
Statement:Statement 是 Java 執行數據庫操作的一個重要方法,用於在已經建立數據庫連接的基礎上,向數據庫發送要執行的SQL語句。Statement對象,用於執行不帶參數的簡單SQL語句。
通過JDBC向指定的數據表中插入一條記錄,需要注意下面的幾點:
* 1.Statement:用於執行SQL語句的對象 * 1).通過COnnection的createStatement()方法來獲取 * 2).通過excuteUpdate(sql)可以執行SQL語句 * 3).傳入的SQL可以是insert,update或者delete,但是不能是select * 2.Connection、Statement都是應用程序和數據庫服務器的連接 資源,使用后一定要關閉 * 需要在finally中關閉Connection和Statement對象 * 異常可以不處理,但是連接一定要關閉 * 3.關閉的順序:先關閉后獲取的,即先關閉Statement,后關閉Connection
具體的代碼實現:
public void testStatement() throws Exception{ //1.獲取數據庫連接 // Connection conn=getConnection(); Connection conn=null; //4.執行插入 //1).獲取操作SQL語句的Statement對象:調用Connection的createStatement()方法來獲取 //注意Statement這里是java.sql包中的,而不是java.mysql.jdbc中的 // Statement statement=conn.createStatement(); Statement statement=null; try { //3.准備插入的SQL語句 conn=getConnection(); String sql=null; //sql的插入操作 // sql="insert into customers(NAME,email,birth) values('xyz','xyz@atguigu.com','1988-7-1')"; //刪除操作 // sql="delete from customers where id =1"; //修改操作 sql="update customers set name='Tom' where id =2"; statement = conn.createStatement(); //2).調用Statement對象的excuteUpdate(sql),執行SQL語句進行插入 statement.execute(sql); //5.關閉Statement對象 } catch (Exception e) { e.printStackTrace(); } finally { try { if (statement != null) { statement.close(); } } catch (Exception e) { e.printStackTrace(); } finally { // 2.關閉連接 if (conn != null) { conn.close(); } } } }
【提示】:代碼中的getConnction方法是在筆記一中定義的,可以看到我們可以對數據庫中的記錄進行插入(insert),更新(update),刪除(delete)操作,使用Connection對象的createStatement( )方法創建一個statement對象,並且調用Statement對象的excuteUpdate(sql),執行SQL語句進行插入;
我們的getConnection方法和關閉statement以及conn的操作稍顯復雜,我們可以定義一個工具類,里面包含一些通用的方法,實現我們的插入、刪除、更新數據的操作
具體代碼:
public class JDBCTools { // 關閉conn和statement的操作 public static void release(Statement statement, Connection conn) { if (statement != null) { try { statement.close(); } catch (Exception e2) { // TODO: handle exception } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 1。獲取連接的方法 通過讀取配置文件從數據庫服務器獲取一個連接 * * @author Administrator * */ public static Connection getConnection() throws Exception { String driverClass = null; String jdbcUrl = null; String user = null; String password = null; // 讀取類路徑下的jdbc.properties文件 InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream( "jdbc.properties"); Properties properties = new Properties(); properties.load(in); driverClass = properties.getProperty("driver"); jdbcUrl = properties.getProperty("jdbcUrl"); user = properties.getProperty("user"); password = properties.getProperty("password"); // 通過反射創建Driver對象 Driver driver = (Driver) Class.forName(driverClass).newInstance(); Properties info = new Properties(); info.put("user", user); info.put("password", password); Connection connection = driver.connect(jdbcUrl, info); return connection; } }
我們更新數據的操作可以寫成這樣:這里update就是這個通用的方法;
public void update(String sql){ Connection conn=null; Statement statement=null; try { //用到了我們寫的一個工具類JDBCTools conn=JDBCTools.getConnection(); statement=conn.createStatement(); statement.execute(sql); } catch (Exception e) { // TODO: handle exception }finally{ JDBCTools.release(statement, conn); } }
傳入不同的sql,執行相應的操作;
通過ResultSet執行查詢操作
ResultSet:
/** * ResultSet:結果集,封裝了使用JDBC進行查詢的結果 * 1.調用Statement對象的excuteQuery(sql)方法可以得到結果集 * 2.ResultSet返回的實際上就是一張數據表,有一個指針 * 指向數據表的第一樣的前面,可以調用next()方法檢測下一行是否有效,若有效則返回true * ,並且指針下移,相當於迭代器對象的hasNext()和next()的結合體 * 3.當指針對位到確定的一行時,可以通過調用getXxx(index)或者getXxx(columnName) * 獲取每一列的值,例如:getInt(1),getString("name") * 4.ResultSet當然也需要進行關閉 */
ResultSet的返回結果:
具體的代碼實現:
@Test public void testResultSet(){ //獲取id=2的customers數據表的記錄,並打印 //面向接口的編程 Connection conn=null; Statement statement=null; ResultSet rs=null; try { //1.獲取Connection conn=JDBCTools.getConnection(); System.out.println(conn); //2.獲取Statement statement=conn.createStatement(); System.out.println(statement); //3.准備SQL String sql="select id,name,email,birth from customers"; //4.執行查詢,得到ResultSet rs=statement.executeQuery(sql); System.out.println(rs); //5.處理ResultSet while(rs.next()){ int id=rs.getInt(1); String name=rs.getString("name"); String email=rs.getString(3); Date birth=rs.getDate(4); System.out.println(id); System.out.println(name); System.out.println(email); System.out.println(birth); System.out.println("--------------"); } //6.關閉數據庫資源 } catch (Exception e) { e.printStackTrace(); }finally{ JDBCTools.release(rs, statement, conn); } }
到目前為止的完整代碼:
package com.atguigu.jdbc; import java.io.InputStream; import java.sql.*; import java.util.Properties; import org.junit.Test; import com.mysql.jdbc.Driver; //JDBC學習 public class JDBCTest { /** * ResultSet:結果集,封裝了使用JDBC進行查詢的結果 * 1.調用Statement對象的excuteQuery(sql)方法可以得到結果集 * 2.ResultSet返回的實際上就是一張數據表,有一個指針 * 指向數據表的第一樣的前面,可以調用next()方法檢測下一行是否有效,若有效則返回true * ,並且指針下移,相當於迭代器對象的hasNext()和next()的結合體 * 3.當指針對位到確定的一行時,可以通過調用getXxx(index)或者getXxx(columnName) * 獲取每一列的值,例如:getInt(1),getString("name") * 4.ResultSet當然也需要進行關閉 */ @Test public void testResultSet(){ //獲取id=2的customers數據表的記錄,並打印 //面向接口的編程 Connection conn=null; Statement statement=null; ResultSet rs=null; try { //1.獲取Connection conn=JDBCTools.getConnection(); System.out.println(conn); //2.獲取Statement statement=conn.createStatement(); System.out.println(statement); //3.准備SQL String sql="select id,name,email,birth from customers"; //4.執行查詢,得到ResultSet rs=statement.executeQuery(sql); System.out.println(rs); //5.處理ResultSet while(rs.next()){ int id=rs.getInt(1); String name=rs.getString("name"); String email=rs.getString(3); Date birth=rs.getDate(4); System.out.println(id); System.out.println(name); System.out.println(email); System.out.println(birth); System.out.println("--------------"); } //6.關閉數據庫資源 } catch (Exception e) { e.printStackTrace(); }finally{ JDBCTools.release(rs, statement, conn); } } /** * 通用的更新的方法:包括insert,update,delete * 版本1. */ /*public void update(String sql){ Connection conn=null; Statement statement=null; try { //用到了我們寫的一個工具類JDBCTools conn=JDBCTools.getConnection(); statement=conn.createStatement(); statement.execute(sql); } catch (Exception e) { // TODO: handle exception }finally{ JDBCTools.release(statement, conn); } }*/ /* * 通過JDBC向指定的數據表中插入一條記錄 * 我這里用的是圖形化界面SQLyog * SQLyog圖形化界面連接mysql數據庫,注冊碼: * 這個可用【我用了還是可以】 Name:BAKA! Code:560f17bf57745cf9 */ /** * 通過JDBC向指定的數據表中插入一條記錄 * 1.Statement:用於執行SQL語句的對象 * 1).通過COnnection的createStatement()方法來獲取 * 2).通過excuteUpdate(sql)可以執行SQL語句 * 3).傳入的SQL可以是insert,update或者delete,但是不能是select * 2.Connection、Statement都是應用程序和數據庫服務器的連接資源,使用 * 后一定要關閉 * 需要在finally中關閉Connection和Statement對象 * 異常可以不處理,但是連接一定要關閉 * 3.關閉的順序:先關閉后獲取的,即先關閉Statement,后關閉Connection * @throws Exception */ @Test public void testStatement() throws Exception{ //1.獲取數據庫連接 // Connection conn=getConnection(); Connection conn=null; //4.執行插入 //1).獲取操作SQL語句的Statement對象:調用Connection的createStatement()方法來獲取 //注意Statement這里是java.sql包中的,而不是java.mysql.jdbc中的 // Statement statement=conn.createStatement(); Statement statement=null; try { //3.准備插入的SQL語句 conn=getConnection(); String sql=null; //sql的插入操作 // sql="insert into customers(NAME,email,birth) values('xyz','xyz@atguigu.com','1988-7-1')"; //刪除操作 // sql="delete from customers where id =1"; //修改操作 sql="update customers set name='Tom' where id =2"; statement = conn.createStatement(); //2).調用Statement對象的excuteUpdate(sql),執行SQL語句進行插入 statement.execute(sql); //5.關閉Statement對象 } catch (Exception e) { e.printStackTrace(); } finally { try { if (statement != null) { statement.close(); } } catch (Exception e) { e.printStackTrace(); } finally { // 2.關閉連接 if (conn != null) { conn.close(); } } } } public Connection testGetConnection2() throws Exception{ //1.准備連接數據庫的四個字符串 //1).創建Properties對象 Properties properties=new Properties(); //2).獲取jdbc.properties對應的輸入流 InputStream in=this.getClass(). getClassLoader().getResourceAsStream("jdbc.properties"); //3).加載2)對應的輸入流 properties.load(in); //4).具體決定user,password等四個字符串 String user=properties.getProperty("user"); String jdbcUrl=properties.getProperty("jdbcUrl"); String password=properties.getProperty("password"); String driver=properties.getProperty("driver"); //2.加載數據庫驅動程序(對應的Driver實現類中注冊驅動的靜態代碼塊) Class.forName(driver); //3.通過DriverManager的getConnection()方法獲取數據庫連接 return DriverManager.getConnection(jdbcUrl,user,password); } /** * DriverManager是驅動的管理類 * 1).可以通過重載的getConnection()方法獲取數據庫連接,較為方便 * 2).可以同時管理多個驅動程序:若注冊了多個數據庫連接 * ,則調用getConnection()方法時傳入的參數不同,即返回不同的數據庫連接 * @throws Exception */ public void testDriverManager() throws Exception{ //1.准備連接數據庫的四個字符串 //驅動的全類名 String driverClass="com.mysql.jdbc.Driver"; //url String jdbcUrl="dbc:mysql://localhost:3306/atguigu"; //user String user="root"; //password String password="123456"; //讀取類路徑下的jdbc.properties文件 InputStream in=getClass().getClassLoader() .getResourceAsStream("jdbc.properties"); Properties properties=new Properties(); properties.load(in); driverClass=properties.getProperty("driver"); jdbcUrl=properties.getProperty("jdbcUrl"); user=properties.getProperty("user"); //2.加載數據庫驅動程序(對應的Driver實現類中注冊驅動的靜態代碼塊) /* *使用Drivermanager的好處:可以加載多個驅動 DriverManager .registerDriver(Class.forName(driverClass).newInstance()); * */ Class.forName(driverClass); password=properties.getProperty("password"); //3.通過DriverManager的getConnection()方法獲取數據庫連接 Connection connection=DriverManager .getConnection(jdbcUrl, user, password); System.out.println(connection); } /** * Driver是一個接口,數據庫廠商必須提供實現的接口 * 能從其中獲取數據庫連接,可以通過Driver的實現類的對象獲取連接 * 1.加入mysql驅動 * 1).解壓mysql-connector-java-5.1.18.zip * 2).在當前目錄下新建lib目錄 * 3).把mysql-connector-java-5.1.18-bin.jar復制到lib目錄 * 4).右鍵->build-path->add build path加載到類路徑下 * @throws SQLException * */ /* * MySQL附帶了一個空密碼有的root用戶。成功后安裝了數據庫和客戶端,需要進行如下設置root密碼: D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root password "123456"; 注: 1. 關閉正在運行的MySQL服務。 2. 打開DOS窗口,轉到 D:\software\mysql-5.6.25-winx64\bin 目錄。 3. 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啟動MySQL服務的時候跳過權限表認證。 4. 再開一個DOS窗口(因為剛才那個DOS窗口已經不能動了),轉到mysql\bin目錄。 5. 輸入mysql回車,如果成功,將出現MySQL提示符 >。 6. 連接權限數據庫: use mysql; 。 6. 改密碼:update user set password=password("123456") where user="root";(別忘了最后加分號) 。 7. 刷新權限(必須步驟):flush privileges; 8. 退出 quit。 9. 注銷系統,再進入,使用用戶名root和剛才設置的新密碼 123456 登錄。 現在使MySQL服務器的連接,那么使用下面的命令: */ public static void main(String[] args) throws SQLException { //1.創建一個Driver實現類的對象 Driver driver=new com.mysql.jdbc.Driver(); /* * JDBC URL的標准由三部分組成 * jdbc:<子協議>:<子名稱> * 1).協議:JDBC URL中的協議總是JDBC * 2).子協議:子協議用於標識一個數據庫驅動程序 * 3).紫明成:一種標識數據庫的方法。子名稱可以一句不同的 * 子協議而變化,用子名稱的目的是為了定位數據庫提供足夠的信息 * 例如:jdbc:mysql://127.0.0.1:3306/test【這是我的主機上的,你的不一定】 * 查看端口號:在mysql后面輸入show global variables like 'port';別寫錯了,切記別忘記寫英文狀態下的分號 */ //2.准備連接數據庫的基本信息,url,user,password String url="jdbc:mysql://localhost:3306/test"; Properties info=new Properties(); info.put("user", "root"); info.put("password", "123456"); //3.調用Driver接口實現類對象的connect(url,info)方法獲取數據庫的連接 //此處Connection是一個接口,java.sql包下的接口 Connection connection=driver.connect(url, info); System.out.println(connection); } /** * 編寫一個通用的方法,在不修改源程序的情況下,可以獲取任何數據庫的連接 * 解決方案:把數據庫驅動Driver實現類的全類名、url、user、password * 放入一個配置文件中,通過修改配置文件的方法實現和具體的數據庫解耦 * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */ public Connection getConnection() throws Exception{ String driverClass=null; String jdbcUrl=null; String user=null; String password=null; //讀取類路徑下的jdbc.properties文件 InputStream in=getClass().getClassLoader() .getResourceAsStream("jdbc.properties"); Properties properties=new Properties(); properties.load(in); driverClass=properties.getProperty("driver"); jdbcUrl=properties.getProperty("jdbcUrl"); user=properties.getProperty("user"); password=properties.getProperty("password"); //通過反射創建Driver對象 Driver driver=(Driver) Class.forName(driverClass).newInstance(); Properties info=new Properties(); info.put("user", user); info.put("password", password); Connection connection=driver.connect(jdbcUrl, info); return connection; } @Test public void testGetConnection() throws Exception{ System.out.println(getConnection()); } }
JDBCTools:
package com.atguigu.jdbc; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import com.mysql.jdbc.Driver; /** * 操作JDBC的工具類,其中封裝了一些工具方法 * Version 1 * @author Administrator * */ public class JDBCTools { // 關閉conn和statement的操作 public static void release(ResultSet rs,Statement statement, Connection conn) { if(rs!=null){ try { rs.close(); } catch (Exception e) { // TODO: handle exception } } if (statement != null) { try { statement.close(); } catch (Exception e2) { // TODO: handle exception } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 1。獲取連接的方法 通過讀取配置文件從數據庫服務器獲取一個連接 * * @author Administrator * */ public static Connection getConnection() throws Exception { String driverClass = null; String jdbcUrl = null; String user = null; String password = null; // 讀取類路徑下的jdbc.properties文件 InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream( "jdbc.properties"); Properties properties = new Properties(); properties.load(in); driverClass = properties.getProperty("driver"); jdbcUrl = properties.getProperty("jdbcUrl"); user = properties.getProperty("user"); password = properties.getProperty("password"); // 通過反射創建Driver對象 Driver driver = (Driver) Class.forName(driverClass).newInstance(); Properties info = new Properties(); info.put("user", user); info.put("password", password); Connection connection = driver.connect(jdbcUrl, info); return connection; } }
本文為博主原創文章,轉載請注明出處:http://www.cnblogs.com/ysw-go/
1、本博客的原創原創文章,都是本人平時學習所做的筆記,如有錯誤,歡迎指正。
2、如有侵犯您的知識產權和版權問題,請通知本人,本人會即時做出處理文章。
3、本博客的目的是知識交流所用,轉載自其它博客或網站,作為自己的參考資料的,感謝這些文章的原創人員