最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中JDBC增刪改查操作詳解

 更新時間:2021年12月16日 09:15:40   作者:Michelhjx  
大家好,本篇文章主要講的是java中JDBC增刪改查操作詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

前言

? ? ? ? 在上一篇博客我們介紹了JDBC的概念以及連接數(shù)據(jù)庫的五種方式JDBC概述及數(shù)據(jù)庫連接方式(數(shù)據(jù)庫連接方式推薦使用第五種),那么我們既然連接上數(shù)據(jù)庫了,那就要對數(shù)據(jù)進行操作了,那么這一篇我們就來介紹常規(guī)的增刪改 查操作。

??? ?

我們先看一遍步驟:? ??

這里不推薦使用Statement,兩個原因:

? ? ? ? ? ? ? ? 1.存在拼串操作,繁瑣。

? ? ? ? ? ? ? ? 2.存在sql注入問題。

? ? ? ? 那我們使用誰來代替Statement呢?

一、增刪改操作

? ? ? ? 操作前,我們先解決上面的問題,我們使用PreparedStatement來代替Statement。

1.1 PreparedStatement介紹

可以通過調用 Connection 對象的 preparedStatement(String sql) 方法獲取 PreparedStatement 對象

PreparedStatement 接口是 Statement 的子接口,它表示一條預編譯過的 SQL 語句

PreparedStatement 對象所代表的 SQL 語句中的參數(shù)用問號(?)來表示,調用 PreparedStatement 對象的 setXxx() 方法來設置這些參數(shù). setXxx() 方法有兩個參數(shù),第一個參數(shù)是要設置的 SQL 語句中的參數(shù)的索引(從 1 開始),第二個是設置的 SQL 語句中的參數(shù)的值

?優(yōu)點:

解決字符串拼串問題,防止sql注入提高性能? ? ? ?

?1.2 增刪改操作

? ? ? ? 這里給出一個針對不同表的通用增刪改操作,拿著直接用就可以了。

//通用增刪改操作
    public boolean updateInfo(String sql,Object...args){
        Connection conn = null;
        PreparedStatement ps = null;
        boolean b = true;
        try {
            //1.建立連接
            conn = JDBCUtils.getConnection();
            //2.預編譯sql語句
            ps = conn.prepareStatement(sql);
            //3.填充占位符
            for (int i = 0; i <args.length ; i++) {
                ps.setObject(i+1,args[i]);
            }
            //4.執(zhí)行操作
            b = ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5.關閉資源
            JDBCUtils.close(conn,ps);
        }
        return b;
    }

? ? ? ? ?是不是復制使用會報錯,這是因為博主把數(shù)據(jù)庫連接和關閉資源也封裝成了一個類JDBCUtils。

? ? ? ? 下面給出這個類的具體代碼:

? ? ? ? 配置文件就自己寫吧,畢竟每個人的數(shù)據(jù)庫都不一樣。以及該導入的包自己動動手就行了。

public class JDBCUtils {
    //連接
    public static Connection getConnection(){
        Connection conn = null;
        try {
            //1.加載配置文件
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
            Properties prop = new Properties();
            prop.load(is);
 
            //2.讀取配置文件
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");
            String url = prop.getProperty("url");
            String driverClass = prop.getProperty("driverClass");
 
            //3.加載驅動
            Class.forName(driverClass);
 
            //4.建立連接
            conn = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
 
 
        return conn;
    }
 
    //關閉
    public static void close(Connection conn, PreparedStatement ps){
        try {
            if (conn != null){
                conn.close();
            }
            if (ps != null){
                ps.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //關閉帶resultset
    public static void close(Connection conn, PreparedStatement ps , ResultSet rs){
        try {
            if (conn != null){
                conn.close();
            }
            if (ps != null){
                ps.close();
            }
            if (rs != null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

? 1.3 測試

? ? ? ? 我們來測試一下上面的代碼

? ? ? ? 這里有一張order表,里面有初始數(shù)據(jù):

???????????????????????

? ? ? ? ?然后我們通過上面提供的方法給他增加一條數(shù)據(jù):

public class Test {
    public static void main(String[] args) {
        Operation operation = new Operation();
        String insertSql = "INSERT INTO `order`(order_id,order_name,order_date) VALUES (?,?,?)";
        boolean b = operation.updateInfo(insertSql, 3, "CC", new Date(12312132));
        if (!b){
            System.out.println("操作成功!");
        }else {
            System.out.println("操作失??!");
        }
    }
}

? ? ? ? 控制臺打印輸出:

????????

? ? ? ? ?那么是不是已經(jīng)插入成功了呢,我們去數(shù)據(jù)庫中看一下:

? ? ? ? ? 我們?SELECT * FROM `order`;

? ? ? ??

? ? ? ? 看來我們確實成功了!所以我們給出的方法還是沒有問題。

二、查操作

? ? ? ? 接下來我們就是查操作了。

2.1?通用對不同表進行一條數(shù)據(jù)查詢操作

public  <T> T doQuery(Class<T> clazz,String sql,Object...args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //1.建立連接
            conn = JDBCUtils.getConnection();
            //2.預編譯sql語句
            ps = conn.prepareStatement(sql);
            //3.填充占位符
            for (int i = 0; i <args.length ; i++) {
                ps.setObject(i+1,args[i]);
            }
            //4.得到結果集ResultSet
            rs = ps.executeQuery();
            //5.得到結果集元數(shù)據(jù)
            ResultSetMetaData rsdm = rs.getMetaData();
 
            //6.通過rs得到列值,rsdm得到列名和列數(shù)
            //得到列數(shù)
            int columnCount = rsdm.getColumnCount();
            if (rs.next()){
                T t = clazz.getDeclaredConstructor().newInstance();
                for (int i = 0; i <columnCount ; i++) {
                    //得到列值
                    Object columnvalue = rs.getObject(i + 1);
                    //得到列的別名
                    String columnLabel = rsdm.getColumnLabel(i + 1);
 
                    //通過反射給對象賦值
                    Field field = clazz.getDeclaredField(columnLabel);
                    //暴力反射
                    field.setAccessible(true);
                    field.set(t,columnvalue);
                }
                return t;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //關閉資源
            JDBCUtils.close(conn,ps,rs);
        }
        return null;
    }

? ? ? ? 老樣子,測試!

public class Test {
    public static void main(String[] args) {
        Operation operation = new Operation();
        String sql = "SELECT order_id orderId,order_name orderName,order_date orderDate FROM `order` WHERE order_id = ?;";
        Order order = operation.doQuery(Order.class, sql, 2);
        System.out.println(order);
    }
}

?控制臺輸出:

????????

2.2?通用對不同表進行多條數(shù)據(jù)查詢操作

public <T> List doQueryMore(Class<T> clazz,String sql,Object...args){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //1.建立連接
            conn = JDBCUtils.getConnection();
            //2.預編譯sql語句
            ps = conn.prepareStatement(sql);
            //3.填充占位符
            for (int i = 0; i <args.length ; i++) {
                ps.setObject(i+1,args[i]);
            }
            //4.得到結果集ResultSet
            rs = ps.executeQuery();
            //5.得到結果集元數(shù)據(jù)
            ResultSetMetaData rsdm = rs.getMetaData();
 
            //6.通過rs得到列值,rsdm得到列名和列數(shù)
            //得到列數(shù)
            int columnCount = rsdm.getColumnCount();
            //創(chuàng)建集合
            ArrayList<T> list = new ArrayList<>();
            while (rs.next()){
                T t = clazz.getDeclaredConstructor().newInstance();
                for (int i = 0; i <columnCount ; i++) {
                    //得到列值
                    Object columnvalue = rs.getObject(i + 1);
                    //得到列的別名
                    String columnLabel = rsdm.getColumnLabel(i + 1);
 
                    //通過反射給對象賦值
                    Field field = clazz.getDeclaredField(columnLabel);
                    //暴力反射
                    field.setAccessible(true);
                    field.set(t,columnvalue);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //關閉資源
            JDBCUtils.close(conn,ps,rs);
        }
        return null;
    }

? ? ? ? ?這一個測試就交給各位吧!

總結

到此這篇關于java中JDBC增刪改查操作詳解的文章就介紹到這了,更多相關java JDBC增刪改查內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java設計模式中組合模式應用詳解

    Java設計模式中組合模式應用詳解

    組合模式,又叫部分整體模式,它創(chuàng)建了對象組的數(shù)據(jù)結構組合模式使得用戶對單個對象和組合對象的訪問具有一致性。本文將通過示例為大家詳細介紹一下組合模式,需要的可以參考一下
    2022-11-11
  • JDK8中的HashMap初始化和擴容機制詳解

    JDK8中的HashMap初始化和擴容機制詳解

    這篇文章主要介紹了JDK8中的HashMap初始化和擴容機制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 解決springboot與springcloud版本兼容問題(附版本兼容表)

    解決springboot與springcloud版本兼容問題(附版本兼容表)

    在基于spring boot搭建spring cloud時,創(chuàng)建eureka后啟動服務發(fā)生報錯,本文給大家介紹了解決springboot與springcloud版本兼容問題的幾種方案,需要的朋友可以參考下
    2024-02-02
  • Java JVM調優(yōu)五大技能詳解

    Java JVM調優(yōu)五大技能詳解

    這篇文章主要為大家介紹了JVM調優(yōu)的五大技能,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • SpringBoot使用Validator進行參數(shù)校驗實戰(zhàn)教程(自定義校驗,分組校驗)

    SpringBoot使用Validator進行參數(shù)校驗實戰(zhàn)教程(自定義校驗,分組校驗)

    這篇文章主要介紹了SpringBoot使用Validator進行參數(shù)校驗(自定義校驗,分組校驗)的實戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2023-07-07
  • java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例

    java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例

    這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計sql執(zhí)行時間
    2014-03-03
  • SpringBoot項目使用slf4j的MDC日志打點功能(最新推薦)

    SpringBoot項目使用slf4j的MDC日志打點功能(最新推薦)

    這篇文章主要介紹了SpringBoot項目使用slf4j的MDC日志打點功能,本文通過示例代碼給大家介紹非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 解析java中volatile關鍵字

    解析java中volatile關鍵字

    這篇文章主要為大家解析了java中volatile關鍵字,經(jīng)常有人把volatile關鍵字和synchronized或者lock混淆,本文就為大家好好區(qū)分,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 實例解析Java的Jackson庫中的數(shù)據(jù)綁定

    實例解析Java的Jackson庫中的數(shù)據(jù)綁定

    這篇文章主要介紹了Java的Jackson庫中的數(shù)據(jù)綁定,這里分為通常的簡單數(shù)據(jù)綁定與全數(shù)據(jù)綁定兩種情況來講,需要的朋友可以參考下
    2016-01-01
  • Springboot AOP開發(fā)教程

    Springboot AOP開發(fā)教程

    AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內容,是函數(shù)式編程的一種衍生范型,本文給大家介紹Springboot AOP開發(fā)教程,感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評論

石门县| 苗栗市| 鞍山市| 普陀区| 温宿县| 长葛市| 蒲城县| 长阳| 新乐市| 周口市| 沐川县| 沿河| 通渭县| 靖宇县| 灵石县| 大洼县| 沧州市| 读书| 元阳县| 普格县| 松滋市| 六安市| 化德县| 外汇| 南丹县| 梧州市| 灵川县| 新巴尔虎右旗| 青龙| 汾阳市| 齐河县| 奉化市| 镇宁| 冷水江市| 巢湖市| 青川县| 唐河县| 贵阳市| 长春市| 宝丰县| 米易县|