转载自https://www.runoob.com/note/27029

DAO 模式

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

对外提供相应的接口

在面向对象设计过程中,有一些"套路”用于解决特定问题称为模式。

DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。

从以上 DAO 模式使用可以看出,DAO 模式的优势就在于它实现了两次隔离。

  • 1、隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。
  • 2、隔离了不同数据库实现。采用面向接口编程,如果底层数据库变化,如由 MySQL 变成 Oracle 只要增加 DAO 接口的新实现类即可,原有 MySQ 实现不用修改。这符合 "开-闭" 原则。该原则降低了代码的藕合性,提高了代码扩展性和系统的可移植性。

一个典型的DAO 模式主要由以下几部分组成。

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

DAO 接口:

public interface PetDao {
/**
* 查询所有宠物
*/
List<Pet> findAllPets() throws Exception;
}

DAO 实现类:

public class PetDaoImpl extends BaseDao implements PetDao {
/**
* 查询所有宠物
*/
public List<Pet> findAllPets() throws Exception {
Connection conn=BaseDao.getConnection();
String sql="select * from pet";
PreparedStatement stmt= conn.prepareStatement(sql);
ResultSet rs= stmt.executeQuery();
List<Pet> petList=new ArrayList<Pet>();
while(rs.next()) {
Pet pet=new Pet(
rs.getInt("id"),
rs.getInt("owner_id"),
rs.getInt("store_id"),
rs.getString("name"),
rs.getString("type_name"),
rs.getInt("health"),
rs.getInt("love"),
rs.getDate("birthday")
);
petList.add(pet);
}
BaseDao.closeAll(conn, stmt, rs);
return petList;
}
}

宠物实体类(里面get/set方法就不列出了)

public class Pet {
private Integer id;
private Integer ownerId; //主人ID
private Integer storeId; //商店ID
private String name; //姓名
private String typeName; //类型
private int health; //健康值
private int love; //爱心值
private Date birthday; //生日
}

连接数据库

public class BaseDao {
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://127.0.0.1:3306/epet";
private static String user="root";
private static String password="root";
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
} public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throws SQLException {
if(rs!=null) {
rs.close();
}
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
} public int executeSQL(String preparedSql, Object[] param) throws ClassNotFoundException {
Connection conn = null;
PreparedStatement pstmt = null;
/* 处理SQL,执行SQL */
try {
conn = getConnection(); // 得到数据库连接
pstmt = conn.prepareStatement(preparedSql); // 得到PreparedStatement对象
if (param != null) {
for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数
}
}
ResultSet num = pstmt.executeQuery(); // 执行SQL语句
} catch (SQLException e) {
e.printStackTrace(); // 处理SQLException异常
} finally {
try {
BaseDao.closeAll(conn, pstmt, null);
} catch (SQLException e) {
e.printStackTrace();
}
}
return 0;
} }

最新文章

  1. sql高级语句大全
  2. 《大型网站系统与Java中间件实践》读书笔记
  3. 大话设计模式C++版——原则和引言
  4. AJAX-----07XMLHttpRequest对象的处理返回的JSON类型数据
  5. MySqlConnection 并发连接的问题
  6. Speex for Android
  7. POJ 2481 Cows
  8. NOIP2006 能量项链
  9. keil中 code、data、idata的区别
  10. Trident内核中取验证码图片的几种方法
  11. mysql集群安装配置
  12. HDFS写入和读取流程
  13. 基于visual Studio2013解决C语言竞赛题之1074八皇后
  14. VS2015 使用
  15. HTML---标签的分类 | display | visibility
  16. webstorm主要快捷键
  17. Maven之pom.xml配置文件详解
  18. Laravel 5.2服务----用户验证Auth相关问题
  19. [CI]jenkins安装&amp;插件管理&amp;java-helloworld之旅
  20. 对Array.prototype.slice.call()方法的理解

热门文章

  1. Nuget Server的搭建及实践之旅
  2. mybatis中因为不理解$与#而出现的bug
  3. 学习索引结构的一些案例——Jeff Dean在SystemML会议上发布的论文(下)
  4. 用生动的案例一步步带你学会python多线程模块
  5. CentOS7.4系统下,手动安装MySQL5.7的方法
  6. 一个普通程序员眼中的AQS
  7. ecosystem.config
  8. kettle教程---kettle作业调度,附件(excel)配置表名,一个调度完成所有的表操作
  9. [TimLinux] JavaScript position为fixed时支持水平滚动条
  10. FPGA_VIP_V101 摄像头视频采集 调试总结之SDRAM引起的水平条纹噪声问题