創建數據庫連接的三種方式:java
package com.victor_01; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import org.junit.Test; public class Test1 { private String url = "jdbc:mysql://192.168.244.144:3306/test"; private String user = "root"; private String password = "123456"; @Test public void test1() throws Exception { Driver driver = new com.mysql.jdbc.Driver(); Properties prop = new Properties(); prop.setProperty("user", user); prop.setProperty("password", password); Connection conn = driver.connect(url, prop); System.out.println(conn); } @Test public void test2() throws SQLException{ Driver driver = new com.mysql.jdbc.Driver(); DriverManager.registerDriver(driver); Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); } @Test public void test3() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); } }
推薦使用第三種,其實第二種和第三種本質上是一種,後者是前者的優化版。mysql
JDBC接口核心的APIsql
JDBC接口核心的API java.sql.* 和 javax.sql.* |- Driver接口: 表示java驅動程序接口。全部的具體的數據庫廠商要來實現此接口。 |- connect(url, properties): 鏈接數據庫的方法。 url: 鏈接數據庫的URL URL語法: jdbc協議:數據庫子協議://主機:端口/數據庫 user: 數據庫的用戶名 password: 數據庫用戶密碼 |- DriverManager類: 驅動管理器類,用於管理全部註冊的驅動程序 |-registerDriver(driver) : 註冊驅動類對象 |-Connection getConnection(url,user,password); 獲取鏈接對象 |- Connection接口: 表示java程序和數據庫的鏈接對象。 |- Statement createStatement() : 建立Statement對象 |- PreparedStatement prepareStatement(String sql) 建立PreparedStatement對象 |- CallableStatement prepareCall(String sql) 建立CallableStatement對象 |- Statement接口: 用於執行靜態的sql語句 |- int executeUpdate(String sql) : 執行靜態的更新sql語句(DDL,DML) |- ResultSet executeQuery(String sql) :執行的靜態的查詢sql語句(DQL) |-PreparedStatement接口:用於執行預編譯sql語句 |- int executeUpdate() : 執行預編譯的更新sql語句(DDL,DML) |-ResultSet executeQuery() : 執行預編譯的查詢sql語句(DQL) |-CallableStatement接口:用於執行存儲過程的sql語句(call xxx) |-ResultSet executeQuery() : 調用存儲過程的方法 |- ResultSet接口:用於封裝查詢出來的數據 |- boolean next() : 將光標移動到下一行 |-getXX() : 獲取列的值
Statement接口數據庫
package com.victor_01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.junit.Test; public class Demo2 { private String url = "jdbc:mysql://192.168.244.144:3306/test"; private String user = "root"; private String password = "123456"; @Test public void Test1() { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); stmt = conn.createStatement(); String sql = "drop table if exists jdbc_test"; int result = stmt.executeUpdate(sql); System.out.println("Drop table:" + result); sql = "create table jdbc_test(id int,name varchar(10))"; result = stmt.executeUpdate(sql); System.out.println("Create result:" + result); sql = "insert into jdbc_test values(1,'hello')"; result = stmt.executeUpdate(sql); System.out.println("Insert result:" + result); int id = 2; String name = "world"; sql = "insert into jdbc_test values(" + id + ",'" + name + "')"; result = stmt.executeUpdate(sql); System.out.println("Insert result2:" + result); name = "java"; sql = "update jdbc_test set name='" + name + "' where id=" + id + ""; result = stmt.executeUpdate(sql); System.out.println("Update result:" + result); sql = "select * from jdbc_test"; rs = stmt.executeQuery(sql); while (rs.next()) { System.out .println(rs.getInt("id") + " " + rs.getString("name")); } } catch (Exception e) { e.printStackTrace(); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
PreparedStatement接口優化
package com.victor_01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; public class Demo3 { private String url="jdbc:mysql://192.168.244.144:3306/test"; private String user="root"; private String password="123456"; @Test public void PreparedStatementTest() throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection(url, user, password); String sql="insert into jdbc_test(id,name) values(?,?)"; PreparedStatement prestmt =conn.prepareStatement(sql); prestmt.setInt(1, 3); prestmt.setString(2,"tom"); int result=prestmt.executeUpdate(); System.out.println(result); sql="update jdbc_test set name=? where id=?"; prestmt=conn.prepareStatement(sql); prestmt.setString(1, "steve"); prestmt.setInt(2, 3); result=prestmt.executeUpdate(); System.out.println(result); sql="select * from jdbc_test where id=?"; prestmt=conn.prepareStatement(sql); prestmt.setInt(1, 3); ResultSet rs= prestmt.executeQuery(); while(rs.next()){ System.out.println("id="+rs.getInt(1)+";name="+rs.getString(2)); } rs.close(); prestmt.close(); conn.close(); } }
CallableStatement接口url
package com.victor_01; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; public class Demo3 { private String url="jdbc:mysql://192.168.244.144:3306/test"; private String user="root"; private String password="123456"; @Test public void PreparedStatementTest() throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection(url, user, password); String sql="drop procedure findById"; Statement stmt=conn.createStatement(); int result=stmt.executeUpdate(sql); System.out.println("drop result:="+result); sql=" CREATE PROCEDURE findById(IN sid INT) BEGIN select * from jdbc_test where id=sid; end"; stmt=conn.createStatement(); result=stmt.executeUpdate(sql); System.out.println("create result:="+result); //直接調用存儲過程 sql="call findById(2)"; CallableStatement stmt1=conn.prepareCall(sql); ResultSet rs=stmt1.executeQuery(); while(rs.next()){ System.out.println("id="+rs.getInt(1)+",name="+rs.getString(2)); } //傳參調用存儲過程 sql="call findById(?)"; stmt1=conn.prepareCall(sql); stmt1.setInt(1, 4); rs=stmt1.executeQuery(); while(rs.next()){ System.out.println("id="+rs.getInt(1)+",name="+rs.getString(2)); } //帶有輸出參數的存儲過程 sql="drop procedure findById1"; stmt=conn.createStatement(); result=stmt.executeUpdate(sql); System.out.println("drop findById1 result:"+result); sql=" CREATE PROCEDURE findById1(IN sid INT,OUT sname VARCHAR(10)) BEGIN select name into sname from jdbc_test where id=sid; end"; stmt=conn.createStatement(); result=stmt.executeUpdate(sql); System.out.println("create result:="+result); sql="call findById1(?,?)"; stmt1=conn.prepareCall(sql); stmt1.setInt(1, 4); stmt1.registerOutParameter(2, java.sql.Types.VARCHAR); stmt1.executeQuery(); //注意:結果不是返回到ResultSet中,而是返回到輸出參數中。 String sname=stmt1.getString(2); System.out.println(sname); rs.close(); stmt1.close(); stmt.close(); conn.close(); } }