最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解通過JDBC進行簡單的增刪改查(以MySQL為例)

 更新時間:2017年01月11日 10:05:27   作者:五岳  
JDBC是用于執(zhí)行SQL語句的一類Java API,通過JDBC使得我們可以直接使用Java編程來對關(guān)系數(shù)據(jù)庫進行操作。通過封裝,可以使開發(fā)人員使用純Java API完成SQL的執(zhí)行。

前言:什么是JDBC

Java 數(shù)據(jù)庫連接,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規(guī)范客戶端程序如何來訪問數(shù)據(jù)庫的應用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法。JDBC也是Sun Microsystems的商標。它JDBC是面向關(guān)系型數(shù)據(jù)庫的。

簡單地說,就是用于執(zhí)行SQL語句的一類Java API,通過JDBC使得我們可以直接使用Java編程來對關(guān)系數(shù)據(jù)庫進行操作。通過封裝,可以使開發(fā)人員使用純Java API完成SQL的執(zhí)行。

一、準備工作(一):MySQL安裝配置和基礎(chǔ)學習

使用JDBC操作數(shù)據(jù)庫之前,首先你需要有一個數(shù)據(jù)庫。這里提供了3個鏈接供讀者自學,如果曾有過SQL語言的使用經(jīng)歷(包括在學校中的課堂學習),前兩個鏈接足以上手。

Mysql下載安裝、部署與圖形化詳細操作教程:http://m.fzitv.net/article/87690.htm

建議邊看入門教程,邊練習,在練習insert、update、select、delete等基本操作的同時,將后面要用的表建好。

下圖是我接下來用于演示的數(shù)據(jù)庫的表。

   

 二、準備工作(二):下載數(shù)據(jù)庫對應的jar包并導入

使用JDBC需要在工程中導入對應的jar包。數(shù)據(jù)庫與JDBC包的對應關(guān)系可以參考各種數(shù)據(jù)庫對應的jar包、驅(qū)動類名和URL格式。在Eclipse下的導入方法:

在工程的圖標上右擊,選擇”Properties”,在”Java Bulid Path”中選擇”Add External JARs…”,選擇下載并解壓后獲得的jar包。

       

如果對MySQL進行操作,這時下面的import就不會報錯了:

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

除此以外,還需要JDBC的包,直接import即可。

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

三、JDBC基本操作

為了簡單起見,與數(shù)據(jù)庫相關(guān)的操作、命令、參數(shù)都被硬編碼了。有興趣的讀者可以對這些進行探索,降低數(shù)據(jù)與操作的耦合性。

先看具體代碼并實踐,本文第五部分對用到的API稍作了研究。

下面的所有方法和數(shù)據(jù)成員都在public class JDBCOperation內(nèi)部。

(1)定義記錄的類(可選)

這樣做主要是為了便于操作和接口定義,是非必須的。

static class Student {
  private String Id;
  private String Name;
  private String Sex;
  private String Age;

  Student(String Name, String Sex, String Age) {
   this.Id = null; //default
   this.Name = Name;
   this.Sex = Sex;
   this.Age = Age;
  }

  public String getId() {
   return Id;
  }

  public void setId(String Id) {
   this.Id = Id;
  }

  public String getName() {
   return Name;
  }

  public void setName(String Name) {
   this.Name = Name;
  }

  public String getSex() {
   return Sex;
  }

  public void setSex(String Sex) {
   this.Sex = Sex;
  }

  public String getAge() {
   return Age;
  }

  public void setage(String Age) {
   this.Age = Age;
  }
}

(2)連接的獲取

在操作前必須先獲取與數(shù)據(jù)庫的連接。

private static Connection getConn() {
 String driver = "com.mysql.jdbc.Driver";
 String url = "jdbc:mysql://localhost:3306/samp_db";
 String username = "root";
 String password = "";
 Connection conn = null;
 try {
  Class.forName(driver); //classLoader,加載對應驅(qū)動
  conn = (Connection) DriverManager.getConnection(url, username, password);
 } catch (ClassNotFoundException e) {
  e.printStackTrace();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 return conn;
}

(3)insert

private static int insert(Student student) {
 Connection conn = getConn();
 int i = 0;
 String sql = "insert into students (Name,Sex,Age) values(?,?,?)";
 PreparedStatement pstmt;
 try {
  pstmt = (PreparedStatement) conn.prepareStatement(sql);
  pstmt.setString(1, student.getName());
  pstmt.setString(2, student.getSex());
  pstmt.setString(3, student.getAge());
  i = pstmt.executeUpdate();
  pstmt.close();
  conn.close();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 return i;
}

(4)update

private static int update(Student student) {
 Connection conn = getConn();
 int i = 0;
 String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'";
 PreparedStatement pstmt;
 try {
  pstmt = (PreparedStatement) conn.prepareStatement(sql);
  i = pstmt.executeUpdate();
  System.out.println("resutl: " + i);
  pstmt.close();
  conn.close();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 return i;
}

(5)select

以select * from XXX為例。

private static Integer getAll() {
 Connection conn = getConn();
 String sql = "select * from students";
 PreparedStatement pstmt;
 try {
  pstmt = (PreparedStatement)conn.prepareStatement(sql);
  ResultSet rs = pstmt.executeQuery();
  int col = rs.getMetaData().getColumnCount();
  System.out.println("============================");
  while (rs.next()) {
   for (int i = 1; i <= col; i++) {
    System.out.print(rs.getString(i) + "\t");
    if ((i == 2) && (rs.getString(i).length() < 8)) {
     System.out.print("\t");
    }
    }
   System.out.println("");
  }
   System.out.println("============================");
 } catch (SQLException e) {
  e.printStackTrace();
 }
 return null;
}

(6)delete

private static int delete(String name) {
 Connection conn = getConn();
 int i = 0;
 String sql = "delete from students where Name='" + name + "'";
 PreparedStatement pstmt;
 try {
  pstmt = (PreparedStatement) conn.prepareStatement(sql);
  i = pstmt.executeUpdate();
  System.out.println("resutl: " + i);
  pstmt.close();
  conn.close();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 return i;
}

四、測試

在測試前,需要在系統(tǒng)中打開對應數(shù)據(jù)庫的服務。MySQL在Windows下的啟動命令為net start mysql

測試代碼

public static void main(String args[]) {
 JDBCOperation.getAll();
 JDBCOperation.insert(new Student("Achilles", "Male", "14"));
 JDBCOperation.getAll();
 JDBCOperation.update(new Student("Bean", "", "7"));
 JDBCOperation.delete("Achilles");
 JDBCOperation.getAll();
}

Eclipse中的輸出

============================
1 Ender  male 8 
2 Bean  male 6 
3 Petra  fema 9 
4 Peter  male 9 
5 _Graff  male 40 
6 GOD  fema 255 
============================
============================
1 Ender  male 8 
2 Bean  male 6 
3 Petra  fema 9 
4 Peter  male 9 
5 _Graff  male 40 
6 GOD  fema 255 
7 Achilles Male 14 
============================
resutl: 1
resutl: 1
============================
1 Ender  male 8 
2 Bean  male 7 
3 Petra  fema 9 
4 Peter  male 9 
5 _Graff  male 40 
6 GOD  fema 255 
============================

五、代碼分析

在上述對數(shù)據(jù)庫進行增刪改查的過程中,可以發(fā)現(xiàn)其共性部分,即通用的流程:

(1)創(chuàng)建Connection對象、SQL查詢命令字符串;

(2)對Connection對象傳入SQL查詢命令,獲得PreparedStatement對象;

(3)對PreparedStatement對象執(zhí)行executeUpdate()或executeQurey()獲得結(jié)果;

(4)先后關(guān)閉PreparedStatement對象和Connection對象。

可見,使用JDBC時,最常打交道的是Connection、PreparedStatement這兩個類,以及select中的ResultSet類。

Connection

java.sql

接口 Connection

所有超級接口:Wrapper

--------------------------------------------------------------------------------

public interface Connectionextends Wrapper

與特定數(shù)據(jù)庫的連接(會話)。在連接上下文中執(zhí)行 SQL 語句并返回結(jié)果。

Connection 對象的數(shù)據(jù)庫能夠提供描述其表、所支持的 SQL 語法、存儲過程、此連接功能等等的信息。此信息是使用 getMetaData 方法獲得的。

PreparedStatemnt

java.sql

接口 PreparedStatement

所有超級接口:Statement, Wrapper所有已知子接口:CallableStatement

--------------------------------------------------------------------------------

public interface PreparedStatementextends Statement

表示預編譯的 SQL 語句的對象。

SQL 語句被預編譯并存儲在 PreparedStatement 對象中。然后可以使用此對象多次高效地執(zhí)行該語句。

常用方法

 boolean execute()

在此 PreparedStatement 對象中執(zhí)行 SQL 語句,該語句可以是任何種類的 SQL 語句。

 ResultSet executeQuery()

在此 PreparedStatement 對象中執(zhí)行 SQL 查詢,并返回該查詢生成的 ResultSet 對象。

 int executeUpdate()

在此 PreparedStatement 對象中執(zhí)行 SQL 語句,該語句必須是一個 SQL 數(shù)據(jù)操作語言(Data Manipulation Language,DML)語句,比如 INSERT、UPDATE 或 DELETE 語句;或者是無返回內(nèi)容的 SQL 語句,比如 DDL 語句。

ResultSet

java.sql

接口 ResultSet

所有超級接口:Wrapper所有已知子接口:CachedRowSet, FilteredRowSet, JdbcRowSet, JoinRowSet,RowSet,SyncResolver, WebRowSet

--------------------------------------------------------------------------------

public interface ResultSetextends Wrapper

表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成?! ?/p>

六、思考問題

1.每次SQL操作都需要建立和關(guān)閉連接,這勢必會消耗大量的資源開銷,如何避免?

分析:可以采用連接池,對連接進行統(tǒng)一維護,不必每次都建立和關(guān)閉。事實上這是很多對JDBC進行封裝的工具所采用的。

2.Java代碼中,傳入的數(shù)據(jù)格式與數(shù)據(jù)庫定義不同怎么辦?如把Java的String對象賦值給數(shù)據(jù)庫的tinyint屬性。

分析:在執(zhí)行SQL語句時,數(shù)據(jù)庫會嘗試進行轉(zhuǎn)換。根據(jù)我的實驗,如果用內(nèi)容為純字母的String對象傳入tinyint的age屬性時,會被轉(zhuǎn)化成0。具體轉(zhuǎn)化規(guī)則應該和數(shù)據(jù)庫有關(guān)。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringDataJpa如何使用union多表分頁條件查詢

    SpringDataJpa如何使用union多表分頁條件查詢

    這篇文章主要介紹了SpringDataJpa如何使用union多表分頁條件查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 用java生成html文件實現(xiàn)原理及代碼

    用java生成html文件實現(xiàn)原理及代碼

    用printStream來向html文件里輸出數(shù)據(jù),先創(chuàng)建一個StringBuilder對象,通過append方法來為其添加html語句,具體實現(xiàn)如下,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-08-08
  • Spring基于注解的緩存聲明深入探究

    Spring基于注解的緩存聲明深入探究

    spring boot對緩存支持非常靈活,我們可以使用默認的EhCache,也可以整合第三方的框架,只需配置即可,下面這篇文章主要給大家介紹了關(guān)于SpringBoot學習之基于注解緩存的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • java根據(jù)模板導出PDF的詳細實現(xiàn)過程

    java根據(jù)模板導出PDF的詳細實現(xiàn)過程

    前段時間因為相關(guān)業(yè)務需求需要后臺生成pdf文件,所以下面這篇文章主要給大家介紹了關(guān)于java根據(jù)模板導出PDF的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • mybatisPlus實現(xiàn)倒序拼接字符串

    mybatisPlus實現(xiàn)倒序拼接字符串

    這篇文章主要介紹了mybatisPlus實現(xiàn)倒序拼接字符串方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java設(shè)計模式之策略模式示例詳解

    Java設(shè)計模式之策略模式示例詳解

    策略模式屬于Java?23種設(shè)計模式中行為模式之一,該模式定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。本文將通過示例詳細講解這一模式,需要的可以參考一下
    2022-08-08
  • Mybatis如何使用正則模糊匹配多個數(shù)據(jù)

    Mybatis如何使用正則模糊匹配多個數(shù)據(jù)

    這篇文章主要介紹了Mybatis如何使用正則模糊匹配多個數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 打卡每日10道面試題——JVM篇

    打卡每日10道面試題——JVM篇

    總結(jié)了JVM一些經(jīng)典面試題,分享出我自己的解題思路,希望對大家有幫助,有哪里你覺得不正確的話,歡迎指出,后續(xù)有空會更新,希望大家能夠喜歡
    2021-06-06
  • Java SpringBoot開發(fā)小技巧詳解

    Java SpringBoot開發(fā)小技巧詳解

    這篇文章主要介紹了淺談SpringBoot項目如何讓前端開發(fā)提高效率(小技巧),主要介紹了Swagger和Nginx提高效率的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • java中json-diff簡單使用及對象是否一致詳解

    java中json-diff簡單使用及對象是否一致詳解

    這篇文章主要為大家介紹了java中json-diff簡單使用及對象是否一致對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

平江县| 营口市| 温泉县| 丰宁| 广安市| 宁安市| 新余市| 宜章县| 枣阳市| 武陟县| 京山县| 星子县| 永济市| 岢岚县| 漾濞| 冀州市| 安吉县| 调兵山市| 临沂市| 乐陵市| 花莲市| 南郑县| 那曲县| 辰溪县| 祁门县| 新营市| 桂平市| 汝阳县| 兰州市| 西昌市| 托克托县| 岚皋县| 安岳县| 贵溪市| 改则县| 长宁县| 馆陶县| 那坡县| 广河县| 蒙山县| 晋州市|