什么是 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接口:

  1. public interface IStudentDAO {
  2. /**
  3. * 保存学生对象
  4. * @param stu 需要保存的学生
  5. */
  6. void save(Student stu);
  7. /**
  8. * 删除指定id的学生
  9. * @param id 需要删除的学生的id
  10. */
  11. void delete(int id);
  12. /**
  13. * 更改操作
  14. * @param newStu 更改后的学生对象,根据id更改
  15. */
  16. void update(Student newStu);
  17. /**
  18. * 根据id查询单个学生对象信息
  19. * @param id 需要查询学生的id
  20. * @return 存在该学生返回学生对象 不存在则返回null
  21. */
  22. Student get(long id );
  23. /**
  24. * 查询所有学生
  25. * @return 返回一个学生对象的集合
  26. */
  27. List<Student> list();
  28. }

实现类:

  1. public void save(Student stu) {
  2. String sql = "INSERT INTO s_student(name,age) VALUES('狗哲',21)";
  3. Connection conn = null;
  4. Statement st = null
  5. try {
  6. Class.forName("com.mysql.jdbc.Driver");
  7. conn = DriverManager.getConnection("jdbc:mysql:///demo","root","admin");
  8. st = conn.createStatement();
  9. st.executeUpdate(sql);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }finally {
  13. try{
  14. if(st != null){
  15. st.close();
  16. }
  17. }catch (Exception e){
  18. e.printStackTrace();
  19. }finally {
  20. try{
  21. if(conn != null){
  22. conn.close();
  23. }
  24. }catch (Exception e){
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }
  30. 增删改只有sql语句不一样,省略
  31. ····
  32. ····
  33. public List<Student> list() {
  34. String sql = "SELECT * FROM s_student";
  35. Connection conn = null;
  36. Statement st = null;
  37. ResultSet rs = null;
  38. List<Student> list = new ArrayList<>();
  39. try {
  40. Class.forName("com.mysql.jdbc.Driver");
  41. conn = DriverManager.getConnection("jdbc:mysql:///demo","root","admin");
  42. st = conn.createStatement();
  43. rs = st.executeQuery(sql);
  44. while(rs.next()){
  45. String name = rs.getString("name");
  46. Integer age = rs.getInt("age");
  47. list.add(new Student(name,age));
  48. }
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. }finally {
  52. try{
  53. if(st != null){
  54. st.close();
  55. }
  56. }catch (Exception e){
  57. e.printStackTrace();
  58. }finally {
  59. try{
  60. if(conn != null){
  61. conn.close();
  62. }
  63. }catch (Exception e){
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68. return list;
  69. }

DAO实现的重构

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

  • 1、定义一个JdbcUtil类,把加载注册驱动放到静态代码块中,因为没有必要每次都去加载。
  • 2、把url,classDriverName,username,password ,放在一个资源文件中,用加载资源文件的方式获取这些值,保证了代码的可维护性
  • 3、异常处理代码也放在工具类中,异常处理及其麻烦,影响代码的美观
  1. public class JdbcUtil {
  2. private static Properties p = new Properties();
  3. //加载资源文件
  4. static{
  5. ClassLoader loader = Thread.currentThread().getContextClassLoader();
  6. InputStream inStream = loader.getResourceAsStream("db.properties");
  7. try {
  8. p.load(inStream);
  9. Class.forName(p.getProperty("classDriver"));
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. //获取连接对象
  15. public static Connection getConn(){
  16. Connection conn = null;
  17. try {
  18. conn = DriverManager.getConnection(p.getProperty("url"),p.getProperty("username"), p.getProperty("password"));
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. }
  22. return conn;
  23. }
  24. //关闭资源
  25. public static void close(Connection conn,Statement st,ResultSet rs){
  26. try{
  27. if(rs != null){
  28. rs.close();
  29. }
  30. }catch(Exception e){
  31. e.printStackTrace();
  32. }finally{
  33. try{
  34. if(st != null){
  35. st.close();
  36. }
  37. }catch(Exception e){
  38. e.printStackTrace();
  39. }finally{
  40. try{
  41. if(conn != null){
  42. conn.close();
  43. }
  44. }catch(Exception e){
  45. e.printStackTrace();
  46. }
  47. }
  48. }
  49. }
  50. }

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. oracle定时器job的使用

    对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作.但是,Oracle定时器Job时间的处理 ...

  2. P1879 [USACO06NOV]玉米田Corn Fields(状压dp)

    P1879 [USACO06NOV]玉米田Corn Fields 状压dp水题 看到$n,m<=12$,肯定是状压鸭 先筛去所有不合法状态,蓝后用可行的状态跑一次dp就ok了 #include& ...

  3. JS中的slice和splice

    1,slice  : 定义:接收一个或两个参数,它可以创建一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值. 用法:slice( para1 ),会截取从pa ...

  4. 20155201 2016-2017-2 《Java程序设计》第十周学习总结

    20155201 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 Java密码技术 安全的三个属性 机密性 完整性 可用性 密码学: 主要是研究保密通信和信息 ...

  5. 20145319 return-to-libc攻击实验

    20145319 Return-to-libc攻击实验 一 实验内容 return-to-libc实验是一个基于缓冲区溢出攻击实验的基础上的一种攻击实验 缓冲区溢出攻击相关知识: 原理:通过一段包含s ...

  6. Applet初次使用

    ZLYD团队Apllet学习笔记 初识Applet Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同.J ...

  7. 寻找List之和的最近素数

    Task : Given a List [] of n integers , find minimum mumber to be inserted in a list, so that sum of ...

  8. Tinkoff Challenge - Elimination Round B. Igor and his way to work(dfs+优化)

    http://codeforces.com/contest/793/problem/B 题意:一个地图,有起点和终点还有障碍点,求从起点出发到达终点,经过的路径上转弯次数是否能不超过2. 思路: 直接 ...

  9. Maven简单的配置Junit测试及使用简单的mock

    1.maven依赖配置如下 <dependency> <groupId>org.mockito</groupId> <artifactId>mockit ...

  10. XML_CPP_ZC_libXml2

    1.错误信息: /* * Use the following function to reset the two global variables * xmlGenericError and xmlG ...