Java DAO模式

DAO模式是一种数据访问模式,它将数据库操作与业务逻辑分离,提供面向对象的数据访问接口,实现了数据访问代码和业务逻辑的隔离,以及不同数据库实现的隔离。这种模式有利于降低耦合性,提高代码复用性和系统可移植性。主要组成部分包括DAO接口、实现类、实体类和数据库连接工具类。

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

DAO模式

DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。

对外提供相应的接口

DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。

从以上 DAO 模式使用可以看出,DAO 模式的优势就在于它实现了两次隔离。

  1. 隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。

  2. 隔离了不同数据库实现。采用面向接口编程,如果底层数据库变化,如由 MySQL 变成 Oracle 只要增加 DAO
    接口的新实现类即可,原有 MySQ 实现不用修改。这符合 “开-闭” 原则。该原则降低了代码的藕合性,提高了代码扩展性和系统的可移植性。

一个典型的DAO 模式主要由以下几部分组成

  1. DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。

  2. DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。

  3. 实体类:用于存放与传输对象数据。

  4. 数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。

DAO 接口:

public interface BookDao {
	//增加
	public int addBook(Book book);
	//删除
	public int delBook(int id);
	//更新
	public int updateBook(Book book);
	
	//查询
	public List<Book> getAll();
}

DAO 实现类:

public class BookDaoimpl extends BaseDao implements BookDao {

	@Override
	public int addBook(Book book) {
		// TODO Auto-generated method stub
		String sql = "insert into book values(?,?,?,?,?,?,?)";
		return super.executeUpdate(sql, book.getBid(),book.getbName(),book.getAuthor(),book.getPubComp(),book.getPubDate(),book.getbCount(),book.getPrice());
	} 

	@Override
	public int delBook(int id) {
		String sql = "delete from book where bid = ?";
		return super.executeUpdate(sql, id);
	} 

	@Override
	public int updateBook(Book book) {
		// TODO Auto-generated method stub
		String sql = "update book set bname = ?, author = ?, pubComp = ?, pubDate = ?, bCount = ?, price = ? where bid = ?";
		return super.executeUpdate(sql, book.getbName(),book.getAuthor(),book.getPubComp(),book.getPubDate(),book.getbCount(),book.getPrice(),book.getBid());
	} 
 
	@Override
	public List<Book> getAll() {
		// TODO Auto-generated method stub
		List<Book> list = new ArrayList<Book>();
		String sql = "select * from book";
		Connection conn = super.getConnection();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			Book book;
			while (rs.next()) {
				book = new Book();
				book.setBid(rs.getInt("bid"));
				book.setbName(rs.getString("bName"));
				book.setAuthor(rs.getString("author"));
				book.setPubComp(rs.getString("pubComp"));
				book.setPubDate(rs.getTime("pubDate"));
				book.setbCount(rs.getInt("bCount"));
				book.setPrice(rs.getDouble("price"));
				list.add(book);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return list;
	}
	
}

实体类:

public class Book {
	private int bid;
	private String bName;
	private String author;
	private String pubComp;
	private Date pubDate;
	private int bCount;
	private double price;
	
	public Book(){
		
	}
	
	public Book(int bid, String bName, String author, String pubComp,
			Date pubDate, int bCount, double price) {
		super();
		this.bid = bid;
		this.bName = bName;
		this.author = author;
		this.pubComp = pubComp;
		this.pubDate = pubDate;
		this.bCount = bCount;
		this.price = price;
	}


	public int getBid() {
		return bid;
	}
	
	public void setBid(int bid) {
		this.bid = bid;
	}
	
	public String getbName() {
		return bName;
	}
	
	public void setbName(String bName) {
		this.bName = bName;
	}
	
	public String getAuthor() {
		return author;
	}
	
	public void setAuthor(String author) {
		this.author = author;
	}
	
	public String getPubComp() {
		return pubComp;
	}
	
	public void setPubComp(String pubComp) {
		this.pubComp = pubComp;
	}
	
	public Date getPubDate() {
		return pubDate;
	}
	public void setPubDate(Date pubDate) {
		this.pubDate = pubDate;
	}
	
	
	@Override
	public String toString() {
		return "Book [bid=" + bid + ", bName=" + bName + ", author=" + author
				+ ", pubComp=" + pubComp + ", pubDate=" + pubDate + ", bCount="
				+ bCount + ", price=" + price + "]";
	}

	public int getbCount() {
		return bCount;
	}

	public void setbCount(int bCount) {
		this.bCount = bCount;
	}

	public double getPrice() {
		return price;
	}
	
	public void setPrice(double price) {
		this.price = price;
	}
}

连接数据库:

public class BaseDao {
		private String driver = "com.mysql.jdbc.Driver";
		private String url = "jdbc:mysql://localhost:3306/library";
		//连接
		public Connection getConnection(){
			try {
				Class.forName(driver);
				Connection conn = DriverManager.getConnection(url,"root","sss");
				return conn;
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
		}
		
		//关闭
		public void closeAll(Connection conn, Statement stmt, ResultSet rs){
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
				if (stmt != null) {
					try {
						stmt.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}		
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		//执行增、删、改方法
		public int executeUpdate(String sql, Object...objects){
			//调用连接对象
			Connection conn = this.getConnection();
			PreparedStatement pstmt = null;
			//执行SQL
			try {
				 pstmt = conn.prepareStatement(sql);
				for (int i = 0; i < objects.length; i++) {
					pstmt.setObject(i+1, objects[i]);
				}
				return pstmt.executeUpdate();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			finally{
				this.closeAll(conn,pstmt,null);
			}
			//如果前面出现异常则返回0
				return 0;
		}	
}

测试:

public class TestBook {

	@Test
	public void testQuery() {
		BookDao bookDao = new BookDaoimpl();
		List<Book> list = bookDao.getAll();
		for (Book book :list) {
			System.out.println(book);
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值