日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

原生JDBC和工具类的基本实现

發(fā)布時(shí)間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原生JDBC和工具类的基本实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工具:

  • IDEA
  • MySQL8.0或之前版本

    文章目錄

      • JDBC原理
      • JDBC入門案例
      • JDBC的API詳解
      • JDBC增刪改查操作
      • JDBC工具類

JDBC是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范,可以為不同的關(guān)系型數(shù)據(jù)庫提供統(tǒng)?訪問,它由一組用Java編寫的接口和類組成。
JDBC需要 連接驅(qū)動(dòng),驅(qū)動(dòng)是兩個(gè)設(shè)備要進(jìn)行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,設(shè)備提供商為設(shè)備提供驅(qū)動(dòng)軟件,通過軟件可以與該設(shè)備進(jìn)行通信。
今天我們使用的是mysql的驅(qū)動(dòng) mysql-connector-java-8.0.20.jar(適配MySQL8.0版本),如果是之前版本的MySQL建議使用應(yīng)用次數(shù)較多的 mysql-connector-java-5.1.38.jar

JDBC核心規(guī)范:

  • DriverManager:?于注冊(cè)驅(qū)動(dòng)
  • Connection: 表示與數(shù)據(jù)庫創(chuàng)建的連接
  • Statement: 操作數(shù)據(jù)庫sql語句的對(duì)象
  • ResultSet: 結(jié)果集或?張?zhí)摂M表

JDBC原理

Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實(shí)現(xiàn)類稱為驅(qū)動(dòng)。JDBC是接口,驅(qū)動(dòng)是接口的實(shí)現(xiàn),沒有驅(qū)動(dòng)將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫!每個(gè)數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動(dòng),用來連接自己公司的數(shù)據(jù)庫,也就是說驅(qū)動(dòng)一般都由數(shù)據(jù)庫生成廠商提供(也就是在我們上邊導(dǎo)入的jar包當(dāng)中)。

開發(fā)步驟

  • 注冊(cè)驅(qū)動(dòng)
  • 獲得連接
  • 獲得執(zhí)行sql語句的對(duì)象
  • 執(zhí)行sql語句,并返回結(jié)果
  • 處理結(jié)果
  • 釋放資源

  • JDBC入門案例

    首先熟悉一下JDBC的helloworld,

  • 準(zhǔn)備MySQL數(shù)據(jù):
  • #創(chuàng)建分類表 create table category( cid int PRIMARY KEY AUTO_INCREMENT, cname varchar(100) ); #初始化數(shù)據(jù) insert into category (cname) values('家電'); insert into category (cname) values('服飾'); insert into category (cname) values('化妝品');

    建立一個(gè)簡(jiǎn)單的表
    2. 導(dǎo)入驅(qū)動(dòng)jar包
    在IDEA項(xiàng)目下創(chuàng)建lib目錄
    在MVN下好jar包并復(fù)制,雙擊新建的lib目錄ctrl+v,jar包就保存到該目錄下,之后右鍵導(dǎo)入的jar包,選擇添加到庫…或Add as Library...,就正式添加完畢了
    MySQL8.0連接jdbc方法

    package JDBCTest;import org.junit.Test;import java.sql.*;public class JDBCDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException {@Test/*** 1.注冊(cè)驅(qū)動(dòng), 就是把 Driver.class?件加載到內(nèi)存* mysql8.0之前的版本需要連接的驅(qū)動(dòng)是com.mysql.jdbc.Driver*/Class.forName("com.mysql.cj.jdbc.Driver");/*** 2.獲得連接* 參數(shù) url : 需要連接數(shù)據(jù)庫的地址 jdbc:mysql://IP地址:端?號(hào)/要連接的數(shù)據(jù)庫名稱* 參數(shù) user : 連接數(shù)據(jù)庫 使?的?戶名* 參數(shù) password: 連接數(shù)據(jù)庫 使?的密碼*/String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true";Connection connection = DriverManager.getConnection(url, "root", "root");/*** 3.獲取執(zhí)?sql語句的對(duì)象*/Statement statement = connection.createStatement();/*** 4.執(zhí)行sql語句并返回結(jié)果*/String sql1 = "select * from category";ResultSet resultSet = statement.executeQuery(sql1);/*** 5.處理結(jié)果*/while (resultSet.next()) {int cid = resultSet.getInt("cid");String cname = resultSet.getString("cname");System.out.println("cid = " + cid + ", cname = " + cname);}/*** 6.釋放資源*/resultSet.close();statement.close();connection.close();} }


    JDBC的API詳解

  • 注冊(cè)驅(qū)動(dòng)
    有兩種方法:
    ①DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    ②Class.forName("com.mysql.jdbc.Driver");
    其中第一種辦法不被推薦使用,因?yàn)轵?qū)動(dòng)會(huì)被注冊(cè)兩次,并且會(huì)強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動(dòng)jar,通常我們?cè)谧鲩_發(fā)的時(shí)候用的都是第二種方式來注冊(cè)驅(qū)動(dòng)
  • 獲得鏈接
    static Connection getConnection(String url, String user, String password) :試圖建立到給定數(shù)據(jù)庫 URL 的連接
  • 使用參數(shù)說明:

    • url 需要連接數(shù)據(jù)庫的位置(網(wǎng)址)
    • user用戶名 (要區(qū)別于數(shù)據(jù)庫表名)
    • password 密碼

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

    URL是SUN公司和數(shù)據(jù)庫廠商的一個(gè)協(xié)議

    jdbc:mysql://localhost:3306/database

    協(xié)議子協(xié)議 IP:端口號(hào)數(shù)據(jù)庫

    • mysql數(shù)據(jù)庫:
    • jdbc:mysql://localhost:3306/database 或者
    • jdbc:mysql:///database(默認(rèn)本機(jī)連接)
    • oracle數(shù)據(jù)庫:
    • jdbc:oracle:thin:@localhost:1521:sid
  • java.sql.Connection接口:一個(gè)連接
    接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)中,所有與數(shù)據(jù)庫交互都是基于連接對(duì)象的。

  • java.sql.Statement接口: 操作sql語句,并返回相應(yīng)結(jié)果

  • String sql = "某SQL語句"; 獲取Statement語句執(zhí)?平臺(tái):Statement stmt =con.createStatement();

    常用方法:
    int executeUpdate(String sql); --執(zhí)行insert update delete語句.
    ResultSet executeQuery(String sql); --執(zhí)行select語句.
    boolean execute(String sql); --僅當(dāng)執(zhí)行select并且有結(jié)果時(shí)才返回true,執(zhí)行其他的語句返回false.

  • 處理結(jié)果集(注:執(zhí)行insert、update、delete無需處理)
    ResultSet實(shí)際上就是一張二維的表格,我們可以調(diào)用其 boolean next() 方法指向某行記錄,當(dāng)?shù)谝淮握{(diào)用 next() 方法時(shí),便指向第一行記錄的位置,這時(shí)就可以使用ResultSet提供的 getXXX(int col) 方法來獲取指定列的數(shù)據(jù):(與數(shù)組索引從0開始不同,這里索引從1開始)
  • rs.next();//指向第?? rs.getInt(1);//獲取第??第?列的數(shù)據(jù)

    常用方法:

    • Object getObject(int index) / Object getObject(String name) 獲得任意對(duì)象
    • String getString(int index) / String getString(String name) 獲得字符串
    • int getInt(int index) / int getInt(String name) 獲得整型
    • double getDouble(int index) / double getDouble(String name) 獲得雙精度浮點(diǎn)型
  • 釋放資源
    與IO流?樣,使用后的東西都需要關(guān)閉!關(guān)閉的順序是先得到的后關(guān)閉,后得到的先關(guān)閉。
  • rs.close(); stmt.close(); con.close();

    JDBC增刪改查操作

  • 增:
  • @Testpublic void testJDBC2() throws SQLException, ClassNotFoundException { /*** JDBC 完成 記錄的插?* 1.注冊(cè)驅(qū)動(dòng)* 2.獲得連接* 3.獲得執(zhí)?sql語句的對(duì)象* 4.執(zhí)?sql語句, 并返回結(jié)果* 5.處理結(jié)果* 6.釋放資源*/Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/mydb";Connection conn = DriverManager.getConnection(url, "root","root");Statement stat = conn.createStatement();String sql = "insert into category(cname) values('測(cè)試')";int result = stat.executeUpdate(sql);System.out.println("result = " + result);stat.close();conn.close();}
  • 刪:
  • @Test public void testJDBC4() throws SQLException, ClassNotFoundException { /** * JDBC 完成 記錄的刪除 * 1.注冊(cè)驅(qū)動(dòng) * 2.獲得連接 * 3.獲得執(zhí)?sql語句的對(duì)象 * 4.執(zhí)?sql語句, 并返回結(jié)果 * 5.處理結(jié)果 * 6.釋放資源 */ Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydb"; Connection conn = DriverManager.getConnection(url, "root", "root"); Statement stat = conn.createStatement(); String sql = "delete from category where cid=4"; int result = stat.executeUpdate(sql); System.out.println("result = " + result); stat.close(); conn.close(); }
  • 改:
  • @Testpublic void testJDBC3() throws SQLException, ClassNotFoundException { /*** JDBC 完成 記錄的更新* 1.注冊(cè)驅(qū)動(dòng)* 2.獲得連接* 3.獲得執(zhí)?sql語句的對(duì)象* 4.執(zhí)?sql語句, 并返回結(jié)果* 5.處理結(jié)果* 6.釋放資源*/Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/mydb";Connection conn = DriverManager.getConnection(url, "root","root");Statement stat = conn.createStatement();String sql = "update category set cname='測(cè)試2' where cid=4";int result = stat.executeUpdate(sql);System.out.println("result = " + result);stat.close();conn.close();}
  • 查:
  • @Testpublic void testJDBC5() throws SQLException, ClassNotFoundException { /*** JDBC 完成 記錄的刪除* 1.注冊(cè)驅(qū)動(dòng)* 2.獲得連接* 3.獲得執(zhí)?sql語句的對(duì)象* 4.執(zhí)?sql語句, 并返回結(jié)果* 5.處理結(jié)果* 6.釋放資源*/ // 通過id 查詢數(shù)據(jù)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/mydb";Connection conn = DriverManager.getConnection(url, "root","root");Statement stat = conn.createStatement();String sql = "select * from category where cid = 3";ResultSet rs = stat.executeQuery(sql);if (rs.next()) {int cid = rs.getInt("cid");String cname = rs.getString("cname");System.out.println("cid = " + cid + ",cname = " +cname);} else {System.out.println("數(shù)據(jù)沒有查到");}rs.close();stat.close();conn.close();}

    JDBC工具類

    為啥要用到工具類呢?
    JDBC操作中有大量的重復(fù)性編碼,為了減少不必要的工作量,引入了工具類,獲得數(shù)據(jù)庫連接操作,將在以后的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils。提供獲取連接對(duì)象的方法,從而達(dá)到代碼的重復(fù)利用。
    該工具類提供方法: public static Connection getConnection()

  • 右鍵src,新建一個(gè)文件,隨便命名

  • MySQL8.0用戶

    jdbc.driver=com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true jdbc.user=root jdbc.password=root

    MySQL8.0以前版本的用戶

    jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb jdbc.user=root jdbc.password=root
  • 建立JDBC工具類
  • public class JDBCUtils2 {private static String driver;private static String url;private static String user;private static String password;static {try{ //使?類加載器, 讀取配置?件InputStream is=JDBCUtils2.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties prop=new Properties();prop.load(is);driver=prop.getProperty("jdbc.driver");url=prop.getProperty("jdbc.url");user=prop.getProperty("jdbc.user");password=prop.getProperty("jdbc.password"); //注冊(cè)驅(qū)動(dòng)Class.forName(driver);}catch(IOException e){e.printStackTrace();}catch(ClassNotFoundException e){e.printStackTrace();}} /*** 返回連接對(duì)象 Connection*/ public static Connection getConnection()throws SQLException{Connection conn=DriverManager.getConnection(url,user,password);return conn;} /*** 釋放資源*/ public static void close(ResultSet rs,Statement stat,Connectionconn)throws SQLException{if(rs!=null){rs.close();}if(stat!=null){stat.close();} //看Connection來?哪?, 如果Connection是從連接池??獲得的, close()?法其實(shí)是歸還;如果Connection是創(chuàng)建的,就是銷毀if(conn!=null){conn.close();}}}
  • 使用JDBC工具類 完成查詢
  • @Test public void testJDBC6() throws SQLException { /** * 使?JDBC?具類, 完成查詢所有分類 * 1.通過JDBC?具類, 獲得連接 * 2.獲得執(zhí)?sql語句的對(duì)象 * 3.執(zhí)?sql語句, 并返回結(jié)果 * 4.處理結(jié)果 * 5.釋放資源 */ Connection conn = JDBCUtils2.getConnection(); Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery("select * from category"); while (rs.next()) { int cid = rs.getInt("cid"); String cname = rs.getString("cname"); System.out.println("cid = " + cid + ",cname = " + cname); } JDBCUtils2.close(rs, stat, conn); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的原生JDBC和工具类的基本实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。