一、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. java Fork/Join框架

    应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...

  2. PHP数组基本的操作方法

    1.数组操作的基本函数 数组的键和值: array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如 ...

  3. unity 判断平台(安卓,iOS还是编辑器)

    两种方式 --------------- C预处理器编译判断 --------------- #if UNITY_IOS // ... iOS项目才会编译 #elif UNITY_ANDROID // ...

  4. NSObject常用方法和反射

    // 类的反射    NSString *str = @"Person";    Class class = NSClassFromString(str);        Pers ...

  5. JAVA 项目 调用外部的WebSerivce接口,入门实例 (一)

    前言: 第一次接触WebService,工作需要,调用外部的WebService接口,所以暂时我这里不考虑发布,做个记录,待以后回来可以看看,只是最初级的,所以有何不好.不对的地方,欢迎看到的同僚给予 ...

  6. 如果你的shiro没学明白,那么应该看看这篇文章,将shiro整合进springboot

    最近在做项目的时候需要用到shiro做认证和授权来管理资源 在网上看了很多文章,发现大多数都是把官方文档的简介摘抄一段,然后就开始贴代码,告诉你怎么怎么做,怎么怎么做 相信很多小伙伴即使是跟着那些示例 ...

  7. 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式

    一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...

  8. Var与Dynamic的区别

    1.var与dynamic的区别   C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的 ...

  9. 洛谷P2973 [USACO10HOL]赶小猪(高斯消元 期望)

    题意 题目链接 Sol 设\(f[i]\)表示炸弹到达\(i\)这个点的概率,转移的时候考虑从哪个点转移而来 \(f[i] = \sum_{\frac{f(j) * (1 - \frac{p}{q}) ...

  10. input文字垂直居中和按钮对齐问题,兼容IE8

    1.盒子模型问题:请CSS重置 2.按钮不对齐:请浮动或者vertical-align:middle;然后计算宽高,使其对齐 : 3.IE8文本不居中:line-height属性     注意:IE8 ...