DAO(Data Access Objects)设计模式属于JavaEE数据层的操作。
使用DAO设计模式可以简化代码量和提高程序的可移植性
解决问题:
在JDBC操作数据库,都是在JSP页面中写JDBC代码,或者借助于Java Bean实现,这样导致JSP页面中包含大量的HTML代码和Java代码,显示和功能代码混合在一起,难以维护,程序可读性差。
使用DAO设计模式可以很好解决上述问题,JSP页面仅用来做表现层。
图-1DAO的整体设计流程:
JSP -> 工厂模式 -> 具体实现类 -> 完成数据库操作
DAO设计模式组成部分 :
DemoLearn
|-DAO接口
|-DAO实现类
|-DAO工厂类
|-VO类/数据传递对象(值对象)
|-数据库连接类
DAO接口
DAO接口中定义了所有的用户操作(增、删、改、查...);
package DAO_Learn;
import code0729.User;
import java.util.List;
public interface UserDAO {
//增加操作
public void insert(User user)throws Exception;
//修改操作
public void update(User user)throws Exception;
//删除操作
public void delete(User user)throws Exception;
//按ID查询操作
public User queryById(int userid)throws Exception;
//查询全部
public List queryAll()throws Exception;
//模糊查询
public List queryByLike(String keyword)throws Exception;
}
*************************************************************************************
DAO实现类
DAO实现类实现了DAO接口,在DAO实现类中通过【数据库连接类】操作数据库。
package DAO_Learn;
import java.sql.Connection;
import java.sql.PreparedStatement;
/**
* 引入usebean下的Person类
* */
public class UserDAOImpl implements UserDAO{
public void delete(int userid)throws Exception
{
String sql ="delete from user where userid=?";
PreparedStatement preparedStatement =null;
DataBaseConnection dataBaseConnection =null;
//下面是针对数据库的操作
try
{
//连接数据库
dataBaseConnection =new DataBaseConnection();
preparedStatement = dataBaseConnection.getConnection().prepareStatement(sql);
preparedStatement.setInt(1,userid);
// 进行数据库操作
preparedStatement.executeUpdate();
preparedStatement.close();
}
catch (Exception e)
{
throw new Exception("操作出现异常");
}
finally
{
dataBaseConnection.close();
}
}
}
*************************************************************************************
DAO工厂类
DAO工厂类通过自身的一个静态方法来获得实现类的实例,有了DAO工厂类,只需要修改DAO工厂类中的方法代码。
好处:
用户不用知道底层的具体实现,只要操作接口;同时实现前台和后台的分离(当添加新的功能时只要在DAO接口中添加抽象方法,然后在DAOImpl中实现用户所增加的功能,就能完成用户功能的需求)
package DAO_Learn;
public class DAOFactory {
public static UserDAO getUserDAOInstance()
{
return new UserDAOImpl();
}
}
*************************************************************************************
VO类/数据传递对象(值对象)
VO类是一个包含属性与表中字段完全对应的类,在该类中提供【setter and getter】方法来获取该类中的属性。
package DAO_Learn;
public class User {
//用户userID
private int userId;
//用户名userName
private String userName;
//用户密码password
private String password;
//setter and getter
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;
}
}
*************************************************************************************
数据库连接类
数据库连接类(JDBC)通过连接数据库获得连接对象以及关闭数据库...
简便开发,在进行数据库连接时,只要创建该类的实例即可获得数据库连接对象,不必再进行重复操作。
package DAO_Learn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DataBaseConnection {
//数据库驱动以及url
private static final String JDBC_Driver ="com.mysql.jdbc.Driver";
private static final String DB_URL ="jdbc:mysql://localhost:3306/javaweb?encodingCharacter=utf8&useSSL=true";
//数据库用户以及密码
private static final String USER ="root";
private static final String PWD ="mysqladmin";
private Connection connection;
public DataBaseConnection() {
try {
//注册连接数据库驱动
Class.forName(JDBC_Driver);
this.connection =DriverManager.getConnection(DB_URL,USER,PWD);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
public Connection getConnection()
{
return this.connection;
}
public void close()
{
try
{
this.connection.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
*************************************************************************************
网友评论