22、Resultset查询

学习目标:

1、了解ResultSet对象

2、使用JDBC连接数据库并执行查询

3、把查询放回的接口进行封装处理

学习过程:

一、ResultSet对象简介

使用JDBC查询的结果存放在ResultSet对象的一系列行中,ResultSet对象的最初位置在行首,ResultSet.next()方法用来在行间移动,ResultSet.getXXX()方法用来取得字段的内容,

每次执行 SQL 语句时,都会用新的结果重写结果集,当相关的 Statement 关闭时,ResultSet对象会自动关闭,当然我们也可以收到关闭ResultSet。

二、示例讲解

前面的几个链接数据库的步骤都是一样的,只是现在需要执行是查询,所以statement使用的方法是executeQuery方法。比如现在我们需要打印所有的用户的信息,其实现代码如下:

// 4、执行sql
String sql = "select user_id  ,user_name from tb_user";
// 结果集
ResultSet rs = statement.executeQuery(sql);
// next 判断有没有下一行,rs指向下一行的位置
while (rs.next()) {
    System.out.println(rs.getInt("user_id")+":"+rs.getString("user_name"));
}

rs.close();
statement.close();
connection.close();

这样打印数据,对于真正的项目来说是没有任何意义的,一般我们需要把数据库的数据封装成为对象,然后返回给系统使用,这里我们可以为当前这张表设计一个与之对应的javaBean对象,代码如下:

public class User {

    private int userId;

    private String userName;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }

}

修改上面的查询全部用户的代码,把查询得到的所有的数据封装到一个List

// 查询全部

public List getAllUser() {

    List users = new ArrayList();
    try {
        // 1、通过反射加载驱动。
        Class.forName("com.mysql.jdbc.Driver");
        // 2、通过驱动管理类建立一个连接 不同数据url写法是不同 ip端口 数据
        Connection connection = DriverManager.getConnection(
        "jdbc:mysql://192.168.11.144/first?useUnicode=true&characterEncoding=utf8", "root", "123456");
        // 3、通过Connect建立Statement
        Statement statement = connection.createStatement();
        // 4、执行sql
        String sql = "select user_id  ,user_name from tb_user";
        // 结果集
        ResultSet rs = statement.executeQuery(sql);
        // next 判断有没有下一行,rs指向下一行的位置
        while (rs.next()) {
            // System.out.println(rs.getInt("user_id")+":"+rs.getString("user_name"));
            User user = new User();
            user.setUserId(rs.getInt("user_id"));
            user.setUserName(rs.getString("user_name"));
            users.add(user);
        }
        //
        rs.close();
        statement.close();
        connection.close();            
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return users;
}

再举一个常用的例子,就是根据用户的id查询一个用户的详细信息,由于只是返回一行数据,所以方法设计就只返回一个对象。同时也不需要使用while循环了,只需要使用if判断是否有数据即可。代码如下:

// 根据id进行查询

public User queryById(int uid) {

    User user = null;
    // 1、通过反射加载驱动。
    try {
        Class.forName("com.mysql.jdbc.Driver");
        // 2、通过驱动管理类建立一个连接 不同数据url写法是不同 ip端口 数据
        Connection connection = DriverManager.getConnection(
        "jdbc:mysql://192.168.11.144/first?useUnicode=true&characterEncoding=utf8","root", "123456");
        // 3、通过Connect建立Statement
        Statement statement = connection.createStatement();
        // 4、执行sql
        String sql = "select user_id  ,user_name from tb_user where user_id=" + uid;
        ResultSet rs=statement.executeQuery(sql);
        if(rs.next()){
            user=new User();
            user.setUserId(rs.getInt("user_id"));
            user.setUserName(rs.getString("user_name"));
        }
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return user;

}

在main方法中测试如下:

 public static void main(String[] args) {

    UserDao userDao = new UserDao();

    // userDao.addUser("郭富城");
    // userDao.delUser(5);
    // userDao.updateUser(6, "曾志伟");
    //List<User> users = userDao.getAllUser();
    User user=userDao.queryById(5);
    if(user!=null){
        System.out.println(user.getUserName());
    }else{
        System.out.println("没有这个用户");
    }

}

下面大家可以为表,添加一个新的密码字段,尝试自己写一个登录的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值