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、本博客的目的是知識交流所用,轉載自其它博客或網站,作為自己的參考資料的,感謝這些文章的原創人員
