Data Access Object

DAO模式用于数据存取对象,实现数据持久化的概念。通过JDBC封装提高代码可读性和复用性,降低耦合。封装步骤包括定义实体类、抽离接口、创建BaseDAO和实现接口。使用Properties文件进行配置,并在实体类中遵循特定设计原则,如使用private属性、getter/setter方法、无参构造和实现Serializable接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DAO模式(Data Access Object(数据存取对象) )

数据持久化的概念

将程序中的数据在瞬时状态和持久状态间转换的机制即为数据的持久化

JDBC封装

1.提高可读性

2.利于后期维护与修改

3.增强代码的复用性

4.降低代码之间的耦合

5.隔离业务逻辑代码与数据库访问代码

6.隔离不同的数据库的实现

JDBC封装步骤

定义实体类
public class Pet{
private int id;// 宠物id
private int masterId;// 主人id
private String name;// 昵称
……
public int getId(){
	return id;
}
public void setId(int id){
	this.id = id;
}
……
}

对实体类的所有操作抽取成接口
public interface PetDao{
    int save(Pet pet);
    int del(Pet pet);
    int update(Pet pet);
    Pet getByName(String name);
    List<Pet> findByName(String name);
    List<Pet> findByType(String type);}

创建BaseDAO(待改良)
public class BaseDao{
private  String driver = " com.mysql.jdbc.Driver";
        private   String url = "jdbc:mysql://localhost:3306/epet";      
         … …
        public  Connection getConnection() {
		   … …
              Class.forName(driver);
	       conn = DriverManager.getConnection(url, user, password);
	       … …
	       return conn;
       }
      public void closeAll(Connection conn, Statement stmt,ResultSet rs) {
       if(rs != null) rs.close();
	   if(stmt != null)stmt.close();
	   … …
}
    public int exceuteUpdate (String preparedSql, Object[] param) {
         … …
         conn =  getConnection(); 
         try {
	 pstmt = conn.prepareStatement(preparedSql);
	 if (param != null) {
	        for (int i = 0; i < param.length; i++) {
                               //为预编译sql设置参数
		 pstmt.setObject(i + 1, param[i]); 
	        }
	 }
	 num = pstmt.executeUpdate(); 
          } … …
 }

}

实现类实现接口并继承数据库工具类
public class PetDaoMySQLImpl2 extends BaseDao implements PetDao{
    //更新宠物状态
	public int update(Pet pet) {	
		String sql="update pet set status=0 where id=?";
		Object[] param={pet.getId()};
		int result=this.exceuteUpdate(sql, param);
		return result;
	}
	//省略实现PetDao的其他方法
}


使用Properties类

添加.properties文件
调用properties方法
String getProperty(String key)//用指定的键在此属性列表中搜索属性。通过参数key得到其所对应的值
Object setProperty(String key,String value)//调用Hashtable的方法put。通过调用基类的put()方法来设置键-值对
void load(InputStream inStream)//从输入流中读取属性列表 (键和元素对)。通过对指定文件进行装载获取该文件中所有键-值对
void clear()//清除所装载的键-值对,该方法由基类Hashtable提供

改良后的BaseDAO

public class BaseDao {
	//省略变量定义代码……	
	static{
		init();}
	public static void init(){
			Properties params=new Properties();
			String configFile = "database.properties";
			InputStream is=BaseDao.class.getClassLoader()
                                .getResourceAsStream(configFile);
			try {
				params.load(is);
			} catch (IOException e) {//….}
			driver=params.getProperty("driver");
			url=params.getProperty("url");
			user=params.getProperty("user");
			password=params.getProperty("password");
		} //省略其他方法代码……}

使用实体类传递数据注意点

属性一般使用private修饰
提供public修饰的getter/setter方法
实体类提供无参构造方法,根据业务提供有参构造
实现java.io.Serializable接口,支持序列化机制

如果不实现这个接口,在某些数据持久框架下进行数据持久化会出现问题。hibernate就是这样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图图大魔王_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值