1. JDBC簡介
SUN公司為了簡化、統一對數據庫的操作,定義了一套Java操作數據庫的規范,稱之為JDBC,JDBC不能直接操作數據庫,JDBC通過接口加載數據庫的驅動,然后操作數據庫。JDBC:Java Data Base Connectivity,它主要由接口組成。組成JDBC的2個包為java.sql和javax.sql。開發JDBC應用需要這2個包的支持外,還需要導入相應JDBC的數據庫實現(即數據庫驅動)。
2. JDBC快速入門
編程從user表中讀取數據,并打印在控制臺窗口中。
2.1 搭建實驗環境
create database test Character set utf8 collate utf8_general_ci; use test create table user ( id int primary Key, name varchar(20), password varchar(20), email varchar(20), birthday Date ); insert into user(id,name,password,email,birthday) values(1,'zw','123','zw@sina.com','1990-09-19'); insert into user(id,name,password,email,birthday) values(2,'ls','123','ls@sina.com','1991-04-19'); insert into user(id,name,password,email,birthday) values(3,'ww','123','ww@sina.com','1992-06-19');
2.2 編寫java程序
新建一個java工程,并導入數據庫驅動 MySQL-connector-java-5.1.20-bin.jar。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; public class Demo1 { public static void main(String[] args) throws Exception { String url="jdbc:mysql://localhost:3306/test"; String username="root"; String password="root"; Connection conn=null; Statement st=null; ResultSet rs=null; try{ //1.加載驅動 //DriverManager.registerDriver(new Driver()); Class.forName("com.mysql.jdbc.Driver"); //2.獲取數據庫的連接 conn = DriverManager.getConnection(url, username, password); //3.獲得用于向數據庫發送sql語句的statement對象 st = conn.createStatement(); //4.向數據庫發sql,并獲取代表結果集的resultset String sql = "select id,name,password,email,birthday from user"; rs = st.executeQuery(sql); //取出結果集的數據 while(rs.next()){ int id = (Integer) rs.getObject("id"); String name = (String)rs.getObject("name"); String pd = (String)rs.getObject("password"); String email = (String)rs.getObject("email"); Date birthday = (Date)rs.getObject("birthday"); System.out.println(id+","+name+","+pd+","+email+","+birthday); } } //關閉連接 finally{ if(rs != null){ try{ rs.close(); }catch(Exception e) { e.printStackTrace(); } } if(st != null){ try{ st.close(); }catch(Exception e) { e.printStackTrace(); } } if(conn != null){ try{ conn.close(); }catch(Exception e) { e.printStackTrace(); } } } } }
JDBC程序中的DriverManager用于加載驅動,并創建與數據庫的連接,這個類的常用方法有:
- DriverManager.registerDriver(new Driver());
- DriverManager.getConnection(URL, user, password);
注意:在實際開發中不推薦采用registerDriver方法注冊驅動,原因有二:
a. 查看Driver的源代碼可以看到,如果采用此種方式,會導致驅動程序注冊兩次,也就是在內存中會有兩個Driver對象;
b. 程序依賴mysql的api,脫離mysql的jar包,程序將無法編譯,將來程序切換底層數據庫將會非常麻煩。
推薦方式:Class.forName("com.mysql.jdbc.Driver");
采用此種方式不會導致驅動對象在內存中重復出現,并且采用此種方式,程序僅僅只需要一個字符串,不需要依賴具體的驅動,使程序的靈活性更高。同樣,在開發中也不建議采用具體的驅動類型指向getConnection方法返回的Connection對象。
3. JDBC常用API
JDBC程序中的Connection對象用于代表數據庫的連接,Connection是數據庫編程中最重要的一個對象,客戶端與數據庫所有交互都是通過Connection對象完成的。這個對象常用的方法有:
- createStatement(); //創建向數據庫發送sql的statement對象
- prepareStatement(sql); //創建向數據庫發送預編譯sql的prepareStatement對象。這個更常用
- prepareCall(sql); //創建執行存儲過程中的callableStatement對象
- setAutoCommit(boolean autoCommit); //設置事物是否自動提交
- commit(); //在鏈接上提交事物
- rollback(); //在此鏈接上回滾事物
JDBC程序中的Statement對象用于向數據庫發送sql語句,Statement對象常用方法有:
- executeQuery(String sql); //用于向數據庫發送查詢語句
- executeUpdate(String sql); //用于向數據庫發送insert,update或delete語句
- execute(String sql); //用于向數據庫發送任意sql語句
- addBatch(String sql); //把多條sql語句放到一個批處理中
- executeBath(); //向數據庫發送一批sql語句執行
JDBC程序中的ResultSet對象用于代表sql語句的執行結果。ResultSet封裝執行結果時,采用的類似于表格的方式。ResultSet對象維護了一個指向表格數據行的游標,初始的時候,游標在第一行之前,調用該對象的next()方法,可以使游標指向具體的數據行,進行調用方法獲取該行的數據。由于ResultSet用于封裝執行結果,所以該對象提供的都是用于獲取數據的get方法:
- //獲取任意類型的數據
- getObject(int index); //index表示列號
- getObject(String columnName); //columnName表示列名,建議用這種方法,更好維護
- //獲取指定類型的數據(int,String,Date等)
- getString(int index);
- getString(String columnName);
ResultSet除了提供get方法以外,還提供了對結果集進行滾動的方法:
- next(); //移動到下一行
- previous(); //移動到前一行
- absolute(int row); //移動到指定行
- beforeFirst(); //移動到resultSet的最前面
- afterLast(); //移動到resultSet的最后面
為了確保資源釋放代碼能運行,資源釋放代碼一定要寫在finally語句中。
4. JDBC實現增刪改查
JDBC技術主要是同數據庫打交道,那么免不了增刪改查,由上面的代碼可以看出,在對數據庫進行操作之前需要先建立連接,在操作之后都需要釋放資源,所以我們可以把這兩部分內容抽取出來,寫到JDBCUtils類中來實現:
public class JDBCUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; //加載驅動 static{ try { //db.properties是一個配置文件,里面有連接數據庫所需要的信息 InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties prop = new Properties(); prop.load(in);//加載配置文件 driver = prop.getProperty("driver"); url = prop.getProperty("url"); username = prop.getProperty("username"); password = prop.getProperty("password"); Class.forName(driver);//加載驅動 } catch (Exception e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, username, password);//獲得connection } public static void release(Connection conn, Statement st, ResultSet rs){ //釋放資源 if(rs != null){ try{ rs.close(); }catch(Exception e) { e.printStackTrace(); } rs = null; } if(st != null){ try{ st.close(); }catch(Exception e) { e.printStackTrace(); } st = null; } if(conn != null){ try{ conn.close(); }catch(Exception e) { e.printStackTrace(); } conn = null; } } }
db.properties文件:
- driver=com.mysql.jdbc.Driver
- url=jdbc:mysql://localhost:3306/day14
- username=root
- password=root
這樣我們就完成了數據庫的連接和資源的釋放工具類。下面我們開始編寫對數據庫的增刪改查:
//使用JDBC對數據庫的增刪改查 public class Demo2 { private Connection conn = null; private Statement st = null; private ResultSet rs = null; @Test public void insert(){ try { conn = JDBCUtils.getConnection(); st = conn.createStatement(); String sql = "insert into user(id,name,password,email,birthday) values(3,'ww','123','ww@sina.com','1982-06-14');"; int num = st.executeUpdate(sql);//返回的是該sql語句會影響數據庫的幾行 if(num > 0){ System.out.println(num); System.out.println("插入成功"); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(conn, st, rs); } } @Test public void delete(){ try { conn = JDBCUtils.getConnection(); st = conn.createStatement(); String sql = "delete from user where password='123'"; int num = st.executeUpdate(sql); if(num > 0){ System.out.println(num); System.out.println("刪除成功"); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(conn, st, rs); } } @Test public void update(){ try { conn = JDBCUtils.getConnection(); st = conn.createStatement(); String sql = "update user set password='456' where name='ww'"; int num = st.executeUpdate(sql); if(num > 0) { System.out.println(num); System.out.println("修改成功"); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(conn, st, rs); } } @Test public void find(){ try { conn = JDBCUtils.getConnection(); st = conn.createStatement(); String sql = "select id,name,password,email,birthday from user"; rs = st.executeQuery(sql); while(rs.next()){ int id = (Integer)rs.getObject("id"); String name = (String)rs.getObject("name"); String password = (String)rs.getObject("password"); String email = (String)rs.getObject("email"); Date birthday = (Date)rs.getObject("birthday"); System.out.println(id+","+name+","+password+","+email+","+birthday); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(conn, st, rs); } } }
JDBC基本知識點就介紹到這,后面再介紹一些高級點的應用,如有錯誤之處,歡迎留言指正~
- DriverManager.registerDriver(new Driver());
- DriverManager.getConnection(URL, user, password);
文章列表