一、DAO设计模式概述
###<1>概念
DAO,Data Access Object ,用于访问数据库的对象。
位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问
![](1.png)

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

![](2.png)

###<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中的事务,连接池的使用的更多相关文章

  1. Java Servlet DAO实践(二)

    Java Servlet DAO实践(二) DAO连接类 package com.seller.servlets.dao; import java.sql.*; public class DataBa ...

  2. Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介

    日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...

  3. 数据层优化-jdbc连接池简述、druid简介

    终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...

  4. JDBC连接数据库(二)——连接池

    参考博客:http://www.cnblogs.com/xdp-gacl/p/4002804.html 一. 应用程序直接建立数据库连接模型 应用程序直接每次访问数据库时,都建立创建一个数据库的链接, ...

  5. 转 JDBC连接数据库(二)——连接池

    https://www.cnblogs.com/xiaotiaosi/p/6398371.html 数据库保持长连接,不过一直都是idle,除非有用户激活连接,这样后果是无法删除用户,但是不影响数据库 ...

  6. JDBC二部曲之_事物、连接池

    事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l  一致 ...

  7. 具体解释。。设计模式5——DAO。。studying

    设计模式5--DAO ★ 场景和问题 在Java程序中,常常须要把数据持久化.也须要获取持久化的数据,可是在进行数据持久化的过程中面临诸多问题 (如:数据源不同.存储类型不同.供应商不同.訪问方式不同 ...

  8. 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)

    设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...

  9. Java 设计模式(二)-六大原则

    Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...

随机推荐

  1. lucene源码分析(2)读取过程实例

    1.官方提供的代码demo Analyzer analyzer = new StandardAnalyzer(); // Store the index in memory: Directory di ...

  2. Redis运行流程源码解析--转载

    http://blog.nosqlfan.com/html/4007.html http://www.searchdatabase.com.cn/showcontent_62166.htm 导读:本文 ...

  3. APP消息推送机制的实现(PUSH)

    出于好奇,想了解一下消息推送机制,在网上搜索到了几篇文章,感觉还不错,粘贴下来,等真正用到的时候再仔细研究 以下两篇是关于ios的 1.http://blog.csdn.net/xyxjn/artic ...

  4. Linq to xml 操作带命名空间的xml

    昨天需要操作用代码操作csproj文件,实现不同vs版本的切换. 在用XElement读取了csproj文件以后怎么也获取不到想要的对象. 反反复复试验了好多次都不得要领:先看下csproj文件的内容 ...

  5. 表示层设计模式:Intercepting Filter(截取筛选器)模式

     上下文  问题  影响因素  解决方案  变体  示例  结果上下文  相关模式  致谢  上下文 对于任何一个曾经从头建立 Web 应用程序的人来说,他们都会有这样的体会:这项任务所需要的独立完成 ...

  6. JDBC进行事务管理

    JDBC进行事务管理 事务的四个特征:原子性 : 是指事务中包含的操作都被看做是一个逻辑单元一致性: 开始前和结束后数据库都处于一致性状态隔离性: 对数据库修改的多个事务是彼此隔离的持久性 事务完成之 ...

  7. 响应式布局和BootStrap 全局CSS样式

    1.什么是响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,这个概念是为解决移动互联网浏览而诞生的. 简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一 ...

  8. SpringCloud学习指南【更新】

    一. 推荐学习博客主页[更新] Spring Cloud 系列文章(纯洁的微笑,强烈推荐系列文章) Spring Cloud系列教程 (周立大大,强烈推荐) Spring Cloud入门到实战系列教程 ...

  9. 如何解决“There is no locally stored library”的问题

    今天我在用pyCharm开发网页的时候,用cdn引入js文件,但是程序报错,说“there is no locally stored library”.于是我上网找到了解决方案,特整理如下: 在你报错 ...

  10. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...