博客
关于我
JDBC DAO模式笔记
阅读量:341 次
发布时间:2019-03-04

本文共 5610 字,大约阅读时间需要 18 分钟。

DAO的全称是Data Access Object,旨在将对数据库的操作进行封装,使开发人员可以通过调用简单的方法与数据库进行交互,而无需直接处理连接或事务管理。

DAO的组成部分

  • VO类

    VO(Value Object)类用于与数据表单中的字段一一对应,通常包含与数据库表字段相同的属性,并提供相应的 setter 和 getter 方法来进行数据的获取和设置。该类主要用于数据传输和展示。

  • 数据库连接类(DBUtil类)

    DBUtil类负责管理数据库连接和关闭操作。它通常包含静态方法,用于获取数据库配置信息(如驱动类、连接URL、用户名和密码),以及打开和关闭数据库连接的功能。

  • DAO接口

    DAO接口定义了与数据库进行操作的通用方法,通常包括增、删、改、查等基本操作。每个方法的具体实现由对应的实现类负责。

  • DAO实现类

    DAO实现类对接口中的方法进行具体实现,负责与数据库进行数据的增、删、改、查操作。例如,插入数据时,实现类会调用PreparedStatement执行SQL语句,并处理可能的异常。

  • 示例

    假设数据表包含ID、NAME、AGE三个字段,常见的VO类如下:

    public class Customer {
    private int id;
    private String name;
    private int age;
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    @Override
    public String toString() {
    return "id:" + id + " name:" + name + " age:" + age;
    }
    }

    数据库连接类DBUtil的实现如下:

    public class DBUtil {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    static {
    Properties prop = new Properties();
    try {
    Reader in = new FileReader("src/config.properties");
    prop.load(in);
    } catch (Exception e) {
    e.printStackTrace();
    }
    driver = prop.getProperty("driver");
    url = prop.getProperty("url");
    username = prop.getProperty("username");
    password = prop.getProperty("password");
    }
    public static Connection open() {
    try {
    Class.forName(driver);
    return DriverManager.getConnection(url, username, password);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    public static void close(Connection conn) {
    if (conn != null) {
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }

    DAO接口的定义如下:

    import java.util.List;
    public interface CustomerDAO {
    void add(Customer c);
    void update(Customer c);
    void delete(int id);
    Customer getCustomerById(int id);
    List
    query();
    }

    DAO实现类的示例代码如下:

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    public class CustomerDaoImp implements CustomerDAO {
    public void add(Customer c) {
    Connection conn = DBUtil.open();
    String sql = "insert into person(name, age) values (?, ?)";
    try {
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, c.getName());
    pstmt.setInt(2, c.getAge());
    pstmt.executeUpdate();
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    DBUtil.close(conn);
    }
    }
    public void update(Customer c) {
    Connection conn = DBUtil.open();
    String sql = "update person set name=?, age=? where id =?";
    try {
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, c.getName());
    pstmt.setInt(2, c.getAge());
    pstmt.setInt(3, c.getId());
    pstmt.executeUpdate();
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    DBUtil.close(conn);
    }
    }
    public void delete(int id) {
    Connection conn = DBUtil.open();
    String sql = "delete from person where id =?";
    try {
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1, id);
    pstmt.executeUpdate();
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    DBUtil.close(conn);
    }
    }
    public Customer getCustomerById(int id) {
    Connection conn = DBUtil.open();
    String sql = "select id, name, age from person where id =?";
    try {
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1, id);
    ResultSet rs = pstmt.executeQuery();
    if (rs.next()) {
    Customer c = new Customer();
    c.setId(rs.getInt(1));
    c.setName(rs.getString(2));
    c.setAge(rs.getInt(3));
    return c;
    }
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    DBUtil.close(conn);
    }
    return null;
    }
    public List
    query() {
    Connection conn = DBUtil.open();
    String sql = "select id, name, age from person";
    List
    list = new ArrayList<>();
    try {
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    while (rs.next()) {
    int id = rs.getInt(1);
    String name = rs.getString(2);
    int age = rs.getInt(3);
    Customer c = new Customer();
    c.setId(id);
    c.setName(name);
    c.setAge(age);
    list.add(c);
    }
    return list;
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    DBUtil.close(conn);
    }
    return null;
    }
    }

    这种结构使得代码更易于管理和扩展,同时遵循了面向接口编程的原则,提高了代码的可维护性和复用性。

    转载地址:http://awbh.baihongyu.com/

    你可能感兴趣的文章
    OfficeWeb365 Indexs 任意文件读取漏洞复现
    查看>>
    OfficeWeb365 Readfile 任意文件读取漏洞复现
    查看>>
    OfficeWeb365 SaveDraw 文件上传漏洞复现
    查看>>
    office中的所有content type
    查看>>
    office之Excel 你会用 Ctrl + E 吗?
    查看>>
    Office办公软件里的“开发工具”选项卡-ChatGPT4o作答
    查看>>
    Office开发工具选项卡中的控件-ChatGPT4o作答
    查看>>
    Offline Installation the .NET Framework 3.5 on Windows 8
    查看>>
    OGC服务标准(地图资料篇.3)
    查看>>
    OGG初始化之使用数据库实用程序加载数据
    查看>>
    ogg参数解析
    查看>>
    ognl详解
    查看>>
    Ogre 插件系统
    查看>>
    Oil Deposits
    查看>>
    oj2894(贝尔曼福特模板)
    查看>>
    OJ4TH|Let's play a game
    查看>>
    OJ中处理超大数据的方法
    查看>>
    OJ中常见的一种presentation error解决方法
    查看>>
    OK335xS UART device registe hacking
    查看>>
    ok6410内存初始化
    查看>>