DAO模式

DAO模式

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

  1. 位于业务逻辑和持久化数据之间
  2. 实现对持久化数据的访问

DAO模式的作用

  1. 隔离业务逻辑代码和数据访问代码
  2. 隔离不同数据库的实现

DAO模式的组成部分

  1. DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。
  2. DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
  3. 实体类:用于存放与传输对象数据。
  4. 数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,
    方便修改。

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 表中的属性列表(键和元素对)写入输出流。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~plus~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值