當前位置:網站首頁>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
      • image-20211209113003979
    • 2.注册驅動
      • jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC;根據版本的不同選擇是否寫?serverTimezone=UTC
    • 3.獲取數據庫連接對象Connection
    • 4.定義SQL語句
    • 5.獲取執行語句的對象Statement
    • 6.執行SQL,接收返回結果
    • 7.處理結果
    • 8.釋放資源
  • 代碼示例
    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();
        }
    }
    

    image-20211209153530472

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()
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注入的操作;

image-20211217145012292

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;
    }
}

image-20211209213727952

2.5 控制事務

image-20211217145936897

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();
        }

    }
}

image-20211217154052172

制造异常,第一句執行成功但是第二句沒有執行成功,不符合事務的特性;下面開啟事務。

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();
        }

    }
}

image-20211217155551309

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();
        }
    }
    
    
  • image-20211217161341375

  • 執行成功!

手敲不易,轉載請注明出處;

版權聲明
本文為[紫青寶劍]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/204/202207230537160922.html

隨機推薦