您好,登錄后才能下訂單哦!
小編給大家分享一下Java基礎之JDBC連接數據庫與基本操作的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Java主要應用于:1. web開發;2. Android開發;3. 客戶端開發;4. 網頁開發;5. 企業級應用開發;6. Java大數據開發;7.游戲開發等。
JDBC全稱Java Database Connectivity,它是一個獨立于特定數據庫管理系統、通用的SQL數據庫存取和操作的公共接口,定義了用來訪問數據庫的標準Java類庫,使用這個類庫可以以一種標準的方法、方便地訪問數據庫資源
通俗的來說,JDBC就是讓我們通過Java來連接任何提供了JDBC驅動程序的數據庫系統,比如我有一個SQLServer數據和一個Mysql數據庫,我可以通過Java的JDBC來完成前面學習SQL中的所有操作,而無需在命令行來分別連接它們兩個,就像這樣
我來總結一下JDBC操作數據庫與表的步驟,然后詳細來介紹它們
1.注冊驅動 (只做一次)
2.建立連接(Connection)
3.創建執行SQL的語句(Statement)
4.執行語句
5.處理執行結果(ResultSet)
6.釋放資源
看到這里是不是很熟悉,沒錯,就跟我們前面學習Mysql一樣,首先我來介紹一下JDBC的結構與數據庫的連接
JDBC體系結構由下面兩部分組成:
面向應用的API:Java API,抽象接口,供應用程序開發人員使用(連接數據庫,執行SQL語句,獲得結果)。
面向數據庫的API:Java Driver API,供開發商開發數據庫驅動程序使用
JDBC API
JDBC API 是一系列的接口,它使得應用程序能夠進行數據庫聯接,執行SQL語句,并且得到返回結果
Driver接口
java.sql.Driver 接口是所有 JDBC 驅動程序需要實現的接口。這個接口是提供給數據庫廠商使用的,不同數據庫廠商提供不同的實現
在程序中不需要直接去訪問實現了 Driver 接口的類,而是由驅動程序管理器類(java.sql.DriverManager)去調用這些Driver實現
Oracle的驅動:oracle.jdbc.driver.OracleDriver
mySql的驅動: com.mysql.jdbc.Driver
加載與注冊JDBC驅動
前面我們說了,JDBC就是通過一個接口和不同數據庫提供了JDBC的驅動來完成數據的操作,因此,我們將驅動加載到JDBC中,加載驅動有兩種方式:
方式一:加載 JDBC 驅動需調用 Class 類的靜態方法 forName(),向其傳遞要加載的 JDBC 驅動的類名
Class.forName(“com.mysql.jdbc.Driver”);
方式二:DriverManager 類是驅動程序管理器類,負責管理驅動程序
DriverManager.registerDriver(com.mysql.jdbc.Driver);
通常不用顯式調用 DriverManager 類的 registerDriver() 方法來注冊驅動程序類的實例,因為 Driver 接口的驅動程序類都包含了靜態代碼塊,在這個靜態代碼塊中,會調用 DriverManager.registerDriver() 方法來注冊自身的一個實例
當我們注冊并加載驅動后,就可以連接數據庫了,方法和前面我們學習Mysql一樣,首先需要輸入賬號,密碼等信息
在JDBC中,我們需要調用DriverManager 類的 getConnection() 方法建立到數據庫的連接
user,password可以用“屬性名=屬性值”方式告訴數據庫;
在JDBC中連接數據庫需要一個特殊的屬性,JDBC URL,它用于連接我們需要操作的數據庫
JDBC URL的標準由三部分組成,各部分間用冒號分隔。
jdbc:子協議:子名稱 協議:JDBC URL中的協議總是jdbc 子協議:子協議用于標識一個數據庫驅動程序 子名稱:一種標識數據庫的方法。子名稱可以依不同的子協議而變化,用子名稱的目的是為了定位數據庫提供足夠的信息。包含主機名(對應服務端的ip地址),端口號,數據庫名
下面我來列舉幾個常見的JDBC URL,大家使用的時候直接復制就好
// 對于 Oracle 數據庫連接,采用如下形式: jdbc:oracle:thin:@localhost:1521:DatabaseName // 對于 SQLServer 數據庫連接,采用如下形式: jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid // 對于 MYSQL 數據庫連接,采用如下形式: jdbc:mysql://localhost:3306/DatabaseName // 插入中文的時候,這個url要寫成這個 jdbc:mysql://localhost:3306/數據庫名稱?useUnicode=true&characterEncoding=UTF-8
小伙伴們注意一下,當我們使用Java向數據庫中插入一個數據時,如果是中文,首先數據庫和表的編碼是utf8,其次就是我們要在URL中聲明一下編碼是UTF-8,不然插入數據是?
,如果你們遇到這個問題,那就忽略它
好了,下面是連接數據庫的示例代碼,這里我操作的是Mysql數據庫
package com.company; // 導入依賴包 import org.junit.Test; import java.io.FileInputStream; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class Demo1 { /* *獲取connect的三種方式 * */ public static void main(String[] args) { System.out.println("JDBC Test..."); } // 使用Driver來實現數據庫連接 @Test public void test1() throws SQLException { // Driver driver=new com.mysql.jdbc.Driver(); Properties p1 = new Properties(); p1.setProperty("user", "root"); p1.setProperty("password", "mysql123"); Connection connect = driver.connect("jdbc:mysql://localhost:3306/myemployees", p1); System.out.println("connect = " + connect); } // 使用DriverManager來實現數據庫連接 @Test public void test2() throws SQLException { com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver(); Properties p1 = new Properties(); p1.setProperty("user", "root"); p1.setProperty("password", "mysql123"); DriverManager.registerDriver(driver); Connection connection = DriverManager.getConnection ("jdbc:mysql://localhost:3306/myemployees", p1); System.out.println("connection = " + connection); } // 將賬號密碼抽出到配置文件中,并使用IO流讀取配置文件的方式連接數據庫 @Test public void test3() throws Exception { Properties p = new Properties(); FileInputStream fis = new FileInputStream("p.properties"); p.load(fis); fis.close(); Class.forName(p.getProperty("driverClass")); Connection connection = DriverManager.getConnection(p.getProperty("url"), p.getProperty("user"), p.getProperty("password")); System.out.println("connection = " + connection); } }
properties文件內容
url=jdbc:mysql://localhost:3306/myemployees user=root password=mysql123 driverClass=com.mysql.jdbc.Driver
介紹完注冊驅動與數據庫的連接,接下來就是操作SQL了,在JDBC中,操作SQL需要使用Connection 對象的 preparedStatement() 方法獲取 PreparedStatement 對象
PreparedStatement 接口是 Statement 的子接口,它表示一條預編譯過的 SQL 語句
PreparedStatement 對象所代表的 SQL 語句中的參數用問號(?)來表示,調用 PreparedStatement 對象的 setXxx() 方法來設置這些參數. setXxx() 方法有兩個參數,第一個參數是要設置的 SQL 語句中的參數的索引(從 1 開始),第二個是設置的 SQL 語句中的參數的值
在操作SQL前還要說明一下數據類型,我們知道SQL與Java的數據類型命名是不一樣的,所以我們在編碼時要注意
java類型 | SQL類型 |
boolean | BIT |
byte | TINYINT |
short | SMALLINT |
int | INTEGER |
long | BIGINT |
String | CHAR,VARCHAR,LONGVARCHAR |
byte array | BINARY , VAR BINARY |
java.sql.Date | DATE |
java.sql.Time | TIME |
java.sql.Timestamp | TIMESTAMP |
使用PreparedStatementSQL的操作步驟
1.調用連接對象的prepareStatement方法,創建PreparedStatement對象
2.完成預編譯的SQL語句
3.對SQL語句中的占位符進行賦值
4.提交SQL語句
5.釋放資源
接下來就是操作SQL增刪改查的示例代碼(為了方便操作,我將數據庫連接抽出到了JDBCUtils類中)
// 使用PreparedStatement來完成數據的增刪改查操作 package com.company.jdbc; import org.junit.Test; import java.io.FileInputStream; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; /* 對數據庫進行增,刪,改,查的操作 */ public class CRUDDemo { /* 添加一條數據 CREATE TABLE student( sid INT, sname VARCHAR(20), sage INT ) */ @Test public void test() throws SQLException { //1.獲取數據庫連接對象 Connection connection = JDBCUtils.getConnection(); //2.預編譯 // ? : 占位符(只能是設置數據的地方可以寫成占位符) String sql = "insert into student(sid,sname,sage) values(?,?,?)"; PreparedStatement ps = connection.prepareStatement(sql); //3.給占位符賦值 /* setInt(int parameterIndex, int x) parameterIndex : 參數索引(第幾個占位符) x : 數據 */ ps.setInt(1,100); //數據設置成中文可不可以取決于表的編碼集 ps.setString(2,"longge"); ps.setInt(3,20); //4.執行sql //返回值 : 有幾條數據受到影響 int result = ps.executeUpdate();//增,刪,改的語句使用該方法 System.out.println("有"+result+"條數據受到影響"); //5.關資源 JDBCUtils.close(ps,connection); } /* 改 */ @Test public void test2() throws SQLException { //1.獲取數據庫連接對象 Connection connection = JDBCUtils.getConnection(); //2.預編譯 String sql = "update student set sid=? where sid=?"; PreparedStatement ps = connection.prepareStatement(sql); //3.給占位符賦值 ps.setInt(1,10); ps.setInt(2,100); //4.執行sql語句 int result = ps.executeUpdate(); System.out.println("有"+result+"條數據受到影響"); //5.關閉資源 JDBCUtils.close(ps,connection); } /* 刪除數據 */ @Test public void test3() throws SQLException { //1.獲取數據庫連接對象 Connection connection = JDBCUtils.getConnection(); //2.預編譯 String sql = "delete from student where sid=?"; PreparedStatement ps = connection.prepareStatement(sql); //3.給占位符賦值 ps.setInt(1,10); //4.執行sql語句 int i = ps.executeUpdate(); System.out.println("有"+i+"條數據受到影響"); //5.關閉資源 JDBCUtils.close(ps,connection); } /* 查詢數據 */ @Test public void test4() throws Exception { List<Student> students = getStudent(); for (Student s : students) { System.out.println(s); } } public List<Student> getStudent() throws Exception { //1.獲取數據庫連接對象 Connection connection = JDBCUtils.getConnection(); //2.預編譯 PreparedStatement ps = connection.prepareStatement("select sid,sname,sage from student"); //3.執行sql語句 ResultSet resultSet = ps.executeQuery();//查詢語必須執行此方法 List<Student> list = new ArrayList<>(); //4.遍歷ResultSet while(resultSet.next()){//是否有數據 /* getInt(String columnLabel) :根據字段名獲取對應的數據 getInt(int columnIndex) : 根據列的索引獲取對應的數據 */ int sid = resultSet.getInt("sid"); String sname = resultSet.getString("sname"); int sage = resultSet.getInt("sage"); //System.out.println(sid + " " + sname + " " + sage); list.add(new Student(sid,sname,sage)); } //5.關閉資源 JDBCUtils.close(ps,connection,resultSet); return list; } }
JDBCUtils連接數據庫的工具類
//JDBCUtils類,專門實現數據庫的連接與資源釋放操作 package com.company.jdbc; import java.io.FileInputStream; import java.io.IOException; import java.sql.*; import java.util.Properties; public class JDBCUtils { private static String driverClass; private static String url; private static String username; private static String password; static{ FileInputStream fis = null; try { //1.獲取數據庫連接對象 //通過Properties讀取內容 //1.創建Properties對象 Properties p = new Properties(); //2.加載流 fis = new FileInputStream("jdbc.properties"); p.load(fis); driverClass = p.getProperty("driverClass"); url = p.getProperty("url"); username = p.getProperty("username"); password = p.getProperty("password"); }catch (Exception e){ //終止程序的運行 e.printStackTrace(); //將編譯時異常轉換成運行時異常 throw new RuntimeException("xxxxxxxx"); }finally { if (fis != null){ //3.關資源 try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } /* 獲取連接對象 */ public static Connection getConnection(){ try { Class.forName(driverClass); //獲取數據庫連接對象 Connection connection = DriverManager.getConnection(url, username, password); return connection; }catch (Exception e){ e.printStackTrace(); throw new RuntimeException("獲取連接失敗"); } } /* 關閉資源 */ public static void close(PreparedStatement ps, Connection connection) { if (ps != null){ try { ps.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (connection != null){ try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } public static void close(PreparedStatement ps, Connection connection, ResultSet resultSet) { close(ps,connection); if (resultSet != null){ try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
在前面對數據的增刪改查操作中,查詢操作比較復雜一些,因為我們要接收數據庫返回的結果,因此我們要了解一下ResultSet 接口,它由數據庫廠商實現
查詢需要調用Prepared Statement 的 executeQuery() 方法,查詢結果是一個 ResultSet 對象
ResultSet 對象維護了一個指向當前數據行的游標,初始的時候,游標在第一行之前,可以通過 ResultSet 對象的 next() 方法移動到下一行,具體方法可以自定百度
ResultSet:代表結果集,其封裝了使用 JDBC 進行查詢的結果. 調用 PreparedStatement 對象的 executeQuery() 可以得到結果集.ResultSet 返回的實際上就是一張數據表. 有一個指針指向數據表的第一條記錄的前面
以上是“Java基礎之JDBC連接數據庫與基本操作的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。