Java学习笔记-第十三章-javaJDBCDao模式
dao设计模式的概念

dao设计模式的概念
DAO(Data Access Object)设计模式是一种软件设计模式,用于将数据库操作与业务逻辑分离。
它将数据库访问逻辑封装在一个独立的对象中,使得业务逻辑代码不需要关心具体的数据库操作细节。
DAO 模式的核心思想是将数据库操作抽象为一个接口,通过这个接口来访问和操作数据库。
在这个接口中定义了一系列与数据库操作相关的方法,如插入、删除、更新和查询等。
而具体的数据库操作实现则由具体的数据库访问类来完成。
DAO 模式的优点包括:
1. 解耦:将数据库操作与业务逻辑分离,使得代码更加模块化和易于维护。
2. 可复用性:通过定义统一的数据库操作接口,可以在不同的项目中复用相同的数据库操作逻辑。
3. 灵活性:可以方便地替换底层数据库实现,而不需要修改业务逻辑代码。
4. 提高代码可读性:将数据库操作封装在独立的对象中,使得代码更加清晰和易于理解。
DAO 设计模式是一种用于数据库访问的常见设计模式,它可以提高代码的可维护性、可复用性和灵活性。
DAO模式介绍

比如插入一个用户信息(UserInfo类)
可以发现以下的一个重要问题:
UserInfoDAO dao = new UserInfoDAOImpl() ; 接口直接通过其子类实例化,直接的影响就是程序在调用 时必须知道具体的子类,这样会造成修改不方便 ,所以, 必须使用工厂设计,使前台不关注于具体子类是谁。
怎样实现这些标准?
在 JAVA 中可以通过接口定义出这些标准 1. 定义一个数据库连接类,由数据库连接类,统一管理数据库 连接 2. 新建与用户信息表字段对应的VO类,其属性与表字段一一 对应,并包含set和 get方法; 3. 整理出所有与该表相关的操作,抽象DAO接口,包含这些 方法; 4. 新建DAO实现类,实现DAO接口中的所有方法; 5. 新建DAO工厂类,该类可获取DAO实现类的实例
纯JSP开发程序存在以下问题:
1、所有的 JDBC 代码写在 JSP 页面之中,维护 困难 ; 2、JSP 中不应该使用任何 sql 包,即:不能在 JSP 中直接使用 java.sql.*,这些数据处理包应该 放在专门的类中; 3、规范化的数据处理模式为DAO模式;
区分:J2EE 的组件层次 客户端 表示层 业务层
*.jsp/servlet
数据层
数据库
DAO 属于 J2EE 数据层的操作, 即:在 DAO 中 封装了一个表在表的全部操作:
增加 修改 删除 按 ID 查询 查询全部 模糊查询
按以上要求,规定出操作此张表的标准,之后只要 针对于不同的数据库实现这些标准即可。
DAO 整体设计,是采用以下模式:
Java中的JDBC数据库操作技巧

Java中的JDBC数据库操作技巧一、JDBC简介JDBC全称为Java Database Connectivity,是Java的一个标准API,用于与各种关系型数据库进行连接、查询、更新等操作。
JDBC提供了一套基于SQL的编程接口,能够让Java程序无需了解底层数据库的细节即可进行数据库操作。
二、JDBC驱动类型JDBC驱动是一个程序模块,用于实现JDBC的API并与具体的数据库进行通信。
JDBC驱动可以分为四种类型:1、JDBC-ODBC桥接式驱动:使用ODBC驱动访问数据库。
这种驱动依赖于底层操作系统的ODBC机制,因此只能在Windows系统中使用。
2、本地式驱动:这种驱动实现了JDBC的API,并且直接与数据库交互。
由于直接调用数据库的API,因此效率要比桥接式驱动高。
3、网络式驱动:这种驱动通过网络协议与数据库进行通信。
大多数商用数据库都支持这种驱动,因此可以跨平台使用。
4、纯Java式驱动:这种驱动完全由Java实现,并且直接与数据库进行通信。
由于没有依赖于底层操作系统的机制,因此可以跨平台使用。
三、JDBC连接数据库JDBC连接数据库通常分为以下步骤:1、加载JDBC驱动在使用JDBC之前,必须先加载相应的JDBC驱动类。
可以通过Class.forName()方法来加载驱动,该方法的参数是完整的类名。
2、连接数据库连接数据库需要的参数通常包括数据库的URL、用户名和密码等。
可以使用DriverManager.getConnection()方法来建立连接,该方法的参数是一个包含数据库连接信息的字符串。
3、关闭连接在使用完连接后,必须调用Connection.close()方法来关闭连接,以便释放资源。
四、JDBC执行SQL语句JDBC可以执行各种类型的SQL语句,包括查询语句、更新语句、存储过程等。
1、执行查询语句可以使用Statement或PreparedStatement对象来执行查询语句。
javadao层代码

try { // 创建 SQL 语句 String sql = "DELETE FROM users WHERE id =ห้องสมุดไป่ตู้?"; // 创建 PreparedStatement 对象 statement = connection.prepareStatement(sql); // 设置参数 statement.setInt(1, userId); // 执行删除操作
} if (statement != null) {
statement.close(); } } catch (SQLException e) { e.printStackTrace(); } }
return user; }
// 插入用户信息的方法 public void insertUser(User user) {
} catch (SQLException e) { e.printStackTrace();
} finally { // 关闭资源 try { if (statement != null) { statement.close(); } } catch (SQLException e) { e.printStackTrace(); }
// 构造函数,传入数据库连接对象 public UserDao(Connection connection) {
this.connection = connection; }
// 根据用户 ID 查询用户信息的方法 public User getUserById(int userId) {
User user = null; PreparedStatement statement = null; ResultSet resultSet = null;
dao接口的工作原理

dao接口的工作原理引言:在Java编程中,我们经常听到“DAO接口”的术语,它代表了数据访问对象接口。
虽然它是Java的一个统一规范,但它实际上是我们在Web开发方面用得最多的技术之一。
在本文中,我们将深入研究DAO接口的工作原理,并了解它为什么是Java开发中的必要组成部分。
一、什么是DAO接口?先简单介绍一下DAO接口。
DAO接口代表数据访问对象接口。
它是一种设计模式,用于在面向对象编程中将业务逻辑与数据访问逻辑分离。
这样,开发人员可以专注于编写业务逻辑,而不必担心如何访问数据。
DAO接口定义了用于执行各种持久性操作的方法。
二、DAO的三个要素1.实体:数据对象,如表,列2.DAO接口:访问数据的接口,有CRUD(Create,Retrieve,Update,Delete)的实现方法3.实现类:实现数据访问,如JDBC,Hibernate等三、DAO接口的工作原理DAO接口的工作原理非常简单。
以下是一个简单的示例:package com.example.dao;import java.util.List;import er;/*** DAO interface for User*/public interface IUserDao {void save(User user);void update(User user);void delete(int userId);User get(int userId);List<User> getAll();}类定义了一个UserDAO接口,我们可以看到它定义了五个方法,它们都是用于访问用户数据的。
这些方法涵盖了我们所需要的CRUD操作。
将这些方法定义在DAO接口中,会使DAO接口非常通用化,不需要修改就能适用于各种类型的数据。
使用DAO接口的流程如下:1.创建DAO接口2.实现DAO接口3.在业务逻辑中使用DAO接口实现DAO接口很简单,可以使用JDBC或Hibernate等技术。
数据持久化技术中的ORM和DAO模式比较

数据持久化技术中的ORM和DAO模式比较在软件开发中,数据的持久化技术是至关重要的一环。
ORM和DAO是两种常用的数据持久化框架,不同的框架在实现方式、性能等方面存在差异。
本文旨在比较ORM和DAO模式的优劣,帮助开发者根据实际需求进行选择。
一、ORM模式ORM(Object-Relational Mapping)是一种面向对象的数据持久化框架,通过将对象与数据库中的表进行映射,实现数据的存储和读取。
ORM最大的优势在于它使得开发者可以使用面向对象的思想操作数据库,编写起来更加清晰简洁,减少了手写SQL的繁琐。
常见的ORM框架有Hibernate、MyBatis等。
下面是ORM模式的具体特点:1. 对象映射。
ORM框架通过对象关系映射(ORM)技术,将关系型数据库中的数据与实体对象的属性映射对应起来,存取数据库数据时,开发者只需要操作对应的对象即可,ORM框架会自动将对象转化为对应的SQL语句去操作数据库,编写起来更加清晰简洁2. 缓存。
ORM框架中除了提供SQL语句翻译的功能外,还提供了缓存功能。
缓存主要有两种:一级缓存和二级缓存。
一级缓存是指在同一个会话中查询同一个对象时,会先从缓存中查找,如果找不到再去数据库查询;二级缓存是指在不同的会话中查询同一个对象时,会先从缓存中查找,如果找不到再去数据库查询。
3. 推荐使用面向对象编程。
ORM模式建议使用面向对象编程思想,将数据库中的表映射成类,将表中的字段映射成类属性,将表中的数据映射成实体对象,开发者只需要关心业务逻辑,而无需关心底层细节。
4. 可移植性好。
ORM框架封装了JDBC等底层数据访问技术,对开发者而言,在架构、设计、编码和维护等方面会比较简单,业务代码和ORM框架解耦。
同时ORM框架可以兼容多种数据库,应用在不同的平台和环境中都可以使用。
二、DAO模式DAO(Data Access Object)是一种数据访问模式,将数据访问相关的操作独立出来放在一个单独的对象中,该对象负责处理所有与数据库的交互。
dao的规则制定-概述说明以及解释
dao的规则制定-概述说明以及解释1.引言1.1 概述概述部分内容:在当前信息时代,数据的价值越来越被重视,而数据访问对象(Data Access Object,DAO)作为软件开发中的一种设计模式,起到了重要的作用。
DAO模式的核心思想是将数据访问与业务逻辑分离,使得数据的增删改查操作更加灵活、高效。
在DAO的实践过程中,规则制定是一个至关重要的环节。
本文将系统介绍DAO规则制定的重要性及其原则。
首先,我们将从DAO的定义与背景入手,了解DAO模式的基本概念和其在软件开发中的应用。
接着,我们将探讨DAO规则制定的重要性,解释为什么规则对于DAO模式的实施至关重要。
最后,我们将详细介绍DAO规则制定的原则,包括灵活性、可扩展性、安全性等方面。
通过本文的阐述,读者将能够理解DAO规则制定的关键性,并且掌握一些实践中常用的规则制定原则。
了解这些原则对于实施DAO模式具有重要的指导意义,能够帮助开发人员更加高效地设计和实现DAO模式,提升软件开发的质量和效率。
在下一章节中,我们将进一步展开讨论,介绍DAO的定义和背景,以便读者能够更加全面地了解和掌握DAO规则制定的重要性。
1.2 文章结构文章结构部分的内容可以包括以下内容:在本篇文章中,我们将从三个方面来介绍dao的规则制定。
首先,在引言部分概述本文的主要内容与结构。
其次,在正文部分我们会先介绍dao的定义与背景,为读者提供一个对dao的基本了解。
然后,我们将探讨dao规则的重要性,阐述为什么有必要对dao进行规则制定。
最后,我们将讨论dao规则制定的原则,为读者提供一些指导方针。
最后,在结论部分,我们将总结dao规则制定的重要性,并归纳dao规则制定的原则。
同时,展望dao规则制定的未来发展,探讨可能的发展趋势和挑战。
通过这样的文章结构,我们希望能够全面而系统地介绍dao的规则制定,为读者提供一个清晰的框架和思路。
让我们一起深入了解dao规则制定的重要性和原则。
DAO模式介绍课件
索引优化:合理使用索 引,提高查询速度
减少数据库连接:使用连 接池技术,减少创建和关
闭数据库连接的开销
异步处理:将耗时操作 放到后台处理,提高用
户体验
异常处理
异常分类:系统异常、业务 异常、技术异常等
异常处理策略:异常捕获、异 常处理、异常日志记录等
异常处理原则:尽早发现、尽 早处理、最小影响范围等
2 DAO模式实现
数据库连接
数据库连接是DAO模式 的核心部分,负责与数据 库进行通信。
数据库连接需要提供数据 库URL、用户名、密码等 信息。
数据库连接通常使用 JDBC(Java Database Connectivity)技术实现。
数据库连接需要实现连接、 关闭、执行SQL语句等操 作。
SQL语句执行
使用JDBC(Java
01 Database Connectivity)
连接数据库
03 使 用 P r e p a r e d S t a t e m e n t 对象执行SQL语句
02 编写SQL语句,实现数据 操作
处理执行结果,如获取查
04 询结果集或处理更新、插
入、删除操作结果
结果集处理
01
等操作
6
数据分析: 分析订单数 据,为业务 决策提供支
持
权限管理系统
01
权限管理:对不 同用户进行权限
分配和管理
02
角色管理:根据 用户角色分配不
同的权限
03
权限控制:对不 同权限的用户进
行访问控制
04
权限审计:记录 和管理用户的权
限操作记录
谢谢
异常处理实践:异常处理代码 示例、异常处理最佳实践等
DAO设计模式
// 建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。 pstmt = conne.prepareStatement(sql); pstmt.setString(1, person.getName()); pstmt.setString(2, person.getPassword()); rs = pstmt.executeQuery();
Person person = new Person(); person.setName(loginName); person.setPassword(loginPassword);
PersonService ps = new PersonServiceImpl(); boolean isLoginid = ps.login(person);
islogin = true; } return islogin; } }
8.测试
package com.test;
import java.util.Scanner;
import org.junit.Test;
import com.entity.Person; import com.service.PersonService; import com.serviceImpl.PersonServiceImpl;
DAO设 计 模 式
DAO设计模式
DAO设计模式简介: DAO设计模式可以减少代码量,增强程序的可移植性,提高代码的可读性。
DAO(数据库操作对象)设计模式是 JavaEE 数据层的操作.主要由五部分组成:
1.数据库连接类:连接数据库并获取连接对象。
2.VO实体类:包含属性和表中字段完全对应的类。
创建DAO模式的步骤
创建DAO模式的步骤1.建⽴数据库epet2.创建实体类,和相对应的数据库是对应的3.创建Dao的基类接⼝类BaseDao4.创建Dao的实现类BaseDaoImpl5.创建具体表的Dao类6.创建具体表的Dao实现类7.创建业务逻辑层级的接⼝类PetService8.创建业务逻辑层的接⼝实现类:PetServiceImpl9.创建测试类下⾯写⼀个登录的操作⽤DAO模式:1.创建实体类:⼈的实体类1package com.beiwo.epet.entity;23import java.io.Serializable;45public class Master implements Serializable{67private static final long serialVersionUID = -975099318646595542L;89private int id;10private String loginId;11private String password;12public int getId() {13return id;14 }15public void setId(int id) {16this.id = id;17 }18public String getLoginId() {19return loginId;20 }21public void setLoginId(String loginId) {22this.loginId = loginId;23 }24public String getPassword() {25return password;26 }27public void setPassword(String password) {28this.password = password;29 }30public static long getSerialversionuid() {31return serialVersionUID;32 }33343536 }2.接⼝类的基类:1package com.beiwo.epet.entity;23import java.io.Serializable;45public class Master implements Serializable{67private static final long serialVersionUID = -975099318646595542L;89private int id;10private String loginId;11private String password;12public int getId() {13return id;14 }15public void setId(int id) {16this.id = id;17 }18public String getLoginId() {19return loginId;20 }21public void setLoginId(String loginId) {22this.loginId = loginId;23 }24public String getPassword() {25return password;26 }27public void setPassword(String password) {28this.password = password;29 }30public static long getSerialversionuid() {31return serialVersionUID;32 }33343536 }3738394041424344package com.beiwo.epet.dao;4546import com.beiwo.epet.entity.Master;4748public interface MasterDao extends BaseDao{4950/**51 *52 * @param loginId ⽤户名53 * @param password 密码54 * @return Master55*/56public Master findMasterByLoginIdAndPassword(String loginId,String password); 5758 }3.接⼝类的基类的实现类1package com.beiwo.epet.dao;23import com.beiwo.epet.entity.Master;45public interface MasterDao extends BaseDao{67/**8 *9 * @param loginId ⽤户名10 * @param password 密码11 * @return Master12*/13public Master findMasterByLoginIdAndPassword(String loginId,String password); 1415 }161718192021package com.beiwo.epet.dao;2223import com.beiwo.epet.entity.Master;2425public interface MasterDao extends BaseDao{2627/**28 *29 * @param loginId ⽤户名30 * @param password 密码31 * @return Master32*/33public Master findMasterByLoginIdAndPassword(String loginId,String password); 3435 }4.创建业务逻辑层级的接⼝类PetService1package com.beiwo.epet.service;23import com.beiwo.epet.entity.Master;45public interface MasterService {67public Master login(String loginId,String password);8910 }5.创建业务逻辑层的接⼝实现类1package com.beiwo.epet.service.impl;23import com.beiwo.epet.dao.MasterDao;4import com.beiwo.epet.dao.impl.MasterDaoImpl;5import com.beiwo.epet.entity.Master;6import com.beiwo.epet.service.MasterService;78public class MasterServiceImpl implements MasterService{910 @Override11public Master login(String loginId, String password) {12 MasterDao masterDao=new MasterDaoImpl();13return masterDao.findMasterByLoginIdAndPassword(loginId, password);14 }1516 }6.测试类:1package com.beiwo.epet.test;23import java.util.Scanner;45import org.junit.Test;67import com.beiwo.epet.entity.Master;8import com.beiwo.epet.service.MasterService;9import com.beiwo.epet.service.impl.MasterServiceImpl;1011public class TestMasterDao {1213 @Test14public void testLogin(){15 MasterService masterService=new MasterServiceImpl();1617 Scanner input=new Scanner(System.in);1819 System.out.println("请输⼊⽤户名:");20 String loginId=input.nextLine().trim();//去掉两端的空格2122 System.out.println("请输⼊密码:");23 String password=input.nextLine().trim();242526 Master master=masterService.login(loginId, password);2728if(null!=master){29 System.out.println("登陆成功");30 }else{31 System.out.println("登陆失败");32 }33343536 }373839 }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
List list = new ArrayList();
while (rs.next()) {
List rowList = new ArrayList();
for (int i = 1; i <= colCount; i++) {
rowList.add(rs.getString(i));
public List query(String sql, Object[] params) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
e.printStackTrace();
}finally {
closeAll(null, pstmt, conn);
}
return 0;
}
//设置参数
public void setParams(PreparedStatement ps, Object[] params) throws SQLException {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//关闭数据库
public void closeAll(ResultSet rs, PreparedStatement ps, Connection conn) {
1.
1.1.
1.2.
1.2.1.掌握DAO模式的用法
2.
2.1.继续完善我们的BaseDao
2.1.1.ResultSetMetaData对象
2.1.1.1.可用于获取关于ResultSet对象中列的类型和属性信息的对象
2.1.1.2.获得ResultSetMetaData对象:
2.1.1.2.1.ResultSet对象的getMetaData()方法;
2.1.1.3.ResultSetMetaData对象的常用方法:
2.1.1.3.1.int getColumnCount() :获得本次查询中的列数
2.1.1.3.2.String getColumnName(int column):获得本次查询中指定列的列名。
2.1.1.3.3.String getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
String url = "jdbc:mysql://localhost:3306/103";
Connection conn = DriverManager.getConnection(url, "root", "tiger");
return conn;
} catch (ClassNotFoundException e) {
}
list.add(rowList);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(rs, pstmt, conn);
}
return null;
}
@SuppressWarnings("unchecked")
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
setParams(pstmt, params);
//获得媒体元数据对象
ResultSetMetaData rd = rs.getMetaData();
//获得本次查询的列数
int colCount = rd.getColumnCount();
if (params == null) {
return;
}
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
//查询方法
@SuppressWarnings({ "rawtypes", "unchecked" })
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
2.1.1.3.4.int getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
2.1.1.3.5.String getTableName(int column):获取指定列的表名称
2.1.1.4.从数据库中取出表中所有信息
2.1.1.4.1.
2.1.1.5.将ResultSet对象中的数据装入到集合中
2.2.1.6.采用面向接口编程,提高了项目的可扩展性和可维护性。
2.2.1.7.一个典型的DAO模式主要有以下几部分组成:
2.2.1.7.1.一个工厂类,主要负责创建和关闭Connection对象
2.2.1.7.2.DAO接口,定义业务方法
2.2.1.7.3.DAO实现类,实现DAO接口,完成具体功能
2.2.1.7.4.实体类,储存和传递数据
2.2.1.8.Dao模式实现
2.2.1.8.1.
2.2.1.8.2.
2.2.1.8.3.
2.2.1.8.4.
2.2.1.8.5.
2.2.1.8.6.
3.
3.1.
3.2.
3.3.
4.
4.1.
2.2.1.3.DAO(Data Access Object)即:数据存取对象,它是位于业务逻辑和底层数据库之间,专门使用JDBC实现数据持久化的一种“套路”,通常称之为DAO模式
2.2.1.4.使用DAO模式进行项目开发主要有以下两个好处:
2.2.1.5.隔离了业务逻辑代码和数据访问代码,分工明确,降低耦合性,提高可重用性。
if (rs != null) {
try {
rs.n e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
import com.aaa.test1.Student;
/**
* @author ky
* @version创建时间:2019年8月26日
*/
public class BaseDao {
//连接数据库
public Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
2.1.1.5.1.思路:
2.1.1.5.1.1.
2.1.1.5.1.2.
2.2.完整的BaseDao
package com.aaa.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@Test
public void test() {
String sql = "select * from student";
List<Student> list = (List<Student>) query(sql, null);
System.out.println(list);
}
}
2.2.1.DAO模式
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
setParams(pstmt, params);
return pstmt.executeUpdate();
} catch (SQLException e) {
2.2.1.1.前面我们在使用JDBC时解决的都是一些很简单的问题,例如简单的增、删、改、查等等,所以直接把代码写在了main方法中。
2.2.1.2.这种写法很容易出现代码冗余、耦合度高、不能模块化开发等等诸多弊端,特别是将来我们做大型实战项目时该怎么办呢?这时业务会更加复杂。DAO模式就可以解决这个问题。
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//修改数据库
public int update(String sql, Object[] params) {
Connection conn = null;