一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用
一、DAO设计模式概述
###<1>概念
DAO,Data Access Object ,用于访问数据库的对象。
位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问

###<2>作用
隔离了业务层和数据访问层,将两层进行解耦
隔离了不同数据库的实现
增强的程序的可移植性和可扩展性

###<3>组成
1. DAO接口(内存插槽的标准):定义操作数据的接口,CRUD
2. DAO实现类(不同内存条厂商生成的内存条):DAO接口的实现类,完成具体的数据库操作
3. 实体类:由属性和各种操作属性的方法组成的类,bean类
4. 数据库连接和关闭的工具类:专门负责数据库操作的类
5. DAO工厂类:获取一个具体的DAO实现类
###<4>实现
cn.xdl.dao
AnimalDao
AnimalDaoImp
AniamlDaoFactory
# 二、DAO优化
提取公共代码
1. 创建模版类 JDBCTemple
<1>将增删改方法提取成一个方法:使用可变参数接收补全sql语句的实参
public void update(String sql,Object...args)
for()补全SQL语句,可变参数就是一个数组
<2>将查询的方法提取成一个公共的方法:使用可变参数接收补全sql语句的实参
public Obejct query(String sql , ResultSetHandler rsh ,Object ...args);
创建一个接口:ResultSetHandler 动态的封装返回的数据
2. 使用工具类
<1>导入第三方工具包:commons.dbutils.jar
<2>使用QueryRunner 对象实现数据的各种操作
在封装数据的使用,使用了反射,需要使用new BeanHandler<>(Animal.class)
new BeanListHandler<>(Animal.class)
java实体类的属性名一定要个数据表的字段名称一致
# 三、JDBC中的事务和连接池
###<0>批处理
void addBatch(String sql)
将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。
int[] executeBatch()
将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
###<1>事务
JDBC的Connection接口提供处理事务的方法:
void setAutoCommmit(boolean isOpen);
void rollback();
void commit();
步骤:
1. 取消JDBC事务的自动提交
2. 执行SQL语句
3. 如果执行成功,提交更改;如果出现错误,则回滚
实践:
public void add(Animal animal){
Connection conn = null;
PreparedStatement pst = null;
try{
//1. 获取数据库连接对象
conn = DBUtils.getConnection();
conn.setAutoCommit(false);//手动提交事务
//2.执行SQL语句
String insertSQL = "insert animals value(null,?,?,?,?)";// id num name kind sex
pst = conn.prepareStatement(insertSQL);
//补全sql语句
pst.setInt(1, animal.getNum());
pst.setString(2, animal.getName());
pst.setString(3, animal.getKind());
pst.setString(4, animal.getGender());
//执行sql
int resultNum = pst.executeUpdate();
if(resultNum>0){
System.out.println("add success");
}else{
System.out.println("add error");
}
int num = 10/0;
}catch(Exception e){
e.printStackTrace();
try {
//回滚
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally{
try {
//提交
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
//3.释放资源
DBUtils.closeRes(conn, pst, null);
}
}
###<2>连接池
使用步骤:
1. 导入工具包
2. 编写配置文件
3. 使用连接池的提供的工具实现连接对象的创建或回收
public class DBUtils2 {
//申明连接池对象
private static DataSource ds;//连接池
static{
//从配置文件中获取连接池的配置参数
InputStream is = DBUtils2.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties pro = new Properties();
try {
//将连接池的配置参数封装到属性对象中
pro.load(is);
//使用第三方的工具,根据配置文件中的配置参数,创建连接池
ds = BasicDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
//从连接池中获取连接
return ds.getConnection();
}
// 将连接对象返回到连接池中
public static void closeRes(Connection conn, Statement st, ResultSet rs) {
try {
if (rs != null)
rs.close();
if (st != null)
st.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用的更多相关文章
- Java Servlet DAO实践(二)
Java Servlet DAO实践(二) DAO连接类 package com.seller.servlets.dao; import java.sql.*; public class DataBa ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- 数据层优化-jdbc连接池简述、druid简介
终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...
- JDBC连接数据库(二)——连接池
参考博客:http://www.cnblogs.com/xdp-gacl/p/4002804.html 一. 应用程序直接建立数据库连接模型 应用程序直接每次访问数据库时,都建立创建一个数据库的链接, ...
- 转 JDBC连接数据库(二)——连接池
https://www.cnblogs.com/xiaotiaosi/p/6398371.html 数据库保持长连接,不过一直都是idle,除非有用户激活连接,这样后果是无法删除用户,但是不影响数据库 ...
- JDBC二部曲之_事物、连接池
事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l 原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l 一致 ...
- 具体解释。。设计模式5——DAO。。studying
设计模式5--DAO ★ 场景和问题 在Java程序中,常常须要把数据持久化.也须要获取持久化的数据,可是在进行数据持久化的过程中面临诸多问题 (如:数据源不同.存储类型不同.供应商不同.訪问方式不同 ...
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
随机推荐
- 合天misc100
打开txt文件是一串RGB颜色值 用len(file.readlines()),发现颜色值有61366个,能分解成122*503 from PIL import Image length = 122 ...
- 云存储(Swift+Keystone)部署策略
Swift是OpenStack的对象存储模块,Keystone是OpenStack的权限验证模块.可以于这两个模块搭建一个较为完善的云存储系统. 1.官方方案 云存储的服务器分三种类型: 验证节点 A ...
- Angular的表单组件
创建表单元素 在上一节中,我们学习了如何创建一个组件login,现在将login改造一下, 在template中添加html表单元素,#usernameRef表示input元素id,如果想传递inpu ...
- [C语言] 数据结构-预备知识跨函数使用内存
跨函数使用内存 一个函数运行结束,使用malloc函数分配的内存,如果不调用free,就不会释放 在另一个函数中还可以继续使用 #include <stdio.h> #include &l ...
- 我用ASP.NET缓存之数据缓存
[我的理解] Cache,是内置的对象集合.是全局的,类似于static Arraylist.它是线程安全的,添加或修改Cache中的项目时,不需要锁定或者解除Cache. 添加 Cache[Key] ...
- gRPC版本的 Google APIs
gRPC将是未来google所有客户端的库标准(DevoxxFR), 这句话的出处: https://twitter.com/chanezon/status/585724143003402240 ...
- .NET Core 2.1路线图
Microsoft的Scott Hunter发布了Microsoft .NET Core 2.1版本的路线图.Hunter宣布Microsoft .NET Core每天约有五十万开发人员的使用量.根据 ...
- BZOJ5317:[JSOI2018]战争(闵可夫斯基和)
令 \(a\in A,b\in B\) 则移动向量 \(\omega\) 使得存在 \(b+\omega=a\) 那么 \(\omega\) 需要满足 \(\omega=a−b\) 黑科技:闵可夫斯基 ...
- git之回退
1:本地已commit,未push到远程仓库 1)git log: 查看commit日志,获取commit的id 2) git reset --hard commit_id: ...
- C#+MapServer相关代码
//放大的代码: private void MapZoomIn(NameValueCollection queryString) { mapObj map = Session["MapSer ...