09. JDBC基础 — DAO设计模式

JDBC基础

  —— DAO设计模式

什么是DAO设计模式?

  上面几章下来,其实我们已经差不多完成了DAO的基础了,我们在第6章和第8章已经实现了使用面向对象的思想通过JDBC对数据库进行了更新操作(INSERT、UPDATE、DELETE)和查询操作(SELECT);

  其中我们在第8章中JDBCUtils类的select()方法返回的是List集合,而我们平时有可能只需要查询返回一个对象,那么只要将解析ResultSet结果集的while(rs.next())改成if(rs.next()),那么就只会返回一个对象了。

  我们把查询的方法和更新的方法放在一个类里,那么调用层只需要调用这个类中的方法,传入需要的参数,那么就可以实现JDBC的操作

DAO类的特点:

  1. 访问数据信息的类,包含了对数据的CRUD方法
  2. DAO的类里不包含任何业务相关的信息

我们为什么要用DAO设计模式?

好处是什么:

  1. 实现功能的模块化,更有利于代码的维护和升级
  2. DAO可以被子类继承或直接使用

DAO设计模式怎么用?

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

  1. 更新方法(可参照第6章JDBCUtils类的update()方法)
  2. 查询多条记录的方法(可参照第8章JDBCUtils类的select()方法)
  3. 查询单条记录的方法(可根据第8章JDBCUtils类的select()方法稍作改变,上面提到了)
  4. 查询某条记录的某个字段的值或一个统计的值(可根据第8章JDBCUtils类的select()方法稍作改变,在解析时读取SQL返回字段的值后,返回Object对象,外部接收后强转以下即可)

  针对第4点,我举个栗子:我需要一个查询表数量的查询方法,下面是JDBCUtils的针对多条数据某些字段或单个数据的数量值的select方法。这种查询方法可以根据具体的查询需求进行抽象为通用方法,抽象方法越通用,那么灵活性必然也越高,调用层需要转换(迁就)的部分也就越多
/**
 * 查询单条数据的某些字段
 * @param path 数据库连接信息文件地址
 * @param sql 查询的sql
 * @param args 可变参数
 * @return
 */
public static List<Map<String, Object>> selectForValue(String path, String sql, Object ... args){
    getConnection(path);
    // 如果创建连接失败,返回null
    if(con == null){
        System.out.println("创建数据库连接失败");
        return null;
    }
    List<Map<String, Object>>  list = new ArrayList<Map<String, Object>>();
    try{
        ps = con.prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            ps.setObject(i+1, args[i]);
        }
        rs = ps.executeQuery();
        while(rs.next()){
            ResultSetMetaData rsmd = rs.getMetaData();
            Map<String, Object> map = new HashMap<String, Object>();
            for(int i=0;i<rsmd.getColumnCount();i++) {
                String columnLabel = rsmd.getColumnLabel(i+1);
                Object columnValue = rs.getObject(columnLabel);
                map.put(columnLabel, columnValue);
            }
            list.add(map);
        }
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        // 关闭数据库连接
        close();
    }
    return list;
}

  这里是调用层的代码,我写了两个方法,一个是查询表数据量的,一个是查询某个表符合条件的数据的特定字段的

public Integer selectUserCount() {
    String sql = "SELECT count(1) count FROM user";
    List<Map<String, Object>> list = JDBCUtils.selectForValue("database.properties", sql, User.class);
    Integer count = Integer.parseInt(list.get(0).get("count").toString());
    return count;
}

public List<Map<String, Object>> selectUser(Integer age) {
    String sql = "SELECT name, remark FROM user WHERE age = ?";
    List<Map<String, Object>> list = JDBCUtils.selectForValue("database.properties", sql, User.class, age);
    return list;
}

测试代码

Integer count = service.selectUserCount();
System.out.println("User表数据量:" + count);

List<Map<String, Object>> list3 = service.selectUser(19);
for(Map<String, Object> map : list3) {
    System.out.println(map.get("name") + ":" + map.get("remark"));
}

结果:

User表数据量:4
浅夏:这是一个乐观的女孩
苏熙:这是一个可爱的美少女

本章结束

回到目录


如果本文有错误或对本文有不理解的地方欢迎评论 _

如果本文有帮助到您,可以点一下右上角的赞哦,谢谢啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值