本篇文章将会讲解什么是DAO,如何和数据库连接,VO类,DAO接口,DAO实现和DAO工厂类
DAO设计模式是数据J2EE数据层的操作,使用DAO可以简化大量代码,增强可移植性
一.DAO各部分详解
DAO包括五个部分,分为数据库连接、VO、DAO接口、DAO实现类和DAO工厂类
1.数据库连接类
//连接MySQL数据库的示例:
import java.sql.*;
public class DataBaseConnection{
//定义数据库驱动类
private final String DBDRIVER = "com.mysql.jdbc.Driver";
//定义数据库连接URL
private final String DBURL = "jdbc:mysql://localhost:3306/test";
//定义数据库连接用户名
private final String DBUSER = "root";
//定义密码
private final String DBPASSWORD = "0000";
//定义连接对象
private Connection conn = null;
//构造方法,加载驱动
public DataBaseConnection(){
try{
Class.forName(DBDRIVER);
this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
}catch(Exception e){
System.out.println("加载驱动失败");
}
}
//取得数据库连接
public Connection getConnection(){
return conn;
}
//关闭数据库
public void close(){
try{
conn.close();
}catch(Exception e){
System.out.println("数据库连接失败");
}
}
}
2.VO类
VO类是一个包含属性和表中字段完全对应的类,并在该类中提供set和get方法来获取属性
//一个User类的示例
public class User{
private int userid;
private String username;
private String password;
public int getUserid(){
return userid;
}
public void setUserid(int userid){
this.userid = userid;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}
}
3.DAO接口
DAO接口中定义了所有的用户的操作,如添加记录,删除,查询等,但接口只是定义,在实现类中实现
//一个接口示例:
import java.util.*;
public interface UserDAO{
public void insert(User user) throws Exception;
public void update(User user) throws Exception;
public void delete(int userid) throws Exception;
public User queryById(int userid) throws Exception;
public List queryAll() throws Exception;
}
4.DAO实现类
DAO实现类实现了DAO的接口,并实现了DAO接口中定义的所有方法
//一个DAO实现类的示例
import java.sql.*;
import java.util.*;
public class UserDAOImpl implements UserDAO{
//添加操作
public void insert(User user) throws Exception{
String sql = "INSERT INTO user(username,password) VALUES (?,?)";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
//对数据库的操作
try{
//连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setString(1,user.getUsername());
pstmt.setString(2,user.getPassword());
//数据库更新操作
pstmt.executeUpdate();
pstmt.close();
}catch(Exception e){
throw new Exception("操作异常");
}finally{
//关闭数据库
dbc.close();
}
}
//修改操作
public void update(User user) throws Exception{
String sql = "UPDATE user SET username=?, password=? WHERE userid=? ";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
//对数据库的操作
try{
//连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setString(1,user.getUsername());
pstmt.setString(2,user.getPassword());
pstmt.setInt(3,user.getUserid());
//数据库更新操作
pstmt.executeUpdate();
pstmt.close();
}catch(Exception e){
throw new Exception("操作异常");
}finally{
//关闭数据库
dbc.close();
}
}
//删除操作
public void delete(int userid) throws Exception{
String sql = "DELETE FROM user WHERE userid=?";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
//对数据库的操作
try{
//连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStstement(sql);
pstmt.setInt(1,userid);
//数据库更新操作
pstmt.executeUpdate();
pstmt.close();
}catch(Exception e){
throw new Exception("操作异常");
}finally{
//关闭数据库
dbc.close();
}
}
//按ID查询
public User queryById(int userid) throws Exception{
User user = null;//保存的user
String sql = "SELECT * FROM user WHERE userid=?";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
//对数据库的操作
try{
//连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStstement(sql);
pstmt.setInt(1,userid);
//数据库查询操作
ResultSet rs = pstmt.executeUpdate();
if(rs.next()){
//查询出内容,给user对象
user = new User();
user.setUserid(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
}
rs.close();
pstmt.close();
}catch(Exception e){
throw new Exception("操作异常");
}finally{
//关闭数据库
dbc.close();
}
}
}
5.DAO工厂类
在没有DAO工厂类的情况下必须创建DAO实现类的实例才能完成数据库操作。这时就必须知道具体的子类,对于后期的修改非常不便。使用DAO工厂类可以方便管理。
//一个DAO工厂类的示例:
public class DAOFactory{
public static UserDAO getUserDAOInstance(){
return new UserDAOImpl();
//返回一个UserDAO的实例
}
}
此时就可以利用DAO工厂类对数据库完成更简单的增删改查:
//增加
<%
UserDAO userDAO = DAOFactory.getUserDAOInstance();
/**设置需要添加的用户*/
User user = new User();
user.setUsername("dao");
user.setPassword("123");
userDAO.insert(user);
%>
//更新
<%
UserDAO userDAO = DAOFactory.getUserDAOInstance();
/**设置需要更新的用户*/
User user = new User();
user.setUserid(14);
user.setUsername("dao");
user.setPassword("123456");
userDAO.update(user);
%>
//删除
<%
UserDAO userDAO = DAOFactory.getUserDAOInstance();
userDAO.delete(14);
//可见删除操作很简便
%>
//按ID查询
<%
UserDAO userDAO = DAOFactory.getUserDAOInstance();
User user = userDAO.queryById(2);
out.println("用户:"+user.getUsername());
out.println("密码:"+user.password());
%>
在J2EE中,DAO设计模式非常重要,甚至将其作为一个单独的层:DAO层