DAO是一个操作数据库的设计模式(DAO是一种访问数据库的设计模式,大概的思路就是将对一个数据库(和一个数据表)的操作封装到一个类中,由其他的类来调用这个类的方法完成对数据库的操作,这样可以简化负责业务处理的类的复杂性和耦合性)
一个Dao模式应该包含以下几点:
- VO:Value Object 创建一个类,该类中只有属性值,并且属性值对应数据表中的所有字段
- Dao接口:Data Access Object 这是一个接口,接口中有对数据库进行操作的方法
- dao接口的实现类:具体封装了对数据库的操作方法
- (dao工厂)
VO对象public class Book { private Integer bookid; private String bookName; private Integer price; public Integer getBookid() { return bookid; } public void setBookid(Integer bookid) { this.bookid = bookid; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public Book(String bookName, Integer price) { super(); this.bookName = bookName; this.price = price; } @Override public String toString() { return "Book [ bookid= " + bookid + "\t bookName=" + bookName + "\t price=" + price + " ]"; } public Book() { super(); } }
baseDao类(因为有很多对数据库操作相同的代码块,所以提取出来,便于以后的修改)
dao接口import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; /** * 基础的Dao类 * @author dingshuangen * */ public class BaseDao { private static final String URL="jdbc:mysql://localhost:3306/jdbc"; private static final String USER="root"; private static final String PASSWORD="0325"; /** * 封装获得连接的方法 * @return */ public Connection getConnection() { Connection conn=null; try { //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //获得连接 conn=DriverManager.getConnection(URL, USER, PASSWORD); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 封装对继承AutoCloseable接口类的关闭操作 * @param object */ public void close(AutoCloseable object) { if(object!=null) { try { object.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 执行sql语句,可变参数为sql语句中需要的参数 * @param sql * @param objs */ public void executeSql(String sql,Object...objs) { Connection conn=this.getConnection(); PreparedStatement ps=null; try { ps=conn.prepareStatement(sql); //循环为每一个变量设置参数 for(int i=0;i
import java.util.List; import com.oracle.vo.Book; /** * BookDao的接口,具有查询插入删除更新的功能 * @author dingshuangen * */ public interface BookDao { //插入书籍信息 public void save(Book book); //更新书籍信息 public void update(Book book); //按照bookid删除对应书籍 public void delete(Integer bookid); //查询所有书籍信息 public List
getAllBook(); //根据bookid查询对应的书籍信息 public Book getByBookid(Integer bookid); //根据页数查询,每页显示number条记录 public List getByPage(Integer page,Integer number); }
dao接口的具体实现类同时继承了baseDao类import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.oracle.vo.Book; public class BookDaoImpl extends BaseDao implements BookDao { //插入记录 @Override public void save(Book book) { this.executeSql("insert into tb_book values(null,?,?)", book.getBookName(),book.getPrice()); } //更新记录 @Override public void update(Book book) { this.executeSql("update tb_book set bookname=?,price=? where bookid=?", book.getBookName(),book.getPrice(),book.getBookid()); } //删除记录 @Override public void delete(Integer bookid) { this.executeSql("Delete from tb_book where bookid=?", bookid); } //查询所有记录 @Override public List
getAllBook() { List list=new ArrayList (); Connection conn=this.getConnection(); PreparedStatement ps=null; ResultSet rs=null; try { //查询出所有的记录,按照bookid排序 ps=conn.prepareStatement("select bookid,bookname,price from tb_book order by bookid"); rs=ps.executeQuery(); while(rs.next()) { Book b=new Book();//创建一个vo对象存储记录的信息 b.setBookid(rs.getInt("bookid")); b.setBookName(rs.getString("bookname")); b.setPrice(rs.getInt("price")); list.add(b);//每条记录添加到list中 } return list; }catch(Exception e) { e.printStackTrace(); }finally { this.close(rs); this.close(ps); this.close(conn); } return list; } //根据id查询单条记录 @Override public Book getByBookid(Integer bookid) { Connection conn=this.getConnection(); PreparedStatement ps=null; ResultSet rs=null; Book b=new Book(); try { ps=conn.prepareStatement("select bookid,bookname,price from tb_book where bookid=?"); ps.setInt(1, bookid); rs=ps.executeQuery(); if(rs.next()) { b.setBookid(rs.getInt("bookid")); b.setBookName(rs.getString("bookname")); b.setPrice(rs.getInt("price")); } return b; }catch(Exception e) { e.printStackTrace(); }finally { this.close(rs); this.close(ps); this.close(conn); } return b; } //分页查找 @Override public List getByPage(Integer page, Integer number) { List list=new ArrayList (); Connection conn=this.getConnection(); PreparedStatement ps=null; ResultSet rs=null; try { ps=conn.prepareStatement("select bookid,bookname,price from tb_book order by bookid limit ?,?"); ps.setInt(1,(page-1)*number); ps.setInt(2, number); rs=ps.executeQuery(); while(rs.next()) { Book b=new Book(); b.setBookid(rs.getInt("bookid")); b.setBookName(rs.getString("bookname")); b.setPrice(rs.getInt("price")); list.add(b); } return list; }catch(Exception e) { e.printStackTrace(); }finally { this.close(rs); this.close(ps); this.close(conn); } return list; } }