zoukankan      html  css  js  c++  java
  • MYSQL 之 JDBC(七):增删改查(五) DAO设计模式

    Data Access Object,数据访问对象

    what:访问数据信息的类。包含了对数据的CRUD(create、read、update、delete,增删改查)操作,而不包含任何业务相关的信息。

    why:实现功能的模块化。更有利于代码的维护和升级。DAO可以被子类集成或直接使用

    how:使用JDBC编写DAO可能会包含的方法:

      void update()

    // insert, update, delete 操作都可以包含在其中
    void update(String sql, Object ... args)

      查询

    // 查询一条记录,返回对应的对象
    <T> T get(Class<T> clazz, String sql, Object ... args)
    // 查询多条记录,返回对应的对象的集合
    <T> List<T> getForList(Class<T> clazz, String sql, Object ... args)
    // 返回某条记录的某一个字段的值或一个统计的值(一共有多少记录等。)
    <E> E getForValue(String sql, Object ... args)

    代码实现

    • DAO

    复制代码

    package com.litian.jdbc;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author: Li Tian
     * @contact: litian_cup@163.com
     * @software: IntelliJ IDEA
     * @file: DAO.java
     * @time: 2020/3/26 18:37
     * @desc: |
     */
    
    public class DAO {
        // insert, update, delete 操作都可以包含在其中
        void update(String sql, Object... args) {
            Connection conn = null;
            PreparedStatement ps = null;
    
            try {
                conn = JDBCTools.getConnection();
                ps = conn.prepareStatement(sql);
    
                for (int i = 0; i < args.length; i++) {
                    ps.setObject(i + 1, args[i]);
                }
                ps.executeUpdate();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCTools.release(null, ps, conn);
            }
    
        }
    
        // 查询一条记录,返回对应的对象
        <T> T get(Class<T> clazz, String sql, Object... args) {
            T entity = null;
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                // 1. 获取Connection
                conn = JDBCTools.getConnection();
                // 2. 获取PreparedStatement
                ps = conn.prepareStatement(sql);
                // 3. 填充占位符
                for (int i = 0; i < args.length; i++) {
                    ps.setObject(i + 1, args[i]);
                }
                // 4. 进行查询,得到ResultSet
                rs = ps.executeQuery();
                // 5. 若ResultSet中有记录,准备一个Map<String, Object>: 键:存放列的别名;值:存放列的值
                if (rs.next()) {
                    Map<String, Object> values = new HashMap<>();
                    // 6. 得到ResultSetMetaData对象
                    ResultSetMetaData rsmd = rs.getMetaData();
                    // 7. 处理ResultSet,把指针向下移动一个单位
                    // 8. 由ResultSetMetaData对象得到结果集中有多少列
                    int columnCount = rsmd.getColumnCount();
                    // 9. 由ResultSetMetaData得到每一列的别名,由ResultSet得到具体每一列的值
                    for (int i = 0; i < columnCount; i++) {
                        String columnLabel = rsmd.getColumnLabel(i + 1);
                        Object columnValue = rs.getObject(columnLabel);
    
                        // 10. 填充Map对象
                        values.put(columnLabel, columnValue);
                    }
                    // 11. 用反射创建Class对象的对象
                    entity = clazz.newInstance();
                    // 12. 遍历Map对象,用反射填充对象的属性值:属性名为Map中的Key,属性值为Map中的Value
                    for (Map.Entry<String, Object> entry : values.entrySet()) {
                        String propertyName = entry.getKey();
                        Object value = entry.getValue();
                        ReflectionUtils.setFieldValue(entity, propertyName, value);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCTools.release(rs, ps, conn);
            }
            return entity;
        }
    
        // 查询多条记录,返回对应的对象的集合
        <T> List<T> getForList(Class<T> clazz, String sql, Object... args) {
            return null;
        }
    
        // 返回某条记录的某一个字段的值或一个统计的值(一共有多少记录等。)
        <E> E getForValue(String sql, Object... args) {
            return null;
        }
    }

    复制代码

    DAO测试

    复制代码

    package com.litian.jdbc;
    
    import java.sql.Date;
    import java.sql.Timestamp;
    
    /**
     * @author: Li Tian
     * @contact: litian_cup@163.com
     * @software: IntelliJ IDEA
     * @file: DAOTest.java
     * @time: 2020/3/26 18:59
     * @desc: |
     */
    
    public class DAOTest {
        public static void main(String[] args) {
            DAO dao = new DAO();
            // 测试update
            // String sql = "insert into t_user(id, username, pwd, regTime, lastLoginTime) values(?,?,?,?,?)";
            // dao.update(sql, 4, "李英俊", "123456", new Date(System.currentTimeMillis()), new Timestamp(System.currentTimeMillis()));
    
            // 测试get
            String sql = "select id, username, pwd, regTime, lastLoginTime from t_user where id=?";
            User u = dao.get(User.class, sql, 4);
            System.out.println(u);
        }
    }
  • 相关阅读:
    Could A New Linux Base For Tablets/Smartphones Succeed In 2017?
    使用libhybris,glibc和bionic共存时的TLS冲突的问题
    6 Open Source Mobile OS Alternatives To Android in 2018
    Using MultiROM
    GPU drivers are written by the GPU IP vendors and they only provide Android drivers
    Jolla Brings Wayland Atop Android GPU Drivers
    How to Use Libhybris and Android GPU Libraries with Mer (Linux) on the Cubieboard
    闲聊Libhybris
    【ARM-Linux开发】wayland和weston的介绍
    Wayland and X.org problem : Why not following the Android Solution ?
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13308982.html
Copyright © 2011-2022 走看看