1. 程式人生 > >DAO模式實現MySQL資料庫對資料的查詢

DAO模式實現MySQL資料庫對資料的查詢

1. 前言

  在本人開發的一個系統中需要提供註冊和登陸系統,自然需要有使用者管理,對使用者需要進行基礎的增刪改查,DAO是常用的設計模式之一,對資料訪問進行抽象,可以大大減低不同的資料庫之間移植的工作量,本文主要根據本人實現自己DAO模型的過程,講述DAO設計模式以及本人是如何使用DAO實現對資料的訪問的。

2. DAO設計模式

  DAO全程是Data Access Object,是J2EE核心模式之一,主要用於上層應用程式與持久化機制之間的中間層,對於底層的資料庫持久化,其各部分關係答題如下:
使用DAO的好處是可以使上下的各個模組相對獨立,只要DAO的介面不變化,即使上層的應用程式碼或者底層的持久層的實現頻繁變化,相互之間幾乎沒有影響。 使用DAO設計模式的時候需要注意的是儘量不要讓底層的實現洩露給上層,DAO的核心是DAO介面(interface),DAO由以下幾個部分組成:     DatabaseConnection: 
專門負責資料庫的開啟與關閉的類。     VO:主要由屬性、setter、getter方法組成,VO類中的屬性與表中的欄位相對應,每個VO類的物件都表示表中的一條記錄。     DAO:主要定義操作的介面,定義一系列資料庫的原子性操作標準,如增加、修改、刪除、插入、按照ID查詢等。     Impl:DAO介面的真實實現類,完成具體的資料庫操作,但是不負責資料庫的開啟和關閉。     Proxy:代理實現類,主要完成資料庫的開啟和關閉,並且呼叫真實實現類物件的操作。     Factory:工廠類,通過工廠類取得一個DAO 的例項化物件。

3. 編碼實現

    下面我們實現一個對使用者進行增刪改查的DAO樣例,各個包的含義如下:      ebs.dao.factory:
裡面主要存放獲取資料庫連線例項的工廠類      ebs.dao.proxy:   DAO的代理實現      ebs.dao.user:    DAO的實現      ebs.dbc.DBConnection: 主要存放資料庫連線相關的實現類      ebs.system.vo: 主要存放VO類的實現      即,如下:       資料庫表User結構如下:
下面講解程式碼的具體實現,DAO模式的核心是DAO介面的設計,首先看一下底層資料庫連線的實現: 首先,在IDBConnection.java中實現資料庫連線的介面:
package ebs.dbc.DBConnection;

import java.sql.Connection;

public interface IDBConnection {
	public Connection getConnection();
	public void close() throws Exception;
}
介面可以有多種實現,由於目前我用的是MySQL資料庫所以我按照MySQL的API實現對應的資料庫連線類,後續移植到Oracle等資料庫上的時候只要替換這個類的實現就OK了,上層的應用程式無需修改,因為上層是通過介面IDBConnection來操作資料庫連線的。 MySQLDBConnection.java 實現如下:
package ebs.dbc.DBConnection;

import java.sql.Connection;
import java.sql.DriverManager;

public class MySQLDBConnection implements IDBConnection {
	public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
	public static final String DBURL = "jdbc:mysql://localhost:3306/mldn";
	public static final String DBUSER = "root";
	public static final String DBPASSWD = "root";
	private Connection conn = null;
	
	public MySQLDBConnection() throws Exception {
		try {
			Class.forName(DBDRIVER);
			this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWD);
		} catch (Exception e) {
			throw e;
		}
	}
	
	public Connection getConnection() {
		return this.conn;
	}
	
	public void close() throws Exception {
		if (this.conn != null) {
			try {
				this.conn.close();
			} catch (Exception e) {
				throw e;
			}
		} 
	}
}

下面是資料庫的工廠類,通過工廠類可以獲取資料庫的連線例項: DBConnectionFactory.java
package ebs.dao.factory;

import ebs.dbc.DBConnection.MySQLDBConnection;

public class DBConnectionFactory {
	private static MySQLDBConnection dbc = null;
	public static MySQLDBConnection getDatabaseConnection() throws Exception {
		if (dbc == null) {
			try {
				dbc = new MySQLDBConnection();
			} catch (Exception e) {
				throw e;
			}
		}
		return dbc;
	}
}
上面基本上就是資料庫連線實現的全部了,下面要實現使用者操作相關的DAO,首先實現VO類User.java:
package ebs.system.vo;

import java.util.Date;

public class User {
	
	private int id;
	private String username;
	private String nickname;
	private String email;
	private Date reg_time;
	private String passwd;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getReg_time() {
		return reg_time;
	}
	public void setReg_time(Date reg_time) {
		this.reg_time = reg_time;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
}

下面要定義的就是DAO的核心,DAO介面,要設計好自己打算在DAO中提供哪些服務, IUserDAO.java:
package ebs.dao.user;

import java.util.List;

import ebs.system.vo.User;

public interface IUserDAO {
	
	public boolean doCreate(User user) throws Exception;

	public boolean doDelete(int id) throws Exception;

	public boolean doModify(User user) throws Exception;

	public List<User> findAll(String keyWord) throws Exception;

	public User findById(int id) throws Exception;
}
下面實現這個介面, UserDAOImpl.java:
package ebs.dao.user;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import ebs.system.vo.User;

public class UserDAOImpl implements IUserDAO {

	private Connection conn = null;
	private PreparedStatement pstmt = null;
	
	public UserDAOImpl(Connection conn) {
		this.conn = conn;
	}
	
	@Override
	public boolean doCreate(User user) throws Exception {
		boolean flag = false;
		String sql = "INSERT INTO user(username, nickname, email, reg_time, passwd) VALUES(?, ?, ?, ?, ?);";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setString(1, user.getUsername());
		this.pstmt.setString(2, user.getNickname());
		this.pstmt.setString(3, user.getEmail());
		this.pstmt.setDate(4, new java.sql.Date(System.currentTimeMillis()));
		this.pstmt.setString(5, user.getPasswd());
		if (this.pstmt.executeUpdate() > 0) {
			flag = true;
		}
		this.pstmt.close();
		return flag;
	}

	@Override
	public boolean doDelete(int id) throws Exception {
		boolean flag = false;
		String sql = "DELETE FROM user WHERE id=?";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setInt(1, id);
		if (this.pstmt.executeUpdate(sql) > 0) {
			flag = true;
		}
		this.pstmt.close();
		return flag; 
	}

	@Override
	public boolean doModify(User user) throws Exception {
		boolean flag = false;
		String sql = "UPDATE USER SET username=?, nickname=?, email=?, passwd=? WHERE id=?;";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setString(1, user.getUsername());
		this.pstmt.setString(2, user.getNickname());
		this.pstmt.setString(3, user.getEmail());
		this.pstmt.setString(4, user.getPasswd());
		this.pstmt.setInt(5, user.getId());
		if(this.pstmt.executeUpdate(sql) > 0) {
			flag = true;
		}
		this.pstmt.close();
		return flag;
	}

	@Override
	public List<User> findAll(String keyWord) throws Exception {
		List<User> userlist = new ArrayList<User>();
		String sql = "SELECT username, nickname, email, reg_time, passwd FROM user WHERE username LIKE ? OR nickname LIKE ?;";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setString(1, keyWord);
		this.pstmt.setString(2, keyWord);
		ResultSet rs = this.pstmt.executeQuery(sql);
		User user = null;
		while(rs.next()) {
			user = new User();
			user.setUsername(rs.getString(1));
			user.setNickname(rs.getString(2));
			user.setEmail(rs.getString(3));
			user.setReg_time(rs.getDate(4));
			user.setPasswd(rs.getString(5));
			userlist.add(user);
		}
		this.pstmt.close();		
		return userlist;
	}

	@Override
	public User findById(int id) throws Exception {
		User user = null;
		String sql = "SELECT username, nickname, email, reg_time, passwd FROM user WHERE id=?;";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setInt(1, id);
		ResultSet rs = this.pstmt.executeQuery(sql);
		if(rs.next()) {
			user.setUsername(rs.getString(1));
			user.setNickname(rs.getString(2));
			user.setEmail(rs.getString(3));
			user.setReg_time(rs.getDate(4));
			user.setPasswd(rs.getString(5));
		}
		this.pstmt.close();
		return user;
	}

}
下面是DAO的代理類的實現,代理類其實是包裝了DAO的真實實現類,UserDAOProxy.java:
package ebs.dao.proxy;

import java.util.List;

import ebs.dao.factory.DBConnectionFactory;
import ebs.dao.user.IUserDAO;
import ebs.dao.user.UserDAOImpl;
import ebs.dbc.DBConnection.IDBConnection;
import ebs.system.vo.User;

public class UserDAOProxy implements IUserDAO {
	
	private <strong>IDBConnection</strong> dbc = null;
	private <strong>IUserDAO</strong> user = null;
	public UserDAOProxy() throws Exception {
		this.dbc = (IDBConnection)DBConnectionFactory.getDatabaseConnection();
		this.user = new UserDAOImpl(dbc.getConnection());
	}

	@Override
	public boolean doCreate(User user) throws Exception {
		boolean flag = false;
		try {
			flag = this.user.doCreate(user);
		} catch (Exception e) {
			throw e;
		} finally {
			this.dbc.close();
		} 
		return flag;
	}

	@Override
	public boolean doDelete(int id) throws Exception {
		boolean flag = false;
		try {
			flag = this.user.doDelete(id);
		} catch (Exception e) {
			throw e;
		} finally {
			this.dbc.close();
		}
		return flag;
	}

	@Override
	public boolean doModify(User user) throws Exception {
		boolean flag = false;
		try {
			flag = this.user.doModify(user);
		} catch (Exception e) {
			throw e;
		} finally {
			this.dbc.close();
		}
		return flag;
	}

	@Override
	public List<User> findAll(String keyWord) throws Exception {
		List<User> userlist = null;
		try {
			userlist = this.user.findAll(keyWord);
		} catch (Exception e) {
			throw e;
		} finally {
			this.dbc.close();
		}
		return userlist;
	}

	@Override
	public User findById(int id) throws Exception {
		User user = null;
		try {
			user = this.user.findById(id);
		} catch (Exception e) {
			throw e;
		} finally {
			this.dbc.close();
		}
		return null;
	}
}

這類需要仔細檢視的是DAO是如何獲取資料庫連線的,以及如何獲取DAO的真實實現的例項的。

4. 參考資料

相關推薦

DAO模式實現MySQL資料庫資料查詢

1. 前言   在本人開發的一個系統中需要提供註冊和登陸系統,自然需要有使用者管理,對使用者需要進行基礎的增刪改查,DAO是常用的設計模式之一,對資料訪問進行抽象,可以大大減低不同的資料庫之間移植的工作量,本文主要根據本人實現自己DAO模型的過程,講述DAO設計模式以及本人

用java實現MySql資料庫資料的讀取、插入、修改和刪除

目標: 1、實現eclipse同資料庫的連線 2、在eclipse中用java實現對資料庫的控制 初學java和資料庫,本文是參考這篇文章的思路的學習筆記,程式碼實現了將4個控制函式(讀取、插入、修改和刪除)分別寫成4個靜態方法呼叫。 1. 關於java和MySQL的連

JSP實現HTML網頁Mysql資料庫資料修改

<% request.setCharacterEncoding("utf-8"); String msg=""; String msg1=""; boolean error=false; 獲取網址中傳遞的Id String origId = request.getParameter("pid"); S

java程式碼實現MySQL資料庫表千萬條資料去重

  準備工作: 1.資料庫表:datatest5 2.欄位: id 主鍵自增,val 重複值欄位併為val建立索引 3.設定innodb緩衝池大小 show variables like "%_buffer%"; SET GLOBAL innod

[Django]在資料庫有表,但是沒有model的情況下資料查詢,修改

文章目錄連線資料庫查詢資料庫更新資料庫 連線資料庫 from django.db import connection sql = "SELECT id,record_time,lose_time

8、mysql資料庫多表查詢資料並集、內連線、左連結、右連結、全連線)

目錄 1 內連線 場景:A和B資料 的交集 2 左連結 場景1:得到 “AB交集後和A“ 的並集  (得到A的所有資料+滿足某一條件的B的資料) 場景2:得到A減去AB的交集  (A中所有資料減去同時滿足B某一條件的資料) 3 右連結 場景1:得到“A

Unity3D資料視覺化控制元件的簡單實現-Mysql資料庫

    專案實現的是比較簡易的資料視覺化,用到Mysql資料庫和Unity3D中的Graph_Maker.    直接上實現圖,通過輸入資料庫名、賬號、密碼、資料表名跳轉    展示效果為Graph_Maker中的折線圖,X軸和Y軸座標內容可以手動更改,滑鼠指標滑動到資料點時

mysql 資料庫rand() 隨機查詢10條資料 整理

網上找了好多看了還不是很明白,為了專案進度拿過來直接用。害怕以後還需要。好找一些,放在這裡。若要在i ≤ R ≤ j 這個範圍得到一個隨機整數R ,需要用到表示式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的範圍(包括7和12

mysql資料庫空格的查詢處理

結論:查詢條件中建議對字串做trim處理,在資料入庫的時候最好也做trim處理。 example1: 表裡面的欄位值都不帶空格,where查詢條件裡面帶或不帶空格。 例如:key=‘test’

27.logstash-output-mongodb實現Mysql到Mongodb資料同步(ES與非關係型資料庫同步)

本文主要講解如何通過logstash-output-mongodb外掛實現Mysql與Mongodb資料的同步。源資料儲存在Mysql,目標資料庫為非關係型資料庫Mongodb。0、前提1)已經安裝好源資料庫:Mysql; 2)已經安裝好目的資料庫:Mongodb; 3)已經

Windows下實現Mysql資料庫版本更換、資料遷移

本文是基於MySql5.6.20版本實現 說明:本人之前已經裝了一個mysql-5.5.18的版本。下面先介紹如何在裝一個mysql,實現兩兩同時工作不衝突,其實是可以同時裝3、4個都是沒有問題的,看你需要了。 第一步:準備工作,首先下一個mysql資料。我在官網下的是M

MySQL資料庫學習06-查詢資料:排序和分組

一、對查詢結果排序 MySQL中可以使用ORDER BY子句對查詢到的結果進行排序。 1.單列排序 a.查詢f_name欄位,按照字母排序 2.多列排序 ORDER BY子句也可以實現對多列資料進行排序,需要將待排序的列之間用逗號隔開。對多列排序是

MySQL資料庫資料表的基本操作

初學小建議 MySQL是不區分大小寫的,大家在初學的時候希望能養成習慣,把保留詞,關鍵字統一採用大寫的形式書寫,其他的使用小寫字母,方便區分。 初期這個習慣可能不太容易養成,但是一旦習慣,對工作的規範性會好很多,統一的規範方便大家一起工作! 選單

使用Docker實現MySql資料庫在容器中的主從配置(詳解)

使用Docker容器搭建MySql主從複製 關於如何建立映象,我的部落格中有詳細的步驟文件 檢視容器ip命令為docker inspect 96fd[id前四位] Master_mysql_ip_172.17.0.4 slave_mysql_ip_172.17.0.5 1.docker上面尋

java實現mysql資料庫增刪改查

1.連線資料庫: import java.sql.Connection; import java.sql.DriverManager; public class DBConnection { static String driver = "com.mysql.jdbc.Driver"; s

資料庫定時備份原理,實現MySQL資料庫的實時備份

www.syncnavigator.cn SyncNavigator 做資料同步時所支援的資料庫型別: 支援sqlserver 2000-2014所有版本,全相容,和MYsql 4.x 、MYsql 5.x 、MYsql 6.x版本。 來源資料庫和目標資料庫可以版本不同,比如:來源資料庫

shell指令碼 連線資料庫 新增資料 查詢資料 連線不同資料庫 shell日期獲取 格式三分鐘前 上週 昨天修改

註釋:shell 單括號運算子號:a=$(date);等同於:a=`date` 雙括號運算子:a=$((1+2));echo $a;等同於:a=`expr 1 + 2` 東西有點多,就一起都講了。   日期格式: 獲取當前日期:1,date "+%Y-%m-%d %

scrapy框架 基於mysql資料庫儲存資料方法、案例

流程思路 將解析資料存到items物件 使用yield 將items交給管道檔案處理 在管道檔案pipelines編寫程式碼儲存到資料庫 在setting配置檔案開啟管道 案例 items中 按照格式定義欄位 import s

mysql資料庫資料約束

/*資料約束*/    CREATE TABLE user01 (    uid INT NOT NULL,/*非空約束*/   PRIMARY KEY  /*主鍵約束*/  AUTO_INCREMENT /*

一步一步學MySQL----12 分組資料查詢

12.1 簡單分組查詢 語法: select function() from table_name where condition group by field; 例如: mysql> select * from employee group