一、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. 破解栅栏密码python脚本

    今天遇到一个要破解的栅栏密码,写了个通用的脚本 #!/usr/bin/env python # -*- coding: gbk -*- # -*- coding: utf_8 -*- # Author ...

  2. Visual Basic了解

    Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...

  3. 如何利用gulp构建前端自动化

    1,使用 gulp.watch 来监听文件自动打包 在上篇文章中,介绍了如何利用webpack来为项目做打包编译等工作,其中介绍到在我们开发的时候,经常改动js,因为我们文件是引用编译后的js文件,若 ...

  4. clipboard.js实现复制功能

    项目地址:https://github.com/zenorocha/clipboard.js 现代化的“复制到剪切板”插件.不包含 Flash.gzip 压缩后仅 3kb. 为什么使用它 复制文字到剪 ...

  5. [javaSE] 集合框架(共性方法)

    Collection接口的常用方法 add(),添加一个元素 addAll(),添加一组元素 clear(),清空 remove(),移除一个 removeAll(),移除一组 size(),元素个数 ...

  6. 使用mybatis-generator生成自动代码

    2019-02-22 配置文件: pom.xml  添加 dependency plugin    基于mybatis-plus <dependency> <groupId>o ...

  7. SpringCloud Eureka(注册中心集群)

    多个注册中心,其实用不同的配置对应 不同的端口号注册就行了. 注册中心自己也是个服务,看看之前的单个注册中心是怎么样的呢? server: port: 8888 # 服务端口eureka: insta ...

  8. python开发必备神器 Virtualenv及管理工具Virtualenvwrapper

    如果在一台机器上,想开发多个不同的项目,需要用到同一个包的不同版本,如果还在本地继续安装,在同一个目录下安装或者更新,其它的项目必须就无法运行了,怎么办呢? 解决方案:虚拟环境 虚拟环境可以搭建独立的 ...

  9. apply、call、bind有什么区别?

    使用 apply var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: ...

  10. 转:Windows下PHP7安装Redis和Redis扩展phpredis

    原文地址:Windows下PHP7安装Redis和Redis扩展phpredis Windows下PHP7安装Redis和Redis扩展phpredis 2016-06-08 17:53:00 标签: ...