DAO模式入门
1.什么是DAO模式
DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的业务逻辑分开,此模式的主要作用是封装对数据库的各种操作;
2.DAO模式的组成部分
- VO:值对象,此对象只包含属性,而没有方法;代表数据库中表中的一条记录,一个VO与一个表是相对应的
- DAO接口:定义对某个VO的所有操作
- DAO实现类:DAO接口的具体实现
- DAO工厂类:用来创建出DAO对象(可以没有)
3.案例代码
项目结构
说明
- Book:图书表的VO类
- BaseDao:所有DAO的父类,封装了所有DAO中可以使用的的通用方法
- BookDao:图书的数据访问接口,定义了对图书表操作的所有方法
- BookDaoImp:BookDao的实现类;
- DaoTest:测试方法
4.部分代码
book.java
package com.oracle.vo;
public class Book {
private Integer isbn; //图书编号
private String bookName;//书名
private Integer price;//价格
@Override
public String toString() {
return "Book [isbn=" + isbn + ", bookName=" + bookName + ", price=" + price + "]";
}
public Integer getIsbn() {
return isbn;
}
public void setIsbn(Integer isbn) {
this.isbn = isbn;
}
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;
}
public Book() {
super();
}
}
BaseDao.java
/**
* 所有Dao的父类
*/
package com.oracle.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;
public class BaseDao {
//获得连接
public Connection getConnection() {
Connection conn=null;
try {
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/books","root","tiger");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭资源
* @param auto,jdk7后的接口
*/
public void close(AutoCloseable auto) {
if(auto!=null) {
try {
auto.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 动态执行sql
* @param sql:预编译的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<objs.length;i++) {
ps.setObject(i+1, objs[i]);
}
//执行sql
ps.execute();
}catch(Exception e) {
e.printStackTrace();
}finally {
this.close(ps);
this.close(conn);
}
}
/**
* 执行一条select语名,并且将返回结果封装到List中,每条记录对一个Map
* @param sql:sql查询语句,可带参数(?)
* @param objs:可变参数
* @return
*/
public List<Map<String,Object>> executeQuery(String sql,Object...objs){
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
Connection conn=this.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
try {
ps=conn.prepareStatement(sql);
for(int i=0;i<objs.length;i++) {
ps.setObject(i+1, objs[i]);
}
//执行查询
rs=ps.executeQuery();
//获得元数据
ResultSetMetaData rsmd=rs.getMetaData();
//将每条记录转成一个Map,key是列名,value是字段值
while(rs.next()) {
Map<String,Object> map=new HashMap<String,Object>();
for(int i=1;i<=rsmd.getColumnCount();i++) {
map.put(rsmd.getColumnLabel(i), rs.getObject(i));
}
list.add(map);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
this.close(rs);
this.close(ps);
this.close(conn);
}
return list;
}
}
BookDao.java
package com.oracle.dao;
import java.util.List;
import com.oracle.vo.Book;
public interface BookDao {
//插入图书
public void save(Book book);
//修改图书
public void update(Book book);
//删除图书
public void delete(int isbn);
//查询所有图书
public List<Book> getAll();
//根据图书编号获得图书
public Book getBookById(int isbn);
//分页查询图书
public List<Book> getAllByPage(int pageNumber,int pageSize);
}
BookDaoImpl.java
package com.oracle.dao;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.oracle.vo.Book;
public class BookDaoImpl extends BaseDao implements BookDao {
@Override
/**
* 插入图书
*/
public void save(Book book) {
this.executeSql("insert into book values(null,?,?)", book.getBookName(),book.getPrice());
}
@Override
/**
* 修改图书
*/
public void update(Book book) {
this.executeSql("update book set bookName=?,price=? where isbn=?", book.getBookName(),book.getPrice(),book.getIsbn());
}
@Override
/**
* 删除图书
*/
public void delete(int isbn) {
this.executeSql("delete from book where isbn=?", isbn);
}
@Override
/**
* 获得所有的图书
*/
public List<Book> getAll() {
return this.convert(this.executeQuery("select isbn,bookName,price from book"));
}
@Override
/**
* 根据主键获得唯一的图书
*/
public Book getBookById(int isbn) {
List<Book> list=this.convert(this.executeQuery("select isbn,bookName,price from book where isbn=?",isbn));
return list.isEmpty()?null:list.get(0);
}
@Override
/**
* 分页查询
*/
public List<Book> getAllByPage(int pageNumber, int pageSize) {
return this.convert(this.executeQuery("select isbn,bookName,price from book order by isbn limit ?,?",(pageNumber-1)*pageSize,pageSize));
}
/**
* 将Map转成Book
* @param list
* @return
*/
private List<Book> convert(List<Map<String,Object>> list){
List<Book> bList=new ArrayList<Book>();
for(Map<String,Object> map:list) {
Book b=new Book();
b.setIsbn((Integer)map.get("isbn"));
b.setBookName(map.get("bookName").toString());
b.setPrice((Integer)map.get("price"));
bList.add(b);
}
return bList;
}
}
DaoTest.java
package com.oracle.test;
import java.util.List;
import com.oracle.dao.BookDao;
import com.oracle.dao.BookDaoImpl;
import com.oracle.vo.Book;
public class DaoTest {
public static void main(String[] args) {
BookDao dao = new BookDaoImpl();
// 插入图书测试
Book book = new Book("把球交给薛庭政", 3);
dao.save(book);
//修改图书
book.setIsbn(5600);
book.setBookName("大话数据结构");
dao.update(book);
// 删除图书
dao.delete(569);
// 查询所有图书
List<Book> list = dao.getAll();
for (Book b : list) {
System.out.println(b);
}
System.out.println("---------");
// 查询一本图书
System.out.println(dao.getBookById(666));
//分页查询
list = dao.getAllByPage(2, 5);
for (Book b : list) {
System.out.println(b);
}
}
}
源码下载