java dao模式_Java DAO 模式

DAO 模式

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

对外提供相应的接口

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

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

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

1、隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。

2、隔离了不同数据库实现。采用面向接口编程,如果底层数据库变化,如由 MySQL 变成 Oracle 只要增加 DAO 接口的新实现类即可,原有 MySQ 实现不用修改。这符合 "开-闭" 原则。该原则降低了代码的藕合性,提高了代码扩展性和系统的可移植性。

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

1、DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。

2、DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。

3、实体类:用于存放与传输对象数据。

4、数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。

DAO 接口:

public interfacePetDao {/*** 查询所有宠物*/List findAllPets() throwsException;

}

DAO 实现类:

public class PetDaoImpl extends BaseDao implementsPetDao {/*** 查询所有宠物*/

public List findAllPets() throwsException {

Connection conn=BaseDao.getConnection();

String sql="select * from pet";

PreparedStatement stmt=conn.prepareStatement(sql);

ResultSet rs=stmt.executeQuery();

List petList=new ArrayList();while(rs.next()) {

Pet pet=newPet(

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);returnpetList;

}

}

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

public classPet {privateInteger 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 classBaseDao {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() throwsSQLException {returnDriverManager.getConnection(url, user, password);

}public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throwsSQLException {if(rs!=null) {

rs.close();

}if(stmt!=null) {

stmt.close();

}if(conn!=null) {

conn.close();

}

}public int executeSQL(String preparedSql, Object[] param) throwsClassNotFoundException {

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;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 闭包_公司新来的女实习生问我什么是闭包?

作者&#xff1a;霍语佳来源&#xff1a;前端食堂观感度&#xff1a;?????口味&#xff1a;冰镇西瓜烹饪时间&#xff1a;20min撩妹守则第一条&#xff0c;女孩子都喜欢童话故事。那就先来讲一个童话故事~// 有一个公主// 她生活在一个充满冒险的奇妙世界里// 她遇见了她的…

织梦 mysql 配置文件_MySQL集群配置

一、介绍这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。注意&#xff01;虽然这是基于2台服务器的MySQL集群&#xff0c;但也必须有额外的第三台服务器作为管理节点&#xff0c;但这台服务器可以在集群…

python tcp协议_python 网络编程 -- Tcp协议

Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”&#xff0c;而打开一个Socket需要知道目标计算机的IP地址和端口号&#xff0c;再指定协议类型即可。客户端大多数连接都是可靠的TCP连接。创建TCP连接时&#xff0c;主动发起连接的叫客户端&a…

pathon和python_Python文件和目录操作详解

一、文件的打开和创建1、打开open(file,mode):>>>fo open(test.txt, r)>>>fo.read()hello\n>>>fo.close()file(file,mode):>>>f file(test.txt, r)>>>f.read()hello\n>>>f.close()mode可取值&#xff1a;2、创建用w/w…

java 字节输入流_JavaIO流(一)-字节输入流与字符输入流

IO流详解一、输入流字节输入流FileInputSteam1、构造方法&#xff1a;public FileInputStream(File file) {}public FileInputStream(FileDescriptor fdObj){}public FileInputStream(String name){}2、read方法&#xff1a;// 每次读取一个字节public int read(){}// 读取b.le…

python散点矩阵图_用python-pandas作图矩阵

本文为一篇翻译文章&#xff0c;来自于Visualize Machine Learning Data in Python With Pandas - Machine Learning Mastery**&#xff0c;原文标题是Visualize Machine Learning Data in Python With Pandas(在Python里使用pandas对机器学习的数据进行可视化分析)&#xff0c…

Java哪些是线程安全的_Java集合中那些类是线程安全的

线程安全类在集合框架中&#xff0c;有些类是线程安全的&#xff0c;这些都是jdk1.1中的出现的。在jdk1.2之后&#xff0c;就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类&#xff1a;vector&#xff1a;就比arraylist多了个同步化机制(线程安全)&#xff0c;因…

python求斐波那契数列第n个数及前n项和_使用python求斐波那契数列中第n个数的值示例代码...

使用python求斐波那契数列中第n个数的值示例代码,数列,递归,方法,兔子,个数使用python求斐波那契数列中第n个数的值示例代码易采站长站&#xff0c;站长之家为您整理了使用python求斐波那契数列中第n个数的值示例代码的相关内容。斐波那契数列(Fibonacci sequence)&#xff0c;…

java org.apache.http_org.apache.http jar包下载-org.apache.http.jar包下载 --pc6下载站

org.apache.http.jar包是一款十分常用的jar包如果没有org.apache.http.jar包Apache与http的链接将会出现错误等现象马上下载org.apache.http.jar包。。相关软件软件大小版本说明下载地址org.apache.http.jar包是一款十分常用的jar包,如果没有org.apache.http.jar包,Apache与htt…

网络连接异常、网站服务器失去响应_网站常见故障解决办法

网站在运行过程中&#xff0c;常常遇到各种服务器问题&#xff0c;虽然有服务器厂商的维护&#xff0c;但是往往耗时耗工小编对常见的服务器问题&#xff0c;进行了归纳整理&#xff0c;下面跟各位分享一下。常见故障分析一、恶意攻击在我平时管理网站时&#xff0c;可能会遭到…

java编程能做什么_学习Java编程能做什么工作?

Java作为编程语言界最时髦流行的元老之一&#xff0c;现今在软件市场上也是宠儿&#xff0c;被各大企业广泛应用到生产中。在各种行业、各个企业的业务管理平台&#xff0c;如门户网站等许多方面都占据了主导地位。吸引着越来越多学习Java的各个不同年龄阶段的人群。学习Java的…

python如何关闭窗口仍能运行_Python在退出时关闭自己的CMD shell窗口

让我们首先分析两个发布的Python脚本行在执行Python脚本时真正做了些什么。感谢eryksun进行深入调查&#xff0c;真正使用Python导致正确的描述&#xff0c;现在可以在下面阅读。os.system()导致在前台使用控制台窗口执行cmd.exe /C并停止执行Python脚本&#xff0c;直到Window…

java一年包装_java回顾之包装类

Java包装类由于基本类型比如int,char不具有支持面向对象的编程机制&#xff0c;比如所有引用类型的变量都继承与Object&#xff0c;都可以当成Object使用&#xff0c;如果有个方法需要Object类型的参数&#xff0c;但是实际需要的值却是2,3等数值&#xff0c;这就比较难处理所以…

python3 sleep 并发_python异步编程之asyncio(百万并发)

点击上方蓝字关注我们目录[python 异步编程之 asyncio(百万并发)]一、asyncio二、aiohttp前言&#xff1a;python 由于 GIL(全局锁)的存在&#xff0c;不能发挥多核的优势&#xff0c;其性能一直饱受诟病。然而在 IO 密集型的网络编程里&#xff0c;异步处理比同步处理能提升成…

【Spring实战】02 配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍&#xff0c;我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中&#xff0c;…

java getxxx_java的invoke与getMethod方法用法

和listener一起使用举例&#xff1a;需要在控件中监听某个动作&#xff1a;比如button点击&#xff0c;画面滚动等1.为控件定义一个属性&#xff1a;属性绑定一个方法xxxProperty "onPropertyXxxxFunc”2.首先自定义一个Listener// 在控件构造函数中获得控件属性的值xxxPr…

windows查看usb信息命令_【VPS】Linux VPS查看系统信息命令大全

本文转自老左笔记&#xff0c;自用mark系统# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加…

c++ 向量的值逆序输出_C++中vector的常用方法

前言在C中&#xff0c;vector是一个商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。十分有用的容器。它能像容器一样存放各种类型的对象&#xff0c;简单来说&#xff0c;vector是一个能够存放任意类型的动态数组&#xff0c;能够增加和压缩数据。相较链表而言&…

java生成密码_java生成密码生成 | 学步园

一、根据当前日期生成MD5加密密码package com.test;import java.security.MessageDigest;import java.text.SimpleDateFormat;import java.util.Date;public class Md5Test {public void toMD5(String plainText) {try {//生成实现指定摘要原文链接&#xff1a;http://www.cnbl…

python怎么创建一个二维数组_python 创建二维数组的方法

废话不多说&#xff0c;直接上代码&#xff1a;#codingutf-8def two_di_demo1():a[]for i in range(10):a.append([])for j in range(10):a[i].append(0)print(a)def two_di_demo2():a[]for i in range(10):a.append([])for j in range(10):a[i].append(0)print(a)b [[0] * 10…