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

BaseDao封裝JavaWeb的增刪改查的實(shí)現(xiàn)代碼

 更新時(shí)間:2024年03月28日 08:43:21   作者:是小言  
Basedao 是一種基于數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象(Data Access Object)模式的設(shè)計(jì)方法,它是一個(gè)用于處理數(shù)據(jù)庫(kù)操作的基礎(chǔ)類(lèi),負(fù)責(zé)封裝數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的底層操作,提供通用的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)方法,本文給大家介紹了BaseDao封裝JavaWeb的增刪改查的實(shí)現(xiàn)代碼,需要的朋友可以參考下

什么是BaseDao?

Basedao 是一種基于數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象(Data Access Object)模式的設(shè)計(jì)方法。它是一個(gè)用于處理數(shù)據(jù)庫(kù)操作的基礎(chǔ)類(lèi),負(fù)責(zé)封裝數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的底層操作,提供通用的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)方法。

Basedao 主要用于簡(jiǎn)化數(shù)據(jù)庫(kù)操作的代碼開(kāi)發(fā),并提供一致性可維護(hù)性。它通常包含有對(duì)數(shù)據(jù)庫(kù)的增加、刪除、修改和查詢(xún)等操作方法,以及一些基本的事務(wù)處理功能。

Basedao 可以通過(guò)繼承來(lái)擴(kuò)展具體的數(shù)據(jù)庫(kù)操作方法,使得在具體的業(yè)務(wù)實(shí)現(xiàn)中可以更加專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而不需要關(guān)注底層數(shù)據(jù)庫(kù)的細(xì)節(jié)。

通過(guò)使用 Basedao,開(kāi)發(fā)人員可以更加高效地進(jìn)行數(shù)據(jù)庫(kù)操作的開(kāi)發(fā),減少了重復(fù)的代碼編寫(xiě),提高了代碼的可維護(hù)性可讀性。

為什么需要BaseDao?

BaseDao 的優(yōu)點(diǎn)包括:

  • 代碼復(fù)用(共性抽?。?/strong>BaseDao 封裝了常見(jiàn)的數(shù)據(jù)庫(kù)操作方法,可以被不同的業(yè)務(wù)邏輯類(lèi)多次調(diào)用,避免了重復(fù)編寫(xiě)相同的數(shù)據(jù)庫(kù)操作代碼,提高了代碼的復(fù)用性。
  • 提高開(kāi)發(fā)效率:BaseDao 提供了高級(jí)的數(shù)據(jù)庫(kù)操作方法,開(kāi)發(fā)人員可以直接調(diào)用這些方法,減少了重復(fù)的開(kāi)發(fā)工作,提高了開(kāi)發(fā)效率。
  • 降低代碼耦合度:BaseDao 封裝了底層數(shù)據(jù)庫(kù)的細(xì)節(jié),通過(guò)調(diào)用 BaseDao 的方法,業(yè)務(wù)邏輯類(lèi)可以和具體的數(shù)據(jù)庫(kù)實(shí)現(xiàn)解耦,減少了業(yè)務(wù)邏輯類(lèi)和數(shù)據(jù)庫(kù)之間的直接依賴(lài),提高了代碼的可維護(hù)性和可擴(kuò)展性。
  • 提供事務(wù)支持:BaseDao 通常會(huì)提供事務(wù)處理的功能,可以保證數(shù)據(jù)庫(kù)操作的一致性。開(kāi)發(fā)人員可以通過(guò) BaseDao 來(lái)處理事務(wù),確保在一次操作中,要么全部成功,要么全部失敗,避免了數(shù)據(jù)不一致的情況。

總的來(lái)說(shuō),BaseDao 通過(guò)封裝數(shù)據(jù)庫(kù)操作,提供高級(jí)的數(shù)據(jù)庫(kù)操作方法,降低代碼耦合度,提供事務(wù)支持等優(yōu)點(diǎn),可以提高開(kāi)發(fā)效率,簡(jiǎn)化數(shù)據(jù)庫(kù)操作,提高代碼的可維護(hù)性和可擴(kuò)展性。

BaseDao的實(shí)現(xiàn)邏輯

簡(jiǎn)單來(lái)說(shuō)BaseDao就是對(duì)數(shù)據(jù)庫(kù)底層操作業(yè)務(wù)進(jìn)行共性抽取,下面就以學(xué)生信息為例~

1、在學(xué)生信息管理系統(tǒng)中,不論增刪改查還是特殊業(yè)務(wù)都離不開(kāi)每次訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的配置驅(qū)動(dòng)以及獲取連接和關(guān)閉連接,所以這兩步是必然封裝的

/**
 * 獲取數(shù)據(jù)庫(kù)連接對(duì)象
 */
public Connection getConnection() throws Exception {  //獲取連接對(duì)象方法
    //加載配置文件
    Properties properties = new Properties();
    properties.load(Files.newInputStream(Paths.get("D:\\druid.properties")));
 
    //創(chuàng)建一個(gè)指定參數(shù)的數(shù)據(jù)庫(kù)連接池
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    return dataSource.getConnection();  //返回連接對(duì)象
}

因?yàn)楫?dāng)時(shí)博主訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)是采用Druid連接池,所以配置驅(qū)動(dòng)就使用配置文件的方式,配置文件( .properties )代碼如下:

driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/student?useServerPrepStmts=true
username = root
password = root
initialSize = 10
maxActive = 30
maxWait = 1000

關(guān)閉連接方法封裝代碼如下:

/**
 * 關(guān)閉數(shù)據(jù)庫(kù)連接
 * @param conn 數(shù)據(jù)庫(kù)連接
 * @param stmt PreparedStatement預(yù)處理對(duì)象
 * @param rs 結(jié)果集
 */
public void closeAll(Connection conn, PreparedStatement stmt, ResultSet rs) {  //關(guān)閉連接方法
        // 若結(jié)果集對(duì)象(RresuleSet)不為空,則關(guān)閉
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 若預(yù)處理對(duì)象(PreparedStatement)不為空,則關(guān)閉
        if (stmt != null) {
            try {
                stmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 若數(shù)據(jù)庫(kù)連接對(duì)象(Connection)不為空,則關(guān)閉
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

2、通過(guò)第一步的調(diào)用能夠返回一個(gè)連接對(duì)象,那么接下來(lái)就可以進(jìn)行基本的增刪改查操作, 增刪改都屬于對(duì)數(shù)據(jù)做更新,所以先做增刪改

/**
 * 增、刪、改的操作
 * @param preparedSql 預(yù)編譯的 SQL 語(yǔ)句
 * @param param 參數(shù)的字符串?dāng)?shù)組
 * @return 影響的行數(shù)
 */
public int updateRow (String preparedSql, Object[] param) throws Exception {  //增刪改操作的方法
    PreparedStatement preparedStatement = null;  //創(chuàng)建預(yù)處理對(duì)象并初始為空(通過(guò)預(yù)處理可以防止SQL惡意注入)
    int row = 0;  //初始受影響行數(shù)(當(dāng)受影響行數(shù)大于0時(shí),說(shuō)明執(zhí)行成功數(shù)據(jù)則更新)
    Connection connection = getConnection();  //調(diào)用getConnection()方法獲取數(shù)據(jù)庫(kù)連接
    try {
        preparedStatement = connection.prepareStatement(preparedSql);  //對(duì)sql形參預(yù)處理
        if (param != null) {  //形參數(shù)組(注入?yún)?shù))不為空時(shí),循環(huán)遍歷對(duì)預(yù)處理sql注入?yún)?shù)
            for (int i = 0; i < param.length; i++) {
                //為預(yù)編譯sql設(shè)置參數(shù)
                preparedStatement.setObject(i + 1, param[i]);
            }
        }
        row = preparedStatement.executeUpdate();  //執(zhí)行sql語(yǔ)句并得到受影響的行數(shù)
        closeAll(connection,preparedStatement,null);  //調(diào)用closeAll()方法關(guān)閉資源,因?yàn)閳?zhí)行操作不含查詢(xún),則將結(jié)果集的實(shí)參傳空
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return row;  //返回受影響行數(shù)
}

因?yàn)閟ql語(yǔ)句中需要的參數(shù)類(lèi)型是不確定的,則用Object類(lèi)型數(shù)組作為容器

3、至此就剩查詢(xún)操作了,在封裝前需要?jiǎng)?chuàng)建一個(gè)實(shí)體類(lèi),以至于后續(xù)每個(gè)實(shí)體類(lèi)都可以代表為一行數(shù)據(jù),代碼如下:

public class Student {
    //初始字段
    private int id;
    private String name;
    private int age;
 
    public Student(int id, String name, int age) {  //構(gòu)造函數(shù)
        this.id = id;
        this.name = name;
        this.age = age;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @Override
    public String toString() {  //toString方法
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

實(shí)體對(duì)象有了,那么走你:

public List<Student> queryData (String sql, Object[] param) throws Exception {  //查詢(xún)操作的方法
    PreparedStatement preparedStatement = null;  //創(chuàng)建預(yù)處理對(duì)象并初始為空(通過(guò)預(yù)處理可以防止SQL惡意注入)
    Connection connection = getConnection();  //調(diào)用getConnection()方法獲取數(shù)據(jù)庫(kù)連接
    preparedStatement = connection.prepareStatement(sql);  //調(diào)用getConnection()方法獲取數(shù)據(jù)庫(kù)連接
    if (param != null) {  //形參數(shù)組(注入?yún)?shù))不為空時(shí),循環(huán)遍歷對(duì)預(yù)處理sql注入?yún)?shù)
        for (int i = 0; i < param.length; i++) {
            //為預(yù)編譯sql設(shè)置參數(shù)
            preparedStatement.setObject(i + 1, param[i]);
        }
    }
    ResultSet resultSet = preparedStatement.executeQuery();  //得到返回的結(jié)果集
    List<Student> list = new ArrayList<Student>();  //創(chuàng)建List接口對(duì)象,泛型為指定Student對(duì)象類(lèi)型,代表每個(gè)實(shí)體對(duì)象都是一行數(shù)據(jù)
    while (resultSet.next()) {  //循環(huán)遍歷結(jié)果集,將每行數(shù)據(jù)封裝成Student對(duì)象,并添加到List集合中
        Student student= new Student(resultSet.getInt(1), resultSet.getString(2), resultSet.getInt(3));  //獲取結(jié)果集中的數(shù)據(jù)存入Student對(duì)象中
        list.add(student);  //將Student對(duì)象存入list接口中
    }
    closeAll(connection,preparedStatement,resultSet);  //調(diào)用closeAll()方法關(guān)閉數(shù)據(jù)庫(kù)連接
    return list;  //返回List集合對(duì)象 
}

接下來(lái)創(chuàng)建一個(gè)測(cè)試類(lèi)進(jìn)行檢查:

1、增刪改測(cè)試

//增刪改測(cè)試
BaseDao baseDao = new BaseDao();  //創(chuàng)建BaseDao對(duì)象
String sql = "insert into student(id,name,age) values(?,?,?)";  //定義預(yù)處理sql
Object[] list = {6, "老八", 35};  //將sql需要的參數(shù)存入至Object類(lèi)型的數(shù)組
int add = baseDao.updateRow(sql, list); //調(diào)用增刪改的方法并接收返回的受影響行數(shù)
if (add > 0) {  //受影響行數(shù)大于0則說(shuō)明數(shù)據(jù)更新成功
    System.out.println("新增成功!受影響行數(shù):" + add);
}
/* 刪除、修改也是一樣 */

控制臺(tái):

2、查詢(xún)測(cè)試 

//查詢(xún)測(cè)試
BaseDao baseDao = new BaseDao();  //創(chuàng)建BaseDao對(duì)象
String sql = "select * from student";  //定義預(yù)處理sql
List<Student> list = baseDao.queryData(sql, null);  //創(chuàng)建List接口,泛型為Student對(duì)象類(lèi)型,用于存儲(chǔ)查詢(xún)返回的數(shù)據(jù)
for (Student student : list) {
    System.out.println(student.getId() + "\t\t" + student.getName() + "\t\t" + student.getAge());  //輸出數(shù)據(jù)
}

控制臺(tái):

這么一來(lái),JavaWeb中的每次增刪改查都可以簡(jiǎn)明的實(shí)現(xiàn),增刪改查以外的特殊性業(yè)務(wù)功能可在BaseDao對(duì)象中具體實(shí)現(xiàn)方法

以上就是BaseDao封裝JavaWeb的增刪改查的實(shí)現(xiàn)代碼的詳細(xì)內(nèi)容,更多關(guān)于BaseDao封裝JavaWeb的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot 錯(cuò)誤處理小結(jié)

    springboot 錯(cuò)誤處理小結(jié)

    在 java web開(kāi)發(fā)過(guò)程中,難免會(huì)有一些系統(tǒng)異?;蛉藶楫a(chǎn)生一些異常。在 RESTful springboot 項(xiàng)目中如何優(yōu)雅的處理?下面腳本之家小編給大家?guī)?lái)了springboot 錯(cuò)誤處理小結(jié),感興趣的朋友一起看看吧
    2018-03-03
  • Fastjson 常用API介紹及下載地址(推薦)

    Fastjson 常用API介紹及下載地址(推薦)

    Fastjson是一個(gè)Java語(yǔ)言編寫(xiě)的高性能功能完善的JSON庫(kù)。接下來(lái)通過(guò)本文給大家分享Fastjson 常用API介紹及下載地址,感興趣的朋友一起看看吧
    2017-11-11
  • 如何使用IDEA開(kāi)發(fā)Spark SQL程序(一文搞懂)

    如何使用IDEA開(kāi)發(fā)Spark SQL程序(一文搞懂)

    Spark SQL 是一個(gè)用來(lái)處理結(jié)構(gòu)化數(shù)據(jù)的spark組件。它提供了一個(gè)叫做DataFrames的可編程抽象數(shù)據(jù)模型,并且可被視為一個(gè)分布式的SQL查詢(xún)引擎。這篇文章主要介紹了如何使用IDEA開(kāi)發(fā)Spark SQL程序(一文搞懂),需要的朋友可以參考下
    2021-08-08
  • Jmeter參數(shù)化實(shí)現(xiàn)方法及應(yīng)用實(shí)例

    Jmeter參數(shù)化實(shí)現(xiàn)方法及應(yīng)用實(shí)例

    這篇文章主要介紹了Jmeter參數(shù)化實(shí)現(xiàn)方法及應(yīng)用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • springboot集成redisson的三種方式

    springboot集成redisson的三種方式

    本文主要介紹了springboot集成redisson的三種方式,包含自定義配置+手動(dòng)注入,使用Yaml方式批量讀取配置和spring boot自動(dòng)配置類(lèi)這三種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(3)

    JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(3)

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)第三篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot如何使用注解進(jìn)行XSS防御

    SpringBoot如何使用注解進(jìn)行XSS防御

    在SpringBoot中,可以通過(guò)自定義@XSS注解和實(shí)現(xiàn)XSSValidator類(lèi)來(lái)防御XSS攻擊,此方法適用于GET和POST請(qǐng)求,通過(guò)在方法參數(shù)或?qū)嶓w類(lèi)屬性上添加@XSS注解,并結(jié)合@Valid或@Validated注解使用,有效攔截潛在的XSS腳本,保障應(yīng)用安全
    2024-11-11
  • Java輸出通過(guò)InetAddress獲得的IP地址數(shù)組詳細(xì)解析

    Java輸出通過(guò)InetAddress獲得的IP地址數(shù)組詳細(xì)解析

    由于byte被認(rèn)為是unsigned byte,所以最高位的1將會(huì)被解釋為符號(hào)位,另外Java中存儲(chǔ)是按照補(bǔ)碼存儲(chǔ),所以1000 0111會(huì)被認(rèn)為是補(bǔ)碼形式,轉(zhuǎn)換成原碼便是1111 0001,轉(zhuǎn)換成十進(jìn)制數(shù)便是-121
    2013-09-09
  • SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類(lèi)方式

    SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類(lèi)方式

    這篇文章主要介紹了SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類(lèi)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 10張圖總結(jié)出并發(fā)編程最佳學(xué)習(xí)路線(xiàn)

    10張圖總結(jié)出并發(fā)編程最佳學(xué)習(xí)路線(xiàn)

    這篇文章主要介紹了并發(fā)編程的最佳學(xué)習(xí)路線(xiàn),文中通過(guò)圖片介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08

最新評(píng)論

石阡县| 资阳市| 交口县| 茶陵县| 新泰市| 平潭县| 三原县| 和静县| 康定县| 内黄县| 正定县| 金沙县| 炎陵县| 台南县| 德保县| 花莲市| 潼关县| 镇安县| 江都市| 武冈市| 临夏县| 滨海县| 博兴县| 塔城市| 临潭县| 日喀则市| 灵璧县| 青河县| 嘉禾县| 安吉县| 广昌县| 铅山县| 宁安市| 靖边县| 华宁县| 阜康市| 许昌县| 南平市| 固原市| 县级市| 彭州市|