Java-MySql:JDBC

目錄

JDBC概述

JDBC搭建

1、導入mysql開發商提供的jar包

2、注冊驅動

3、與數據庫連接

注解:?

Statement:

代碼?

運行

PreparedStatement:

代碼

運行?

PreparedStatement和Statement?

Statement?

代碼

運行

代碼

運行

代碼

運行

PreparedStatement?

代碼

運行

代碼

運行

代碼

運行

PreparedStatement和Statement 區別

結果集處理

代碼

運行

代碼

運行

?編輯代碼

運行


JDBC概述

jdbc(Java DataBase Connectivity)java語言連接數據庫
本模塊中,java提供了一組用來連接數據庫的類和接口
java語言開發者,本身沒有提供如何具體連接數據庫的功能,只是定義了一組java程序連接數據庫的訪問接口。

1、連接到數據庫

2、向數據庫發送增刪改這一類的sql

3、發送查詢sql

java語言只需要定義連接數據庫的接口,具體的實現交給了不同的數據庫開發商

java只需要定義一套接口,就可以連接不同的接口

JDBC搭建

1、導入mysql開發商提供的jar包

2、注冊驅動

兩種方式:

1、反射方式加載驅動類
? ? ? Class.forName("com.mysql.cj.jdbc.Driver");

2 、DriverManager.registerDriver(new Driver());

3、與數據庫連接

獲得Satement執行sql語句

發送sql語句

關閉與數據庫的連接

注解:?

url:?jdbc:mysql://127.0.0.1:3306:(端口(3306))

? ? ? /schooldb(數據庫名)

? ? ? ?serverTimezone=Asia/Shanghai"?

user:用戶名(root)

password:密碼

Statement:

代碼?

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//2、注冊驅動 DriverManager.registerDriver(new Driver());//3、建立與數據庫的連接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);//com.mysql.cj.jdbc.ConnectionImpl@25359ed8//發送sqlStatement statement = connection.createStatement();System.out.println(statement);//com.mysql.cj.jdbc.StatementImpl@6166e06fstatement.executeUpdate("insert into major(name)value ('數學')");//關閉與數據庫的連接statement.close();connection.close();}
}

運行

PreparedStatement:

代碼

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo3 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//2、注冊驅動//反射方式加載驅動類//Class.forName("com.mysql.cj.jdbc.Driver");DriverManager.registerDriver(new Driver());//3、建立與數據庫的連接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";Connection connection = DriverManager.getConnection(url, user, password);//發送sql//? 占位符 表示要插入一個參數PreparedStatement ps = connection.prepareStatement("insert into major(name)value (?)");//1向第一個占位符的位置插入數據ps.setObject(1, "智能");ps.executeUpdate();//關閉與數據庫的連接ps.close();connection.close();}
}

運行?

PreparedStatement和Statement?

Statement?

代碼
 package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {Demo2.insert("元神啟","動", "2018-8-23", "12345678910", 1.4);}public static void insert(String name,String gender,String birthday,String phone,double height) throws SQLException {//注冊驅動DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";//建立與數據庫的連接Connection connection = DriverManager.getConnection(url, user, password);//發送sqlStatement statement = connection.createStatement();statement.executeUpdate("insert into student(name,gender,birthday,phone,height)value('"+name+"','"+gender+"','"+birthday+"','"+phone+"',"+height+")");//關閉與數據庫的連接statement.close();connection.close();}
}
運行

代碼
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {Demo2.delete(6);}public static void delete(int number) throws SQLException {//注冊驅動DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";//建立與數據庫的連接Connection connection = DriverManager.getConnection(url, user, password);//發送sqlStatement statement = connection.createStatement();//直接將字符串拼接到sql中,不能防止sql注入攻擊"or 1=1"statement.executeUpdate("delete from student where number = "+number);//關閉與數據庫的連接statement.close();connection.close();}
}
運行

代碼
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {Demo2.update(3,"愛麗西婭","女", "2024-4-14", "123456789", 1.72);}public static void update(int number,String name,String gender,String birthday,String phone,double height) throws SQLException {//注冊驅動DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";//建立與數據庫的連接Connection connection = DriverManager.getConnection(url, user, password);//發送sqlStatement statement = connection.createStatement();statement.executeUpdate("update student set name='"+name+"',gender='"+gender+"',birthday='"+birthday+"',phone='"+phone+"',height="+height+" where number ="+number);//關閉與數據庫的連接statement.close();connection.close();}
}
運行

PreparedStatement?

代碼
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo4 {public static void main(String[] args) throws SQLException {Demo4.insert("小姨","鶴", "2018-8-23", "123456789", 1.4);}public static void insert(String name,String gender,String birthday,String phone,double height) throws SQLException {//注冊驅動DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";//建立與數據庫的連接Connection connection = DriverManager.getConnection(url, user, password);//發送sqlPreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,phone,height)value(?,?,?,?,?)");ps.setObject(1,name);ps.setObject(2,gender);ps.setObject(3,birthday);ps.setObject(4,phone);ps.setObject(5,height);ps.executeUpdate();//關閉與數據庫的連接ps.close();connection.close();}
}
運行

代碼
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo4 {public static void main(String[] args) throws SQLException {Demo4.delete(15);}public static void delete(int number) throws SQLException {//注冊驅動DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";//建立與數據庫的連接Connection connection = DriverManager.getConnection(url, user, password);//發送sql//封裝sqlPreparedStatement ps = connection.prepareStatement("delete from student where number = ?");//向sql中傳參 傳參時會進行驗證,防止sql注入攻擊,更安全ps.setObject(1, number);ps.executeUpdate();//關閉與數據庫的連接ps.close();connection.close();}
}
運行

代碼
package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo4 {public static void main(String[] args) throws SQLException {Demo4.update(3,"申鶴","女", "2024-4-14", "12345678910", 1.72);}public static void update(int number,String name,String gender,String birthday,String phone,double height) throws SQLException {//注冊驅動DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";//個人數據庫密碼String password = "root";//建立與數據庫的連接Connection connection = DriverManager.getConnection(url, user, password);//發送sqlPreparedStatement ps = connection.prepareStatement("update student set name=?,gender=?,birthday=?,phone=?,height=? where number =?");ps.setObject(1, name);ps.setObject(2, gender);ps.setObject(3, birthday);ps.setObject(4, phone);ps.setObject(5, height);ps.setObject(6, number);ps.executeUpdate();//關閉與數據庫的連接ps.close();connection.close();}
}
運行

PreparedStatement和Statement 區別

1、代碼的可讀性和可維護性. 雖然用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無 論從可讀性還是可維護性上來說.都比直接用Statement的代碼高很多檔次。

2、最重要的一點是極大地提高了安全性.

? ? ?防止sql注入  

? ? ?Stringsql= “ delete from user where id = ”+num;   

? ? ?如果我們把[or 1=1]作為id傳入進來?   

? ? ?delete from tb_name where id = 1 or 1 = 1;   

因為‘1’ = ‘1’肯定成立   

而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹 配的關系.

預編譯模式中每個占位符處,只能插入一個值,而會過濾其他語句。

結果集處理

PreparedStatement和Statement中的executeQuery()方法中會返回一 個ResultSet對象,查詢結果就封裝在此對象中.

使用ResultSet中的next()方法獲得下一行數據

使用getXXX(String name)方法獲得值

package com.ffyc.jdbcpro;import java.util.Date;public class Student {private int number;private String name;private String gender;private Date birthday;private String phone;private double height;private Date ref_time;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public Date getRef_time() {return ref_time;}public void setRef_time(Date ref_time) {this.ref_time = ref_time;}@Overridepublic String toString() {return "Student{" +"number=" + number +", name='" + name + '\'' +", gender='" + gender + '\'' +", birthday=" + birthday +", phone='" + phone + '\'' +", height=" + height +", ref_time=" + ref_time +'}';}
}

代碼

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo5 {public static void main(String[] args) throws SQLException {Student student = Demo5.findStudentByNumber(16);System.out.println(student);}public static Student findStudentByNumber(int number) throws SQLException {DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement ps = connection.prepareStatement("select number,name,gender,birthday,height,phone,reg_time from student where number = ?");ps.setObject(1, number);//執行查詢后,mysql將數據封裝到一個ResultSet對象中ResultSet rs = ps.executeQuery();System.out.println(rs);//com.mysql.cj.jdbc.result.ResultSetImpl@64d2d351//將ResultSet中的數據包裝到自己的對象中,這樣用起來更加方便//結果集中有沒有數據 如果有返回true,否則返回falseStudent stu = new Student();while (rs.next()){stu.setNumber(rs.getInt("number"));stu.setName(rs.getString("name"));stu.setGender(rs.getString("gender"));stu.setBirthday(rs.getDate("birthday"));stu.setHeight(rs.getDouble("height"));stu.setPhone(rs.getString("phone"));stu.setRef_time(rs.getTimestamp("reg_time"));}return stu;}
}

運行

代碼

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;
import java.util.ArrayList;public class Demo6 {public static void main(String[] args) throws SQLException {ArrayList<Student> students = findStudent();System.out.println(students);}public static ArrayList<Student> findStudent() throws SQLException {DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement ps = connection.prepareStatement("select number,name,gender,birthday,height,phone,reg_time from student");ResultSet rs = ps.executeQuery();//創建一個集合對象用來封裝多個學生對象ArrayList<Student> students = new ArrayList<>();while (rs.next()){//每循環一次,創建一個學生對象Student stu = new Student();stu.setNumber(rs.getInt("number"));stu.setName(rs.getString("name"));stu.setGender(rs.getString("gender"));stu.setBirthday(rs.getDate("birthday"));stu.setHeight(rs.getDouble("height"));stu.setPhone(rs.getString("phone"));stu.setRef_time(rs.getTimestamp("reg_time"));//把當前學生對象返回到集合中students.add(stu);}return students;}
}

運行

代碼

package com.ffyc.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo7 {public static void main(String[] args) throws SQLException {int res = checkNum(16);System.out.println(res);}public static int checkNum(int number) throws SQLException {DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement ps = connection.prepareStatement("select count(*) c from student where number = ?");ps.setObject(1, number);ResultSet resultSet = ps.executeQuery();if(resultSet.next()){return resultSet.getInt("c");}else{return 0;}}
}

運行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15849.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

九、圖形化腳本

多年來&#xff0c; shell腳本一直都被認為是枯燥乏味的。但如果你準備在圖形化環境中運行腳本時&#xff0c;就未必如此了。有很多與腳本用戶交互的方式并不依賴read和echo語句。 9.1 創建文本菜單 創建交互式shell腳本最常用的方法是使用菜單。提供各種選項可以幫助腳本用戶…

AI遇上遙感,未來會怎樣?

隨著航空、航天、近地空間等多個遙感平臺的不斷發展&#xff0c;近年來遙感技術突飛猛進。由此&#xff0c;遙感數據的空間、時間、光譜分辨率不斷提高&#xff0c;數據量也大幅增長&#xff0c;使其越來越具有大數據特征。對于相關研究而言&#xff0c;遙感大數據的出現為其提…

初識GPT

初識GPT GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一種基于Transformer架構的預訓練語言模型&#xff0c;由人工智能研究公司OpenAI開發。GPT模型使用了一種稱為“自回歸”&#xff08;autoregressive&#xff09;的方法來生成文本&#xff0c;這意味…

Oracle執行DELETE語句后,回滾(還原)數據

--第一步&#xff1a;刪除數據 DELETE FROM "EMPLOYEER" WHERE id 123 --第二步&#xff1a;查看數據列表(判斷第一步中數據是否被刪除) SELECT * FROM "EMPLOYEER" AS OF timestamp to_timestamp( 2024-05-22 11:51:00, yyyy-mm-dd hh24:mi:ss ) --第…

基于MetaGPT構建LLM多智能體

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我們用了兩萬多字詳細拆解了單個Agent的組成&#xff0c;并通過Github Trending訂閱智能體理解MetaGPT框架的訂閱模塊如何解決應用問題&#xff0c;但是對于復雜&#xff0c;并行的任務&#xff0c;單…

【vue】el-select選擇器實現寬度自適應

選擇器的寬度根據內容長度進行變化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知識-可變參數、Collections工具類

目錄 可變參數 Collections工具類 Collections的常用靜態方法 實例演示 可變參數 可變參數 就是一種特殊形參&#xff0c;定義在方法、構造器的形參列表里&#xff0c;格式是&#xff1a;數據類型...參數名稱 可變參數的特點和好處 特點&#xff1a;可以不傳數據給它&am…

SQL常用基礎語句(一)-- ABCDE開頭

AS 將列名從 count(*) 修改為 total select count(*) as total from users where status0 將列名 username 改為 uname&#xff0c; password 改為 upwd select username as uname, password as upwd from users BETWEEN AND 說明&#xff1a;BETWEEN 篩選的是 >value1且 &l…

小程序主體變更是通過遷移嗎?是需要2個小程序嗎?

小程序遷移變更主體有什么作用&#xff1f;好多朋友都想做小程序遷移變更主體&#xff0c;但是又不太清楚具體有啥用&#xff0c;今天我就來詳細說說。首先&#xff0c;小程序遷移變更主體最重要的作用就是可以修改主體。比如你的小程序原來是 A 公司的&#xff0c;現在 A 公司…

并發編程筆記8--ThreadLocal結構詳解

ThreadLocal&#xff0c;即線程變量&#xff0c;是一個以ThreadLocal對象為鍵&#xff0c;任意對象為值的存儲結構。這個結構被附帶在線程上&#xff0c;也就是說一個線程可以根據一個ThreadLocal對象查詢到綁定在這個線程上的值。可以通過set(T)方法來設置一個值&#xff0c;在…

標識符的命名規則和規范

標識符概念 Java對各種變量, 方法和類等命名時使用的字符序列稱為標識符凡是自己可以起名字的地方都叫標識符 int num1 90; 標識符的命名規則(必須遵守) 由26個英文字母大小寫, 0-9, _或$組成數字不可以開頭. int 3ab 1;不可以使用關鍵字和保留字, 但能包含關鍵字和保留字…

操作系統實驗四:多線程與信號量編程

操作系統實驗上機 更多技術請訪問&#xff1a;www.xuanworld.top 部分審核不通過的文章將發至個人博客&#xff1a;www.xuanworld.top 歡迎來52破解論壇閱讀帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 實驗名稱實驗序號實驗日期實驗人多線程與信號量…

010-Linux磁盤介紹

文章目錄 1、名詞 2、類型 3、尺寸 4、接口/協議/總線 5、命名 6、分區方式 MBR分區 GPT分區 1、名詞 磁盤是計算機主要的存儲介質&#xff0c;可以存儲大量的二進制數據&#xff0c;并且斷電后也能保持數據不丟失。早期計算機使用的磁盤是軟磁盤&#xff08;Floppy D…

普通測試工程師與測試開發工程師:為何年薪存在15萬與30萬+的差距?

普通測試工程師想要轉型為測試開發工程師&#xff08;簡稱測開&#xff09;&#xff0c;需要學習一系列的知識和技能。以下是一些關鍵的學習領域&#xff1a; 編程能力&#xff1a;測試開發工程師需要具備一定的編程能力&#xff0c;能夠編寫自動化測試腳本和測試工具。因此&a…

基于yolov5和desnet的貓咪識別模型

前言 前段時間給學校的貓咪小程序搭建了識貓模型&#xff0c;可以通過貓咪的照片辨別出是那只貓貓&#xff0c;這里分享下具體的方案&#xff0c;先看效果圖&#xff1a; 源代碼在文末 模型訓練 在訓練服務器&#xff08;或你的個人PC&#xff09;上拉取本倉庫代碼。 圖片數…

[力扣題解] 200. 島嶼數量

題目&#xff1a;200. 島嶼數量 思路 深度優先搜索、廣度優先搜索、并查集&#xff1b; 代碼 廣度優先搜索 class Solution { public:int dir[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};queue<pair<int, int>> que;void bfs(vector<vector<char>&g…

10款免費黑科技軟件,強烈推薦!

1.AI視頻生成——巨日祿 網頁版https://aitools.jurilu.com/ "巨日祿 "是一款功能強大的文本視頻生成器&#xff0c;可以快速將文本內容轉換成極具吸引力的視頻。操作簡單&#xff0c;用戶只需輸入文字&#xff0c;選擇喜歡的樣式和模板&#xff0c; “巨日祿”就會…

Day39貪心算法part06

LC738單調遞增的數字&#xff08;未掌握&#xff09; 思路分析&#xff1a;一旦出現strNum[i - 1] > strNum[i]的情況&#xff08;非單調遞增&#xff09;&#xff0c;首先想讓strNum[i - 1]–&#xff0c;然后strNum[i]給為9字符串是不可變的&#xff0c;不可以使用s.char…

嵌入式交叉編譯:OpenCV

編譯ffmpeg 嵌入式交叉編譯&#xff1a;ffmpeg及相關庫-CSDN博客 下載 LINUX編譯opencv_linux 編譯opencv 模塊-CSDN博客 解壓編譯 penCV自帶編譯配置&#xff0c;十分方便。 BUILD_DIR${HOME}/build_libsCROSS_NAMEaarch64-mix210-linuxFFMPEG_DIR${BUILD_DIR}/libmkdir…

樹莓派學習筆記——樹莓派的三種GPIO編碼方式

1、板載編碼&#xff08;Board pin numbering&#xff09;: 板載編碼是樹莓派上的一種GPIO引腳編號方式&#xff0c;它指的是按照引腳在樹莓派主板上的物理位置來編號。這種方式對于初學者來說可能比較直觀&#xff0c;因為它允許你直接根據引腳在板上的位置來編程。 2、BCM編…