當前位置:網站首頁>JDBC的學習以及簡單封裝
JDBC的學習以及簡單封裝
2022-07-23 11:08:15【紫青寶劍】
JDBC學習
1.介紹
1.1 概念
jdbc:Java DataBase Connectivityjava,數據庫連接,Java語言操作數據庫;
1.2 本質
JDBC本質是由(SUN公司)定義的一套操作所有關系型數據庫的規則,各個數據庫廠商去實現這套接口,提供驅動jar包。我們可以使用這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類;
1.3 快速入門
步驟
- 1.導入驅動
jar包- 創建目錄libs將包
mysql-connector-java-5.1.37.jar導入;使用後修改jar包的版本為8.0.17,與本機數據庫的版本相互對應 - addlibary
- 創建目錄libs將包
- 2.注册驅動
jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC;根據版本的不同選擇是否寫?serverTimezone=UTC
- 3.獲取數據庫連接對象
Connection - 4.定義SQL語句
- 5.獲取執行語句的對象
Statement - 6.執行SQL,接收返回結果
- 7.處理結果
- 8.釋放資源
- 1.導入驅動
代碼示例
package cn.sql.one; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JabcDemo { public static void main(String[] args) throws Exception{ //1.jar包放入對應的libs文件夾,Mysql版本對應的不同的jar包 //2.注册驅動;使用反射,將字節碼文件加載進內存 Class.forName("com.mysql.jdbc.Driver");//需要拋出异常,在主方法頭部進行拋出 //3.獲取數據庫連接對象;數據庫連接引擎:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567"); //4.定義sql語句,修改語句 String sql="update t1 set username='章北海' where id=1"; //5.獲取執行sql的對象Statement Statement stmt = conn.createStatement(); //6.執行sql int conut=stmt.executeUpdate(sql); //7.處理結果 System.out.println(conut); //8.釋放資源 stmt.close(); conn.close(); } }
2.基本使用
2.1詳解各個對象
1.DriverManager(驅動管理對象)
1.注册驅動
通過靜態代碼塊進行的注册
Class.forName("com.sql.Driver")
2.獲取數據庫連接
jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC- url,指定連接路徑
- test:數據庫名
- 如果連接的是本機mysql服務器且mysql服務默認端口是3306,則url可以簡寫為
jdbc:mysql:///數據庫名稱 - user:用戶名
- password:密碼
2.Connection
數據庫連接對象
1.獲取執行sql的對象
- Statement
- PreparedStatement(參數化)
2.管理事務
- 開啟事務 : setAutoCommit(boolean autoCommit),調用該方法設置參數為
false,即開啟事務; - 提交事務:commit()
- 回滾事務:rollback()
- 開啟事務 : setAutoCommit(boolean autoCommit),調用該方法設置參數為
3.Statement
執行sql的對象
執行靜態sql語句,返回結果對象
1. boolean execute(sql)
- 執行任意sql,返回布爾值
2. int executeUpdate(sql)
- 執行**DML(增、删、改)**語句;**DDL(錶和庫的增、删、改)**語句,DDL一般不在程序中使用。
- 返回值
INT類型,返回受影響的行數。通常可以根據返回值是否大於0,檢查DML語句是否運行成功;
3.ResultSet executeQuery(String sql)
- 執行**DQL(select)**語句;
4.ResultSet
結果集對象,封裝查詢結果
next()方法
- 遊標向下獲取一行,返回布爾值;
- 當到最後一行則返回False;
getXXX():獲取數據
- 如getInt()方法
- 參數
- getString(“username”),參數傳入列名;
使用方式
- 遊標向下移動一行
- 判斷是否有數據
- 獲取數據
5.PreparedStatement
- 繼承於(Statement),主要用與格式化SQL語句執行,動態,可能還具備防守SQL注入的操作;
package cn.sql.one;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.PreparedStatement;
public class TestPstmt {
public static void main(String[] args) throws Exception {
//1.jar包放入對應的libs文件夾,Mysql版本對應的不同的jar包
//2.注册驅動;使用反射,將字節碼文件加載進內存
Class.forName("com.mysql.jdbc.Driver");//需要拋出异常,在主方法頭部進行拋出
//3.獲取數據庫連接對象;數據庫連接引擎:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
//4.定義sql語句,修改語句
String sql="update t1 set username=? where id=?";
//5.獲取執行sql的對象Statement
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"章北海");
pstmt.setString(2,"1");
//6.執行sql,此時不需要在傳入對應的sql
int conut=pstmt.executeUpdate();
//7.處理結果
System.out.println(conut);
//8.釋放資源
pstmt.close();
conn.close();
}
}
2.2 添加語句
package cn.sql.one;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcDemo2 {
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;//方便在finally進行管比的操作;
try{
//1.
Class.forName("com.mysql.jdbc.Driver");
String sql="insert into t1(username,age)values('程心',30)";
conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
stmt=conn.createStatement();
int count=stmt.executeUpdate(sql);
System.out.println(count);//接收返回結果
if(count>0){
System.out.println("添加成功");
}else {
System.out.println("添加失敗");
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch ( SQLException e){
e.printStackTrace();
}finally {
//釋放資源之前先檢查對象是否為引用數據類型的默認類型;
if(stmt !=null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn !=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
增加為此程序,如果要使用UPDATE或者是insert,delete語句程序同上,但是需要把SQL語句改為對應的SQL語句;
2.3 查詢語句
package cn.sql.one;
import java.sql.*;
public class JdbcQuery {
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
Class.forName("com.mysql.jdbc.Driver");
String sql="select * from t1";
conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
stmt=conn.createStatement();
//執行查詢語句
rs=stmt.executeQuery(sql);
//處理查詢結果,使用next判斷是否為最後一行
while (rs.next()){
String name=rs.getString("username");
int age= rs.getInt("age");
System.out.println(name+"========"+age);
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch ( SQLException e){
e.printStackTrace();
}finally {
if(rs !=null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(stmt !=null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn !=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
2.4 查詢結合集合存儲對象
package cn.sql.demo;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JdbcDemoMain {
public static void main(String[] args) {
List<Person> list=new JdbcDemoMain().show();
System.out.println(list);
}
public List<Person> show(){
//將需要用到的對象資源定義在外面,引用數據類型的默認值都是null;
Connection conn=null;//數據庫連接對象
Statement stmt =null;//執行sql語句的對象
ResultSet rs=null;//查詢結果集的操作
List<Person> list=null;//存儲結果的集合,沒有數據則直接返回null;
try {
//1.加載數據庫的驅動進入內存
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對象
conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
//3.定義sql語句
String sqlstr="select * from t1";
//4.獲取執行sql語句的對象
stmt=conn.createStatement();
//5.執行sql語句
rs=stmt.executeQuery(sqlstr);
Person per =new Person();
list =new ArrayList<>();
while (rs.next()){
int id = rs.getInt("id");
String username=rs.getString("username");
int age=rs.getInt("age");
per.setId(id);
per.setUsername(username);
per.setAge(age);
list.add(per);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}finally {
//釋放資源,注意順序;
if(rs!=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
}
2.5 控制事務
package cn.sql.demo;
import cn.sql.utils.DButils;
import java.sql.Connection;
import java.sql.SQLException;
//實現事務的控制
public class Affairs {
public static void main(String[] args) {
DButils db= new DButils();
Connection conn=db.getConn();
try {
// conn.setAutoCommit(false);//設置為False,自動開啟事務
String sqlstr1="update t1 set username='東方' where id=1";
String sqlstr2="update t1 set username='章北海' where id=2";
PreparedStatement pstmt1=conn.prepareStatement(sqlstr1);
PreparedStatement pstmt2=conn.prepareStatement(sqlstr2);
pstmt1.executeUpdate();
int r=3/0;
pstmt2.executeUpdate();
} catch (Exception throwables) {
throwables.printStackTrace();
}finally {
db.close();
}
}
}
制造异常,第一句執行成功但是第二句沒有執行成功,不符合事務的特性;下面開啟事務。
package cn.sql.demo;
import cn.sql.utils.DButils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//實現事務的控制
public class Affairs {
public static void main(String[] args) {
DButils db= new DButils();
Connection conn=db.getConn();
try {
conn.setAutoCommit(false);//設置為False,自動開啟事務
String sqlstr1="update t1 set username='東方' where id=1";
String sqlstr2="update t1 set username='章北海' where id=2";
PreparedStatement pstmt1=conn.prepareStatement(sqlstr1);
PreparedStatement pstmt2=conn.prepareStatement(sqlstr2);
pstmt1.executeUpdate();
int r=3/0;//删除掉此句即可成功執行事務;
pstmt2.executeUpdate();
conn.commit();//提交事務
} catch (SQLException throwables) {
try {
conn.rollback();//進行事務的回滾
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
db.close();
}
}
}
3.封裝使用
3.1 簡單封裝(工具類)
package cn.sql.utils;
import java.sql.*;
/*實現將操作類進行封裝*/
public class DButils {
private String user="root";
private String password="1234567";
private String database="test";
private String port="3306";
private String ipaddres="127.0.0.1";
private Connection conn=null;
private Statement statm=null;
private ResultSet rs=null;
private String sqlconnstr="";
private int res;
private PreparedStatement pstatm=null;
public DButils(){
//使用無參構造方法,直接使用默認變量的默認值構造數據庫連接字符串;
sqlconnstr="jdbc:mysql://"+ipaddres+":"+port+"/"+database+"?serverTimezone=UTC";//注:?號後面的數據根據情况删除或保留
}
//地址端口數據庫不同使用 此構造方法
public DButils(String database, String port, String ipaddres) {
this.database = database;
this.port = port;
this.ipaddres = ipaddres;
sqlconnstr="jdbc:mysql://"+this.ipaddres+":"+this.port+"/"+this.database+"?serverTimezone=UTC";//注:?號後面的數據根據情况删除或保留
}
//只有數據庫不同的時候使用此構造方法
public DButils(String database) {
this.database = database;
sqlconnstr="jdbc:mysql://"+ipaddres+":"+port+"/"+this.database+"?serverTimezone=UTC";//注:?號後面的數據根據情况删除或保留
}
//使用不同地址,不同數據庫的方法
public DButils(String ipaddres,String database){
this.database=database;
this.ipaddres=ipaddres;
sqlconnstr="jdbc:mysql://"+this.ipaddres+":"+port+"/"+this.database+"?serverTimezone=UTC";//注:?號後面的數據根據情况删除或保留
}
//獲取連接對象
public Connection getConn(){
try {
//1.使用反射將字節碼文件寫入內存
Class .forName("com.mysql.jdbc.Driver");
//2.獲取連接對象
conn= DriverManager.getConnection(sqlconnstr,user,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
return conn;
}
public void close(){
if(rs!= null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(statm!= null){
try {
statm.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!= null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//獲取Statement的對象
public Statement getStatm(){
conn=getConn();
try {
statm=conn.createStatement();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return statm;
}
//執行查詢語句,獲取查詢結果的返回值
public ResultSet executQuery(String sqlstr){
statm=getStatm();
try {
rs=statm.executeQuery(sqlstr);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return rs;
}
//執行增删改語句
public int executUpdate(String sqlstr){
statm=getStatm();
try {
res=statm.executeUpdate(sqlstr);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return res;
}
public PreparedStatement getPstatm(String sql){
conn=getConn();
try {
pstatm=conn.prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return pstatm;//此時返回的對象可以自行使用設置參數方法;
}
}
簡單測試
package cn.sql.demo; import cn.sql.utils.DButils; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestDButils { public static void main(String[] args) throws SQLException { DButils db= new DButils("testlearn"); String sqlstr="INSERT into student(sname,gender,class_id)VALUES('東方延續','女',3)"; int res=db.executUpdate(sqlstr); System.out.println(String.format("數據庫成功插入了%s條數據",res )); String sqlstr2="select * from student"; ResultSet rs=db.executQuery(sqlstr2); while (rs.next()){ System.out.println(rs.getInt("sid")); System.out.println(rs.getString("sname")); System.out.println(rs.getString("gender")); } db.close(); PreparedStatement pstatm= db.getPstatm(sqlstr); pstatm.executeUpdate(); db.close(); } }執行成功!
手敲不易,轉載請注明出處;
版權聲明
本文為[紫青寶劍]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/204/202207230537160922.html
邊欄推薦
猜你喜歡
隨機推薦
- 【STM32學習】(21)STM32實現步進電機
- 繪制帶有查詢條件變量的table【grafana】
- 認識接口
- LABVIEW:創建一個VI
- 界面開發框架DevExtreme Gantt控件——可導出PDF、排序任務
- MySQL命令行導出導入數據庫和數據錶
- 有數大數據基礎平臺之智能運維平臺EasyEagle介紹:集群隊列篇
- 你記住JS中offsetWidth、clientWidth、width、scrollWidth、clientX、screenX、offsetX、pageX嗎?
- 【Azure 事件中心】Azure Event Hub 新功能嘗試 -- 异地灾難恢複 (Geo-Disaster Recovery)
- unity 照片牆
- 影響持續交付的因素有哪些?
- 【快速上手教程7】瘋殼·開源編隊無人機-地面站上比特機的使用和介紹
- Redis配置詳解
- docker安裝MySQL、redis
- 【嵌入式】限幅電路和鉗比特電路 利用二極管的單向導電性
- [知識圖譜]cql與py2neo學習筆記
- C語言學習
- 列轉行與數據集連接在業務場景的組合應用
- MySQL5.6/ 5.7 SSL配置
- 【深度學習】損失函數(平均絕對誤差,均方誤差,平滑損失,交叉熵,帶權值的交叉熵,骰子損失,FocalLoss)
- *精度優化*優化策略1:網絡+SAM優化器
- AXI協議詳解
- js--Date對象&三元錶達式
- leetcode-買賣股票的最佳時機含手續費
- unity中3dUI或者模型始終面向攝像機,跟隨攝像機視角旋轉丨視角跟隨丨固定視角
- JVM初探
- 移動端測試之appium環境部署【未完待續】
- 關於後臺掛載,進程管理的學習
- 讀《高效閱讀法-最劃算的自我投資》有感
- shell基本命令
- 從鍵盤輸入一串字符,輸出不同的字符以及每個字符出現的次數。(輸出不按照順序)運用String類的常用方法解題
- 2019_AAAI_ICCN
- 影響接口查詢速度的情况
- 《STL適配器》stack和queue
- 淺析緩存的讀寫策略
- 類和對象(1)
- 實驗二 YUV
- 大咖訪談 | 開源社區裏各種奇怪的現狀——夜天之書陳梓立tison
- synchronized是如何實現的
- 【arXiv2022】GroupTransNet: Group Transformer Network for RGB-D Salient Object Detection