学习目标:
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("没有这个用户");
}
}
下面大家可以为表,添加一个新的密码字段,尝试自己写一个登录的方法。