一、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 ...
随机推荐
- Linux 命令 "cp" 代码实现简介
本blog主要是模仿Linux的cp命令的功能,未实现参数,只是基础功能部分. 本文的主要目的在于练习 文件流 和 目录流 中的函数的使用. 主要功能包括两种: 源文件属性为文件,拷贝到其它文件(内容 ...
- Shell脚本编写5-----Shell 基本运算符
算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用.expr 是一款表达式计算工具,使用它能完成表达式的求值操作.例如: 两个数相加 ...
- [转]SQL SERVER数据库删除LOG文件和清空日志的方案
本文转自:https://www.cnblogs.com/ShaYeBlog/archive/2012/09/04/2670505.html 数据库在使用过程中会使日志文件不断增加,使得数据库的性能下 ...
- webapi找到了与该请求匹配的多个操作
关于这个问题是路由在找方法的时候层没有指定对,同一个链接,同样的参数导致路由找不到方法导致的报错,可以在WebApiConfig中多配置一层,比如"api/{controller}/{act ...
- 【手记】解决启动SQL Server Management Studio 17时报Cannot find one or more components...的问题
刚装好SSMS 17.1准备体验,弹出: 一番搜索,普遍办法都是安装VS2015独立shell.删除某个注册表项什么的,没用,首先这个shell我是装了的,然后也没有那个注册表项.我自己尝试过重装sh ...
- wamp 安装monggo扩展
1.下载对应的monggo扩展 http://pecl.php.net/package/mongo 2. 找对应的版本 放在D:\program\wamp\bin\php\php5.5.12\ext ...
- 使用CSS3改变文本选中的默认颜色——张鑫旭
关于浏览器文字选中颜色 以我的系统举例(xp 默认主题),浏览器上页面文字选中后默认的背景色是一种蓝色, 不同浏览器的颜色有些许差异,但大致相同,文字颜色也近乎白色,如下图所示,截自Firefox3. ...
- 浅谈脚本化css(二)
查询计算样式 window上面有一个方法叫做getComputedStyle可以来获取元素的计算样式,也就是css样式. window.getComputedStyle(ele. null); J ...
- vue-router 路由懒加载
webpack打包会将所有资源文件合并压缩成一个文件,导致最终的文件非常大,甚至超过几M,以致页面首次加载会比较慢,如下图: 其中红色标出的是在浏览器中加载的js文件,gzip压缩前已经达到500多K ...
- 自定义指令directive基础用法
官方链接:http://doc.vue-js.com/v2/guide/custom-directive.html#simplest-directive-example 在main.js中注册自定义指 ...