DAO模式
DAO 是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。
- 位于业务逻辑和持久化数据之间
- 实现对持久化数据的访问
DAO模式的作用
- 隔离业务逻辑代码和数据访问代码
- 隔离不同数据库的实现
DAO模式的组成部分
- DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。
- DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
- 实体类:用于存放与传输对象数据。
- 数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,
方便修改。
DAO模式的实际应用
package dbqn.dao.impl;
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.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
public class BaseDao {
private String driver = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/mybook?useUnicode=true&characterEncoding=utf8";
private String user="root";
private String password="123456";
private static Logger logger = Logger.getLogger(BaseDao.class.getName());
/**
* 连接数据库
*
* @return
*/
public Connection getConnection() {
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}
return null;
}
/**
* 关闭数据库
*
* @param conn
* @param stmt
* @param rs
* @param stat
*/
public void closeAll(Connection conn, Statement stmt, ResultSet rs, PreparedStatement stat) {
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}
if (stmt != null)
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}
if (rs != null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}
if (stat != null)
try {
stat.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}
}
/**
* 增删改
*
* @param sql
* @param objects
* @return
*/
public int executeUpdate(String sql, Object... objects) {
Connection conn = this.getConnection();
PreparedStatement pstmts = null;
try {
pstmts = conn.prepareStatement(sql);
for (int i = 0; i < objects.length; i++) {
pstmts.setObject(i + 1, objects[i]);
}
return pstmts.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
} finally {
this.closeAll(conn, null, null, pstmts);
}
return 0;
}
public List<Map<Object,Object>> executeselect(String sql){
Connection conn = this.getConnection();
PreparedStatement pstmts = null;
ResultSet rs=null;
List<Map<Object,Object>> list = new ArrayList<Map<Object,Object>>();
try {
pstmts=conn.prepareStatement(sql);
rs=pstmts.executeQuery();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while (rs.next()) {
Map<Object,Object> rowData = new HashMap<Object,Object>();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}finally {
this.closeAll(conn, null, rs, pstmts);
}
return null;
}
}
package dbqn.dao.impl;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import dbqu.dao.BookDao;
import dbqu.entity.Book;
import dbqu.urltrafm.transformation;
public class BookDaoImpl extends BaseDao implements BookDao{
transformation trforma=new transformation();
private static Logger logger = Logger.getLogger(BaseDao.class.getName());
@Override
public int addBook(Book book) {
// TODO Auto-generated method stub
String sql ="insert into book values(?,?,?,?,?,?,?)";
return super.executeUpdate(sql, book.getBib(),book.getbName(),book.getAuthor(),book.getPubComp(),book.getPubDate(),book.getInCount(),book.getPrice());
}
@Override
public int delBook(int id) {
// TODO Auto-generated method stub
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=?,inCount=?,price=? where bib=?";
return super.executeUpdate(sql,book.getbName(),book.getAuthor(),book.getPubComp(),book.getPubDate(),book.getInCount(),book.getPrice(),book.getBib());
}
@Override
public List<Book> getAll() {
// TODO Auto-generated method stub
List<Book> list=new ArrayList<Book>();
String sql="select * from book";
Book book;
List<Map<Object,Object>> alist=super.executeselect(sql);
for(Map<Object, Object> str : alist) {
book=new Book();
book.setBib((int)str.get("bid"));
book.setbName((String)str.get("bname"));
book.setAuthor((String)str.get("author"));
book.setPubComp((String)str.get("pubcomp"));
Date date=null;
try {
date = trforma.dateChange((str.get("pubDate")));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}
book.setPubDate(date);
book.setInCount((int)str.get("inCount"));
Double price= trforma.douNumber(str.get("price"));
book.setPrice(price);
list.add(book);
}
return list;
// Connection conn = super.getConnection();
// PreparedStatement pstmts = null;
// ResultSet rs=null;
// try {
// pstmts=conn.prepareStatement(sql);
// rs=pstmts.executeQuery();
// while (rs.next()) {
// book=new Book();
// book.setBib(rs.getInt ("bid"));
// book.setbName (rs.getString ("bname"));
// book.setAuthor (rs.getString ("author"));
// book.setPubComp (rs.getString ("pubcomp"));
// book.setPubDate(rs.getDate("pubDate"));
// book.setInCount (rs.getInt ("inCount"));
// book.setPrice (rs.getDouble ("price"));
// list.add(book);
// }
// return list;
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }finally {
// super.closeAll(conn,null,rs,pstmts);
// }
// return null;
}
}
package dbqu.dao;
import java.util.List;
import dbqu.entity.Book;
public interface BookDao {
/**
* 增加
* @param book
* @return
*/
public int addBook(Book book);
/**
* 删除
* @param id
* @return
*/
public int delBook(int id);
/**
* 更新
* @param book
* @return
*/
public int updateBook(Book book);
/**
* 查询
* @return
*/
public List<Book> getAll();
}
package dbqu.entity;
import java.sql.Date;
public class Book {
private int bib;
private String bName;
private String author;
private String pubComp;
private Date pubDate;
private int inCount;
private double price;
public Book() {
}
public Book(int bib, String bName, String author, String pubComp, Date pubDate, int inCount, double price) {
this.bib = bib;
this.bName = bName;
this.author = author;
this.pubComp = pubComp;
this.pubDate = pubDate;
this.inCount = inCount;
this.price = price;
}
public int getBib() {
return bib;
}
public void setBib(int bib) {
this.bib = bib;
}
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;
}
public int getInCount() {
return inCount;
}
public void setInCount(int inCount) {
this.inCount = inCount;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book [bib=" + bib + ", bName=" + bName + ", author=" + author + ", pubComp=" + pubComp + ", pubDate="
+ pubDate + ", inCount=" + inCount + ", price=" + price + "]";
}
}
package dbqu.urltrafm;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.apache.log4j.Logger;
public class transformation {
private static Logger logger = Logger.getLogger(transformation.class.getName());
public Date dateChange(Object object) throws ParseException {
String ostr=object.toString();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date ACDate;
Date dd = null;
try {
ACDate = sdf.parse(ostr);
dd = new Date(ACDate.getTime());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e);
}
return dd;
}
public Double douNumber(Object object) {
return Double.parseDouble(object.toString());
}
}
package bdqu.test;
import java.util.List;
import org.junit.jupiter.api.Test;
import dbqn.dao.impl.BookDaoImpl;
import dbqu.dao.BookDao;
import dbqu.entity.Book;
class TestBook {
@Test
void testQuery() {
BookDao bookdao=new BookDaoImpl();
List<Book> list=bookdao.getAll();
for(Book book:list) {
System.out.println(book);
}
}
}
运行结果如下:
Book [bib=1001, bName=null, author=韩国欧巴, pubComp=null, pubDate=2020-04-23, inCount=306, price=100.0]
Book [bib=1002, bName=null, author=日本花姑娘, pubComp=null, pubDate=2020-04-23, inCount=200, price=50.0]
Book [bib=1003, bName=null, author=嘿嘿, pubComp=null, pubDate=2020-01-02, inCount=99, price=60.0]
Book [bib=1004, bName=null, author=wi, pubComp=null, pubDate=2020-04-24, inCount=101, price=30.0]
Properties 类
Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。
Properties 类被许多Java类使用。
String getProperty(String key) | 用指定的键在此属性列表中搜索属性。 |
---|---|
String getProperty(String key, String defaultProperty) | 用指定的键在属性列表中搜索属性。 |
void list(PrintStream streamOut) | 将属性列表输出到指定的输出流。 |
void list(PrintWriter streamOut) | 属性列表输出到指定的输出流。 |
void load(InputStream streamIn) throws IOException | 从输入流中读取属性列表(键和元素对)。 |
Enumeration propertyNames( ) | 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。 |
Object setProperty(String key, String value) | 调用 Hashtable 的方法 put。 |
void store(OutputStream streamOut, String description) | 以适合使用 load(InputStream)方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。 |