什么是 DAO

DAO(Data Access Object)是一个数据访问接口,夹在业务逻辑与数据库资源中间。

在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。DAO中的主要操作:增删改查(CRUD).

DAO的实现

实现的步骤一般是:

  • 先建立模型的对象domain
  • 编写DAO接口
  • 定义DAO实现类
  • 生产DAO测试类
  • 在DAO测试类中测试方法

一般的规范是分domain包和dao包,dao包中有DAO接口,接口名为IXxxDAO,实现类为XxxDAO,创建实现类对象赋给接口,体现多态。还有一个测试类名为XxxTestDAOTest.如:

DAO接口:

public interface IStudentDAO {
/**
* 保存学生对象
* @param stu 需要保存的学生
*/
void save(Student stu); /**
* 删除指定id的学生
* @param id 需要删除的学生的id
*/
void delete(int id); /**
* 更改操作
* @param newStu 更改后的学生对象,根据id更改
*/
void update(Student newStu); /**
* 根据id查询单个学生对象信息
* @param id 需要查询学生的id
* @return 存在该学生返回学生对象 不存在则返回null
*/
Student get(long id ); /**
* 查询所有学生
* @return 返回一个学生对象的集合
*/
List<Student> list();
}

实现类:

public void save(Student stu) {
String sql = "INSERT INTO s_student(name,age) VALUES('狗哲',21)";
Connection conn = null;
Statement st = null
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///demo","root","admin");
st = conn.createStatement();
st.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally {
try{
if(st != null){
st.close();
}
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if(conn != null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
增删改只有sql语句不一样,省略
····
····
public List<Student> list() {
String sql = "SELECT * FROM s_student";
Connection conn = null;
Statement st = null;
ResultSet rs = null;
List<Student> list = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///demo","root","admin");
st = conn.createStatement();
rs = st.executeQuery(sql);
while(rs.next()){
String name = rs.getString("name");
Integer age = rs.getInt("age");
list.add(new Student(name,age));
} } catch (Exception e) {
e.printStackTrace();
}finally {
try{
if(st != null){
st.close();
}
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if(conn != null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
return list;
}

DAO实现的重构

可以看出代码重复非常之多,尤其是增删改只有sql语句不一样

  • 1、定义一个JdbcUtil类,把加载注册驱动放到静态代码块中,因为没有必要每次都去加载。
  • 2、把url,classDriverName,username,password ,放在一个资源文件中,用加载资源文件的方式获取这些值,保证了代码的可维护性
  • 3、异常处理代码也放在工具类中,异常处理及其麻烦,影响代码的美观
public class JdbcUtil {
private static Properties p = new Properties();
//加载资源文件
static{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream inStream = loader.getResourceAsStream("db.properties");
try {
p.load(inStream);
Class.forName(p.getProperty("classDriver"));
} catch (Exception e) {
e.printStackTrace();
}
} //获取连接对象
public static Connection getConn(){
Connection conn = null;
try {
conn = DriverManager.getConnection(p.getProperty("url"),p.getProperty("username"), p.getProperty("password"));
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭资源
public static void close(Connection conn,Statement st,ResultSet rs){
try{
if(rs != null){
rs.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(st != null){
st.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(conn != null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}

jdbc-DAO的实现的更多相关文章

  1. JDBC—DAO

    一.JDBC 什么是JDBC?JAVA DataBase Connectivity (Java 数据库连接技术)由Java编写的一组类和接口组成,为各种类型的数据库提供统一的访问.JDBC的作用?一种 ...

  2. jdbc/DAO模式

    DAO设计模式: 1.DAO:      DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2.DAO各部分详解:DAO设计模式包括以下4个主要部分: ...

  3. jdbc之二:DAO模式

    详细代码请参见 https://code.csdn.net/jediael_lu/daopattern 1.创建Dao接口. package com.ljh.jasonnews.server.dao; ...

  4. JDBC通用DAO

    dbcBaseDao接口,内容如下: package com.sun4j.core.jdbc.dao; import java.io.Serializable; import java.util.Li ...

  5. jdbc之二:DAO模式 分类: B1_JAVA 2014-04-29 15:13 1536人阅读 评论(0) 收藏

    详细代码请参见 https://github.com/lujinhong/dao 一.前期准备 1.创建数据库 create database filter_conf; 2.创建表并插入数据 crea ...

  6. JDBC的增删改写成一个方法,调用一个工具类

    package com.hx.jdbc.connection; import java.sql.Connection; import java.sql.Statement; import com.my ...

  7. mysql的jdbc入门学习小结

    转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...

  8. Spring-JDBC通用Dao

    JdbcBaseDao JdbcBaseDao接口,内容如下: package com.sun4j.core.jdbc.dao; import java.io.Serializable; import ...

  9. spring对dao层的支持(datasource的作用)

    本文大多数内容转自“http://www.cnblogs.com/liunanjava/p/4412408.html”感谢原作者 在做一个项目时,持久层并没有使用spring jpa和hibernat ...

  10. JDBC第二次学习

    脑子太笨,必须得记录下来一些文字,方便回来查询. 这是我的第二次学习JDBC的笔记,看的是传智播客——李勇老师的JDBC系列,已看到第23集. 分析在实际项目中该如何应用JDBC 一个简单用户相关的数 ...

随机推荐

  1. VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

    属性页对话框包括向导对话框和一般属性页对话框两类,上一节鸡啄米讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的 ...

  2. MSF基础攻击实践报告

    MSF基础攻击实践 MSF的六个模块:exploit,encoder,payload,aux,post,nops exploit——渗透攻击模块 测试者利用它来攻击一个系统,程序,或服务,以获得开发者 ...

  3. linux内核分析第七周-Linux内核如何装载和启动一个可执行程序

    一.可执行文件的创建 可执行文件的创建就是三步:预处理.编译和链接. cd Code vi hello.c #写入最简单的helloworld的c程序 gcc -E -o hello.cpp hell ...

  4. linux第七周

    可执行程序的装载 一.预处理.编译.链接和目标文件的格式 可执行文件的创建——预处理.编译和链接 cd Code vi hello.c gcc -E -o hello.cpp hello.c -m32 ...

  5. Windows Shell编程之如何编写为文件对象弹出信息框的Shell扩展

    有关COM编程资料 转载:http://www.cnblogs.com/lzjsky/archive/2010/11/22/1884702.html 活动桌面引入一项新特性, 当你在某些特定对象上旋停 ...

  6. CCleaner如何禁用开机自动启动

    https://forum.piriform.com/topic/42073-ccleaner-starts-on-startup/ 在options-->setting里面选择开机不启动 在O ...

  7. Rest和WebService的区别

    有好多人问我们在设计底层服务的时候到底是应该选择目前最流行的RestFul架构还是选择老牌的webService呢?今天我就将这两个概念做一下阐述,到底什么情况下选择什么比较合理. 首先需要了解:RE ...

  8. luogu P1192 台阶问题

    https://www.luogu.org/problem/show?pid=1192 登楼梯 肯定能想到  dp[i] = dp[i-1] + dp[i-2] + ...+ dp[i-k] 然后想到 ...

  9. JS中innerHTML和innerText,outerHTML和outerText

      innerHTML 声明了元素含有的HTML文本,不包括元素本身的开始标记和结束标记 innerHTML是符合W3C标准的属性,而innerText只适用于IE浏览器(现在也适应chrome浏览器 ...

  10. appium装上开始干嘛

    先写appium的启动参数啊 比如调试序列号,设备的系统版本. 什么系统. app的包名,这些代码百度上都有的,针对修改下就行.