07. JDBC基础 — 通过PreparedStatement执行查询操作

JDBC基础

  —— 通过PreparedStatement执行查询操作

本章目的和提示

使用PreparedStatement实现占位符查询

本文基于第五章的代码基础上结合第六章进行更新

本章以下内容保持和第五章相同:

  • 数据库结构和数据
  • 项目结构
  • User类
  • pom.xml
  • database.properties
  • PropertiesUtils类

本章更新的内容:


1. JDBCUtils类

与第五章不同的是,JDBCUtils中的select()方法做了变动,其他的保持原样

所以此处代码只放出select()方法,此处先放出代码,最后再分析

/**
 * 执行查询操作的方法
 * @param sql
 * @param path
 * @return
 */
public static List<User> select(String path, String sql, Object ...args){
    getConnection(path);
    // 如果创建连接失败,返回null
    if(con == null){
        System.out.println("创建数据库连接失败");
        return null;
    }
    List<User> userList = new ArrayList<User>();
    try {
        // 1. 获取PreparedStatement对象
        ps = con.prepareStatement(sql);
        // 2. 将可变参数循环添加至PreparedStatement对象中
        for(int i=0; i<args.length; i++){
            ps.setObject(i+1, args[i]);
        }
        // 3. 执行查询操作
        rs = ps.executeQuery();
        // 4. 分析ResultSet,将结果剥离出来形成对象集合
        while(rs.next()){
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setPassword(rs.getString("password"));
            user.setAge(rs.getInt("age"));
            user.setRemark(rs.getString("remark"));
            userList.add(user);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close();
    }
    return userList;
}

2. JdbcObjectService接口

接口添加一个selectUserList()方法

/**
 * 查询用户列表
 * @param name
 * @return
 */
List<User> selectUserList(String name);

3. JdbcObjectServiceImpl接口实现类

实现类添加一个selectUserList()方法

public List<User> selectUserList(String name) {
    String sql = "SELECT * FROM user WHERE name = ?";
    List<User> userList = JDBCUtils.select("database.properties", sql,name);
    return userList;
}

4. TestJDBC测试类

测试类添加一个测试方法

@Test
public void select() {
    String name = "浅夏";
    JdbcObjectService service = new JdbcObjectServiceImpl();
    List<User> userList = service.selectUserList(name);
    if (userList == null) {
        System.out.println("用户不存在");
    } else {
        for (User user : userList) {
            System.out.println(user.toString());
        }
    }
}

查询结果

执行测试方法,查出查询结果

在这里插入图片描述

分析

本章的代码成功的使用PrepareStatement实现查询,但却是有缺陷的。

JDBCUtils类中的那个select()中出现了User类,也就是说这个查询方法不再普适(这段代码不在适合其他类型的对象),而是只针对User类进行查询,不再是公共方法

如果我们将ResultSet的对象rs返回到接口实现类中分解,就会造成还需要在上层代码里调用close()方法,就造成了耦合的现象。

所以说这种查询方式并不完美

我们的需要的效果是什么呢?是我们调用select方法,给出我们已有的信息(参数),就能直接返回查询结果,且是以对象的形式返回,同时需要达到不能出现耦合现象。

那么我们下一章进行分析和实现


本章结束

回到目录


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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值