JDBC

JDBC概述 java

JDBC:java database connectivity SUN公司提供的一套操做數據庫的標準規範。 mysql

JDBC與數據庫驅動的關係:接口與實現的關係。 sql

JDBC規範(掌握四個核心對象): 數據庫

   

DriverManager:用於註冊驅動 oracle

Connection: 表示與數據庫建立的鏈接 ide

Statement: 操做數據庫sql語句的對象 工具

ResultSet: 結果集或一張虛擬表 性能

   

   

jdbc中常見的類和接口: 測試

   

java.sql.Drivermanager : 建立鏈接 this

   

a、註冊驅動

DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用

緣由有2個:

> 致使驅動被註冊2次。

> 強烈依賴數據庫的驅動jar

解決辦法:

Class.forName("com.mysql.jdbc.Driver");

b、與數據庫創建鏈接

static Connection getConnection(String url, String user, String password)

試圖創建到給定數據庫 URL 的鏈接。

getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");

   

URL:SUN公司與數據庫廠商之間的一種協議。

jdbc:mysql://localhost:3306/day06

協議 子協議 IP :端口號 數據庫

mysql: jdbc:mysql://localhost:3306/day14 或者 jdbc:mysql:///day14(默認本機鏈接)

oracle: jdbc:oracle:thin:@localhost:1521:sid

   

   

Properties info = new Properties();//要參考數據庫文檔

info.setProperty("user", "root");

info.setProperty("password","root");

   

getConnection(String url, Properties info)

   

getConnection(String url)

DriverManager.getConnection("jdbc:mysql://localhost:3306/day14?user=root&password=root");

Demo

//使用JDBC技術實現查詢數據庫數據,並顯示在控制檯中

public class Demo2 {

@Test

public void test1() throws Exception {

   

//加載驅動

Class.forName("com.mysql.jdbc.Driver");

//獲取鏈接Connection

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day06", "root", "abc");

//獲得執行sql語句的對象Statement

Statement stmt = conn.createStatement();

//執行sql語句,並返回結果

ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");

//處理結果

while(rs.next()){

System.out.println(rs.getObject(1));

System.out.println(rs.getObject(2));

System.out.println(rs.getObject(3));

System.out.println(rs.getObject(4));

System.out.println(rs.getObject(5));

System.out.println("-----------------");

}

//關閉資源

rs.close();

stmt.close();

conn.close();

}

   

@Test

public void test2() throws Exception{

//加載驅動

Class.forName("com.mysql.jdbc.Driver");

//獲取鏈接Connection

Properties info = new Properties();

info.setProperty("user", "root");

info.setProperty("password", "abc");

   

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day06", info);

//獲得執行sql語句的對象Statement

Statement stmt = conn.createStatement();

//執行sql語句,並返回結果

ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");

//處理結果

while(rs.next()){

System.out.println(rs.getObject(1));

System.out.println(rs.getObject(2));

System.out.println(rs.getObject(3));

System.out.println(rs.getObject(4));

System.out.println(rs.getObject(5));

System.out.println("-----------------");

}

//關閉資源

rs.close();

stmt.close();

conn.close();

}

   

@Test

public void test3() throws Exception{

//加載驅動

Class.forName("com.mysql.jdbc.Driver");

//獲取鏈接Connection

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day06?user=root&password=abc");

//獲得執行sql語句的對象Statement

Statement stmt = conn.createStatement();

//執行sql語句,並返回結果

ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");

//處理結果

while(rs.next()){

System.out.println(rs.getObject(1));

System.out.println(rs.getObject(2));

System.out.println(rs.getObject(3));

System.out.println(rs.getObject(4));

System.out.println(rs.getObject(5));

System.out.println("-----------------");

}

//關閉資源

rs.close();

stmt.close();

conn.close();

}

   

@Test

public void test4() throws Exception{

//獲取鏈接Connection

Connection conn = null;

//獲得執行sql語句的對象Statement

Statement stmt = null;

//執行sql語句,並返回結果

ResultSet rs = null;

try {

//加載驅動

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day06?user=root&password=abc");

stmt = conn.createStatement();

rs = stmt.executeQuery("select id,name,password,email,birthday form users");

//處理結果

while(rs.next()){

System.out.println(rs.getObject(1));

System.out.println(rs.getObject(2));

System.out.println(rs.getObject(3));

System.out.println(rs.getObject(4));

System.out.println(rs.getObject(5));

System.out.println("-----------------");

}

} catch (Exception e) {

e.printStackTrace();

}finally{

//關閉資源

if(rs!=null){

try {

rs.close();

} catch (Exception e) {

e.printStackTrace();

}

rs = null;

}

if(stmt!=null){

try {

stmt.close();

} catch (Exception e) {

e.printStackTrace();

}

stmt = null;

}

if(conn!=null){

try {

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

conn = null;

}

   

}

}

}

java.sql.Connection接口:一個鏈接

接口的實如今數據庫驅動中。全部與數據庫交互都是基於鏈接對象的。

Statement createStatement(); //建立操做sql語句的對象

   

java.sql.Statement接口: 操做sql語句,並返回相應結果的對象

   

接口的實如今數據庫驅動中。用於執行靜態 SQL 語句並返回它所生成結果的對象。

ResultSet executeQuery(String sql) 根據查詢語句返回結果集。只能執行select語句。

int executeUpdate(String sql) 根據執行的DMLinsert update delete)語句,返回受影響的行數。

boolean execute(String sql) 此方法能夠執行任意sql語句。返回boolean值,表示是否返回ResultSet結果集。僅當執行select語句,且有返回結果時返回true, 其它語句都返回false;

   

 

a、封裝結果集的。

提供一個遊標,默認遊標指向結果集第一行以前。

調用一次next(),遊標向下移動一行。

提供一些get方法。

   

封裝數據的方法

Object getObject(int columnIndex); 根據序號取值,索引從1開始

Object getObject(String ColomnName); 根據列名取值。

   

將結果集中的數據封裝到javaBean

java的數據類型與數據庫中的類型的關係

byte tityint

short smallint

int int

long bigint

float float

double double

String char varchar

Date date

   

   

boolean next()        將光標從當前位置向下移動一行

int getInt(int colIndex)        int形式獲取ResultSet結果集當前行指定列號值

int getInt(String colLabel)        int形式獲取ResultSet結果集當前行指定列名值

float getFloat(int colIndex)        float形式獲取ResultSet結果集當前行指定列號值

float getFloat(String colLabel)        float形式獲取ResultSet結果集當前行指定列名值

String getString(int colIndex)        String 形式獲取ResultSet結果集當前行指定列號值

String getString(String colLabel)        String形式獲取ResultSet結果集當前行指定列名值

Date getDate(int columnIndex);

Date getDate(String columnName);

void close()        關閉ResultSet 對象

   

b、可移動遊標的方法

boolean next() 將光標從當前位置向前移一行。

boolean previous()

將光標移動到此 ResultSet 對象的上一行。

boolean absolute(int row) 參數是當前行的索引,從1開始

        根據行的索引定位移動的指定索引行。

void afterLast()

將光標移動到末尾,正好位於最後一行以後。

void beforeFirst()

將光標移動到開頭,正好位於第一行以前。

   

5、釋放資源

資源有限,要正確關閉。

 

 

   

   

完整的JDBC的DEMO:

demo:

工具類代碼

public class DBUtils {

private static String driverClass;

private static String url;

private static String username;

private static String password;

   

static{

//此對象是用於加載properties文件數據的

ResourceBundle rb = ResourceBundle.getBundle("dbinfo");

driverClass = rb.getString("driverClass");

url = rb.getString("url");

username = rb.getString("username");

password = rb.getString("password");

try {

Class.forName(driverClass);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

   

//獲得鏈接的方法

public static Connection getConnection() throws Exception{

return DriverManager.getConnection(url, username, password);

}

   

//關閉資源的方法

public static void closeAll(ResultSet rs,Statement stmt,Connection conn){

//關閉資源

if(rs!=null){

try {

rs.close();

} catch (Exception e) {

e.printStackTrace();

}

rs = null;

}

if(stmt!=null){

try {

stmt.close();

} catch (Exception e) {

e.printStackTrace();

}

stmt = null;

}

if(conn!=null){

try {

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

conn = null;

}

}

}

demo:

配置文件代碼:

driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql:///day06

username=root

password=abc

demo:

增刪改查的測試代碼

public class TestCRUD {

@Test

public void testSelect(){

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

   

try {

conn = DBUtils.getConnection();

stmt = conn.createStatement();

rs = stmt.executeQuery("select * from users");

List<User> list = new ArrayList<User>();

while(rs.next()){

User u = new User();

u.setId(rs.getInt(1));

u.setName(rs.getString(2));

u.setPassword(rs.getString(3));

u.setEmail(rs.getString(4));

u.setBirthday(rs.getDate(5));

list.add(u);

}

   

for (User user : list) {

System.out.println(user);

}

} catch (Exception e) {

e.printStackTrace();

}finally{

DBUtils.closeAll(rs, stmt, conn);

}

}

   

@Test

public void testInsert(){

Connection conn = null;

PreparedStatement stmt = null;

   

try {

conn = DBUtils.getConnection();

stmt = conn.prepareStatement("INSERT INTO users VALUES(?,?,?,?,?)");

stmt.setInt(1, 5);

stmt.setString(2, "tom");

stmt.setString(3, "333");

stmt.setString(4, "tom@163.com");

//stmt.setDate(5, new java.sql.Date(System.currentTimeMillis()));

stmt.setString(5, "2015-09-11");

   

int i = stmt.executeUpdate();

if(i>0){

System.out.println("success");

}

} catch (Exception e) {

e.printStackTrace();

}finally{

DBUtils.closeAll(null, stmt, conn);

}

}

   

@Test

public void testUpdate(){

Connection conn = null;

PreparedStatement stmt = null;

   

try {

conn = DBUtils.getConnection();

stmt = conn.prepareStatement("UPDATE users SET NAME=?,PASSWORD=?,email=? WHERE id=?");

stmt.setString(1, "jerry123");

stmt.setString(2, "123");

stmt.setString(3, "jerry@163.com");

stmt.setInt(4, 5);

   

int i = stmt.executeUpdate();

if(i>0){

System.out.println("success");

}

} catch (Exception e) {

e.printStackTrace();

}finally{

DBUtils.closeAll(null, stmt, conn);

}

}

   

@Test

public void testDelete(){

Connection conn = null;

Statement stmt = null;

   

try {

conn = DBUtils.getConnection();

stmt = conn.createStatement();

int i = stmt.executeUpdate("DELETE FROM users WHERE id=4");

if(i>0){

System.out.println("success");

}

} catch (Exception e) {

e.printStackTrace();

}finally{

DBUtils.closeAll(null, stmt, conn);

}

}

}

demo:

實體類代碼:

public class User {

private int id;

private String name;

private String password;

private String email;

private Date birthday;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", password=" + password

+ ", email=" + email + ", birthday=" + birthday + "]";

}

   

}

   

SQL注入問題:preparedStatement

preparedStatement:預編譯對象, 是Statement對象的子類。

特色:

性能要高

會把sql語句先編譯

sql語句中的參數會發生變化,過濾掉用戶輸入的關鍵字。

   

補充例子:

相關文章
相關標籤/搜索