程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL數據庫學習筆記(十一)----DAO設計模式實現數據庫的增刪改查(進一步封裝JDBC工具類),----daojdbc

MySQL數據庫學習筆記(十一)----DAO設計模式實現數據庫的增刪改查(進一步封裝JDBC工具類),----daojdbc

編輯:MySQL綜合教程

MySQL數據庫學習筆記(十一)----DAO設計模式實現數據庫的增刪改查(進一步封裝JDBC工具類),----daojdbc


【聲明】 

歡迎轉載,但請保留文章原始出處→_→ 

生命壹號:http://www.cnblogs.com/smyhvae/

文章來源:http://www.cnblogs.com/smyhvae/p/4059514.html

聯系方式:[email protected]

 

【正文】

一、DAO模式簡介

DAO即Data Access Object,數據訪問接口。數據訪問:故名思義就是與數據庫打交道。夾在業務邏輯與數據庫資源中間。

DAO模式實際上是兩個模式的組合,即Data Accessor (數據訪問者)模式和 Active Domain Object(領域對象)模式。Data Accessor 模式實現了數據訪問和業務邏輯的分離;Active Domain Object 模式實現了業務數據的對象化封裝。

需要注意的是,DAO設計模式是Java EE中的設計模式,而非Java SE中的23種設計模式。

 

二、實現DAO模式

一個典型的DAO實現有下列幾個組件:

  • 一個DAO接口;
  • 一個實現DAO接口的具體類; 
  • 數據傳遞對象(DTO):有些時候叫做值對象(VO)或領域模型(domain)

這種實現模式就是一個套路,記熟就好了。不過在這之前,如果有不明白的地方,還是要回顧一下之前幾篇博文中的知識:PreparedStatement接口重構增刪改查、封裝JDBC工具類。好了,下面直接上代碼。

 

三、代碼實現

我們一下面的這張數據表為例:

新建Java工程文件DaoTest01,最終的工程文件結構如下:

DBUtils工具類:(package com.util.db)

 1 package com.util.db;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 import java.util.ResourceBundle;
 9 
10 /**
11  * 數據庫操作工具類
12  * @author lamp
13  *
14  */
15 public class DBUtils {
16     
17     //數據庫連接地址
18     public static String URL;
19     //用戶名
20     public static String USERNAME;
21     //密碼
22     public static String PASSWORD;
23     //mysql的驅動類
24     public static String DRIVER;
25     
26     private static ResourceBundle rb = ResourceBundle.getBundle("com.util.db.db-config");
27     
28     private DBUtils(){}
29     
30     //使用靜態塊加載驅動程序
31     static{
32         URL = rb.getString("jdbc.url");
33         USERNAME = rb.getString("jdbc.username");
34         PASSWORD = rb.getString("jdbc.password");
35         DRIVER = rb.getString("jdbc.driver");
36         try {
37             Class.forName(DRIVER);
38         } catch (ClassNotFoundException e) {
39             e.printStackTrace();
40         }
41     }
42     //定義一個獲取數據庫連接的方法
43     public static Connection getConnection(){
44         Connection conn = null;
45         try {
46             conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
47         } catch (SQLException e) {
48             e.printStackTrace();
49             System.out.println("獲取連接失敗");
50         }
51         return conn;
52     }
53     
54     /**
55      * 關閉數據庫連接
56      * @param rs
57      * @param stat
58      * @param conn
59      */
60     public static void close(ResultSet rs,Statement stat,Connection conn){
61             try {
62                 if(rs!=null)rs.close();
63                 if(stat!=null)stat.close();
64                 if(conn!=null)conn.close();
65             } catch (SQLException e) {
66                 e.printStackTrace();
67             }
68     }
69     
70 }

注意:26行中,注意獲取屬性文件的包名是否正確。稍後會定義這個屬性文件。

28行:既然是工具類,一般不要實例化,此時可以采用單例設計模式,或者將構造方法私有化。

26行:很明顯可以看到,我們是將連接數據庫的URL、用戶名,密碼等信息編寫在一個屬性文件(jdbc.properties)中,稍後再來定義這個屬性文件。

31行:為避免重復代碼,使用靜態代碼塊:只會在類加載的時候執行一次。

42行:定義一個獲取數據庫連接的方法

60行:關閉數據庫連接

(2)接下來新建一個屬性文件,new-->file,命名為:db-config.properties,代碼如下:

jdbc.url=jdbc:mysql://localhost:3306/jdbcdb
jdbc.username=root
jdbc.password=smyh
jdbc.driver=com.mysql.jdbc.Driver

以後如果需要修改配置信息,只需要在這裡改就行了。注意在上面的DBUtils類中是怎麼來調用這個配置信息的。

緊接著新建文件,定義好Person類:(package com.vae.domain)

 1 package com.vae.domain;
 2 
 3 public class Person {
 4     private int id;
 5     private String name;
 6     private int age;
 7     private String description;
 8     public int getId() {
 9         return id;
10     }
11     public void setId(int id) {
12         this.id = id;
13     }
14     public String getName() {
15         return name;
16     }
17     public void setName(String name) {
18         this.name = name;
19     }
20     public int getAge() {
21         return age;
22     }
23     public void setAge(int age) {
24         this.age = age;
25     }
26     public String getDescription() {
27         return description;
28     }
29     public void setDescription(String description) {
30         this.description = description;
31     }
32     public Person(int id, String name, int age, String description) {
33         super();
34         this.id = id;
35         this.name = name;
36         this.age = age;
37         this.description = description;
38     }
39     public Person(String name, int age, String description) {
40         super();
41         this.name = name;
42         this.age = age;
43         this.description = description;
44     }
45     public Person() {
46         super();
47         // TODO Auto-generated constructor stub
48     }
49     @Override
50     public String toString() {
51         return "Person [id=" + id + ", name=" + name + ", age=" + age
52                 + ", description=" + description + "]";
53     }
54     
55     
56 }

這個Person類就是領域模型,表示是對它進行增刪改查。

(3)定義PersonDao接口:專門對Person類進行操作(例如增刪改查)的接口(package com.vae.dao)

package com.vae.dao;

import java.sql.SQLException;
import java.util.List;

import com.vae.domain.Person;

public interface PersonDao {
    //添加方法
    public void add(Person p)throws SQLException;
    
    //更新方法
    public void update(Person p)throws SQLException;
    
    //刪除方法
    public void delete(int id)throws SQLException;
    
    //查找方法
    public Person findById(int id)throws SQLException;
    
    //查找所有
    public List<Person> findAll()throws SQLException;
    
} 

(4)定義PeronDaoImpl實現類 ,實現上面的PeronDao接口(package com.vae.dao.impl)

  1 package com.vae.dao.impl;
  2 
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 import com.util.db.DBUtils;
 11 import com.vae.dao.PersonDao;
 12 import com.vae.domain.Person;
 13 
 14 /**
 15  * PersonDao的具體實現類
 16  * @author lamp
 17  *
 18  */
 19 public class PersonDaoImpl implements PersonDao{
 20 
 21     /**
 22      * 實現添加方法
 23      */
 24     @Override
 25     public void add(Person p) throws SQLException {
 26         Connection conn = null;
 27         PreparedStatement ps = null;
 28         String sql = "insert into person(name,age,description)values(?,?,?)";
 29         try{
 30             conn = DBUtils.getConnection();
 31             ps = conn.prepareStatement(sql);
 32             ps.setString(1, p.getName());
 33             ps.setInt(2, p.getAge());
 34             ps.setString(3, p.getDescription());
 35             ps.executeUpdate();
 36         }catch(SQLException e){
 37             e.printStackTrace();
 38             throw new SQLException("添加數據失敗");
 39         }finally{
 40             DBUtils.close(null, ps, conn);
 41         }
 42     }
 43 
 44     /**
 45      * 更新方法
 46      */
 47     @Override
 48     public void update(Person p) throws SQLException {
 49         Connection conn = null;
 50         PreparedStatement ps = null;
 51         String sql = "update person set name=?,age=?,description=? where id=?";
 52         try{
 53             conn = DBUtils.getConnection();
 54             ps = conn.prepareStatement(sql);
 55             ps.setString(1, p.getName());
 56             ps.setInt(2, p.getAge());
 57             ps.setString(3, p.getDescription());
 58             ps.setInt(4, p.getId());
 59             ps.executeUpdate();
 60         }catch(SQLException e){
 61             e.printStackTrace();
 62             throw new SQLException("更新數據失敗");
 63         }finally{
 64             DBUtils.close(null, ps, conn);
 65         }        
 66     }
 67 
 68     /**
 69      * 刪除方法
 70      */
 71     @Override
 72     public void delete(int id) throws SQLException {
 73         Connection conn = null;
 74         PreparedStatement ps = null;
 75         String sql = "delete from person where id=?";
 76         try{
 77             conn = DBUtils.getConnection();
 78             ps = conn.prepareStatement(sql);
 79             ps.setInt(1,id);
 80             ps.executeUpdate();
 81         }catch(SQLException e){
 82             e.printStackTrace();
 83             throw new SQLException(" 刪除數據失敗");
 84         }finally{
 85             DBUtils.close(null, ps, conn);
 86         }        
 87     }
 88 
 89     /**
 90      * 根據ID查詢一個對象
 91      */
 92     @Override
 93     public Person findById(int id) throws SQLException {
 94         Connection conn = null;
 95         PreparedStatement ps = null;
 96         ResultSet rs = null;
 97         Person p = null;
 98         String sql = "select name,age,description from person where id=?";
 99         try{
100             conn = DBUtils.getConnection();
101             ps = conn.prepareStatement(sql);
102             ps.setInt(1, id);
103             rs = ps.executeQuery();
104             if(rs.next()){
105                 p = new Person();
106                 p.setId(id);
107                 p.setName(rs.getString(1));
108                 p.setAge(rs.getInt(2));
109                 p.setDescription(rs.getString(3));
110             }
111         }catch(SQLException e){
112             e.printStackTrace();
113             throw new SQLException("根據ID查詢數據失敗");
114         }finally{
115             DBUtils.close(rs, ps, conn);
116         }
117         return p;
118     }
119 
120     /**
121      * 查詢所有數據
122      */
123     @Override
124     public List<Person> findAll() throws SQLException {
125         Connection conn = null;
126         PreparedStatement ps = null;
127         ResultSet rs = null;
128         Person p = null;
129         List<Person> persons = new ArrayList<Person>();
130         String sql = "select id,name,age,description from person";
131         try{
132             conn = DBUtils.getConnection();
133             ps = conn.prepareStatement(sql);
134             rs = ps.executeQuery();
135             while(rs.next()){
136                 p = new Person();
137                 p.setId(rs.getInt(1));
138                 p.setName(rs.getString(2));
139                 p.setAge(rs.getInt(3));
140                 p.setDescription(rs.getString(4));
141                 persons.add(p);
142             }
143         }catch(SQLException e){
144             e.printStackTrace();
145             throw new SQLException("查詢所有數據失敗");
146         }finally{
147             DBUtils.close(rs, ps, conn);
148         }
149         return persons;
150     }
151 
152 }

我們在各自的增刪改查裡都拋出了異常,如果出現異常,就會拋出相應的錯誤信息。

總結:這樣的話,我們就封裝好了JDBC的工具類。以後如果要用的話,可以直接在主方法裡調用這個類就行了。

【工程文件】

鏈接:http://pan.baidu.com/s/1qW6tew8

密碼:t98s


怎寫一個dao類方法來實現java對mysql數據庫的增刪改查?

package basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC {

public void findAll() {

try {

// 獲得數據庫驅動

//由於長時間不寫,驅動名和URL都忘記了,不知道對不對,你應該知道的,自己改一下的哈

String url = "jdbc:oracle:thin:@localhost:1521:XE";

String userName = "system";

String password = "system";

Class.forName("oracle.jdbc.driver.OracleDriver");

// 創建連接

Connection conn = DriverManager.getConnection(url, userName,
password);

// 新建發送sql語句的對象

Statement st = conn.createStatement();

// 執行sql

String sql = "select * from users";

ResultSet rs = st.executeQuery(sql);

// 處理結果

while(rs.next()){

//這個地方就是給你的封裝類屬性賦值

System.out.println("UserName:"+rs.getString(0));

}

// 關閉連接

rs.close();

st.close();

conn.close();

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public void delete(){

try {

//步驟還是那六個步驟,前邊的兩步是一樣的
String url = "jdbc:oracle:thin:@localhost:1521:XE";

String userName = "system";

String password = "sy......余下全文>>
 

jsp操作mysql數據庫實現增刪改查,數據庫只有兩個字段,title與content下面是我的代碼,怎寫不進去?

PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
Statement stmt = conn.createStatement();
這個地方你是想用PreparedStatement 呢?還是想用Statement ?這兩個都可以使用,你使用任何一個都可以。
但是你只是創建了這兩個對象並沒有執行插入數據庫的動作啊,你需要調用.execute()方法來執行這條sql語句。
而且這個地方:String url = "jdbc:mysql://localhost/bbs?user=root&password=8888";
貌似少了端口號吧?
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved