BaseDao封裝JavaWeb的增刪改查的實(shí)現(xiàn)代碼
什么是BaseDao?
Basedao 是一種基于數(shù)據(jù)訪問(wèn)對(duì)象(Data Access Object)模式的設(shè)計(jì)方法。它是一個(gè)用于處理數(shù)據(jù)庫(kù)操作的基礎(chǔ)類,負(fù)責(zé)封裝數(shù)據(jù)庫(kù)訪問(wèn)的底層操作,提供通用的數(shù)據(jù)庫(kù)訪問(wèn)方法。
Basedao 主要用于簡(jiǎn)化數(shù)據(jù)庫(kù)操作的代碼開發(fā),并提供一致性和可維護(hù)性。它通常包含有對(duì)數(shù)據(jù)庫(kù)的增加、刪除、修改和查詢等操作方法,以及一些基本的事務(wù)處理功能。
Basedao 可以通過(guò)繼承來(lái)擴(kuò)展具體的數(shù)據(jù)庫(kù)操作方法,使得在具體的業(yè)務(wù)實(shí)現(xiàn)中可以更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而不需要關(guān)注底層數(shù)據(jù)庫(kù)的細(xì)節(jié)。
通過(guò)使用 Basedao,開發(fā)人員可以更加高效地進(jìn)行數(shù)據(jù)庫(kù)操作的開發(fā),減少了重復(fù)的代碼編寫,提高了代碼的可維護(hù)性和可讀性。
為什么需要BaseDao?
BaseDao 的優(yōu)點(diǎn)包括:
- 代碼復(fù)用(共性抽?。?/strong>BaseDao 封裝了常見的數(shù)據(jù)庫(kù)操作方法,可以被不同的業(yè)務(wù)邏輯類多次調(diào)用,避免了重復(fù)編寫相同的數(shù)據(jù)庫(kù)操作代碼,提高了代碼的復(fù)用性。
- 提高開發(fā)效率:BaseDao 提供了高級(jí)的數(shù)據(jù)庫(kù)操作方法,開發(fā)人員可以直接調(diào)用這些方法,減少了重復(fù)的開發(fā)工作,提高了開發(fā)效率。
- 降低代碼耦合度:BaseDao 封裝了底層數(shù)據(jù)庫(kù)的細(xì)節(jié),通過(guò)調(diào)用 BaseDao 的方法,業(yè)務(wù)邏輯類可以和具體的數(shù)據(jù)庫(kù)實(shí)現(xiàn)解耦,減少了業(yè)務(wù)邏輯類和數(shù)據(jù)庫(kù)之間的直接依賴,提高了代碼的可維護(hù)性和可擴(kuò)展性。
- 提供事務(wù)支持:BaseDao 通常會(huì)提供事務(wù)處理的功能,可以保證數(shù)據(jù)庫(kù)操作的一致性。開發(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),可以提高開發(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ù)都離不開每次訪問(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í)博主訪問(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í)行操作不含查詢,則將結(jié)果集的實(shí)參傳空
} catch (SQLException e) {
e.printStackTrace();
}
return row; //返回受影響行數(shù)
}因?yàn)閟ql語(yǔ)句中需要的參數(shù)與類型是不確定的,則用Object類型數(shù)組作為容器
3、至此就剩查詢操作了,在封裝前需要?jiǎng)?chuàng)建一個(gè)實(shí)體類,以至于后續(xù)每個(gè)實(shí)體類都可以代表為一行數(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 { //查詢操作的方法
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ì)象類型,代表每個(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è)試類進(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類型的數(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、查詢測(cè)試
//查詢測(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ì)象類型,用于存儲(chǔ)查詢返回的數(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)文章
JAVA動(dòng)態(tài)維度笛卡爾積輸出的實(shí)現(xiàn)
本文主要介紹了JAVA動(dòng)態(tài)維度笛卡爾積輸出的實(shí)現(xiàn),通過(guò)動(dòng)態(tài)生成笛卡爾積,可以方便地處理多維數(shù)據(jù)集,提高數(shù)據(jù)處理效率,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
Java實(shí)現(xiàn)將每日新聞添加到自己博客中
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)將每日新聞添加到自己博客中并發(fā)送到微信群中,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
通俗易懂的Java常見限流算法具體實(shí)現(xiàn)
這篇文章主要介紹了Java常見限流算法具體實(shí)現(xiàn)的相關(guān)資料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的實(shí)現(xiàn)原理和具體步驟,并比較了它們的優(yōu)點(diǎn)和缺點(diǎn),需要的朋友可以參考下2025-02-02
springmvc path請(qǐng)求映射到bean 方法的流程
這篇文章主要介紹了springmvc path請(qǐng)求映射到bean 方法的流程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Java 通過(guò)反射變更String的值過(guò)程詳解
這篇文章主要介紹了Java 通過(guò)反射變更String的值過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java實(shí)現(xiàn)生成JSON字符串的三種方式分享
這篇文章主要來(lái)和大家分享一下Java實(shí)現(xiàn)生成JSON字符串的常見三種方式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05

