DAO模式
DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。
对外提供相应的接口
DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。
从以上 DAO 模式使用可以看出,DAO 模式的优势就在于它实现了两次隔离。
-
隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。
-
隔离了不同数据库实现。采用面向接口编程,如果底层数据库变化,如由 MySQL 变成 Oracle 只要增加 DAO
接口的新实现类即可,原有 MySQ 实现不用修改。这符合 “开-闭” 原则。该原则降低了代码的藕合性,提高了代码扩展性和系统的可移植性。
一个典型的DAO 模式主要由以下几部分组成
-
DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。
-
DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
-
实体类:用于存放与传输对象数据。
-
数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。
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);
}
}
}