目录
2.3 通过Connection对象获取Statement对象
5.JDBC批量处理
1.JDBC 概述
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。之前操作数据库是在控制台使用SQL语句来操作数据库的,JDBC是用Java语言向数据库发送SQL语句,来达到操作数据库的效果。
1.1 JDBC原理
JDBC由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范,提供一套访问自己公司的数据库服务器的API。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动
DBC 实现细节:JDBC主要分为三部分
- JDBC驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql. DriverManager实现。
- JDBC驱动器API:由Sun公司负责制定,其中最主要的接口是java.sql. Driver
- JDBC驱动器:是一种数据库驱动,由数据库厂商创建和维护,也称为JDBC驱动, 是实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。
2. JDBC 入门
JDBC开发步骤
- 注册驱动
- 获取连接对象Connection
- 通过Connection对象获取Statement对象
- 使用Statement执行SQL语句
- 遍历返回的结果集
- 关闭资源
准备数据
2.1 导入MySQL JDBC 驱动,并注册
- 在项目根目录创建lib目录,用于存放当前项目所需的jar包,并将驱动jar复制到该目录下
- 选择jar包,右键执行build path - Add to Build Path(添加到编译目录)
加载并注册数据库驱动
DriverManager.registerDriver(new Driver());
2.2 获取连接对象Connection
String url = "jdbc:mysql://localhost:3306/mydb1";
Connection conn = DriverManager.getConnection(url, "root", "123456");
2.3 通过Connection对象获取Statement对象
Statement st = conn.createStatement();
2.4 使用Statement执行SQL语句
String sql = "SELECT * FROM user";
ResultSet rs = st.executeQuery(sql);
2.5 遍历返回的结果集
//获取一个值
boolean flag = rs.next();//向下移动,true 代表有下一个记录
System.out.println(flag);
//循环获取所有的数据
while(rs.next()){
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
System.out.println("id" + id + " " + username +" " + password);
}
2.6 关闭资源
//释放资源 后打开的先关闭
rs.close();
st.close();
conn.close();
2.7 完整代码
import com.mysql.jdbc.Driver; import java.sql.*; /** * 1. 注册驱动 * 驱动从哪里来? 框架开发者会将代码封装成jar包 * 项目根目录新建lib文件夹,拷贝驱动到此目录下 * 将驱动进行编译,将驱动文件右键 -- ADD as Library * 使用java代码加载驱动器 * 2.获取数据库连接对象 * 3.通通过Connection对象获取Statement对象 * 4.使用Statement执行SQL语句 * 5.遍历返回的结果集 * 6.关闭资源 * */ public class Demo01 { public static void main(String[] args) throws SQLException { // 1. 注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 String url = "jdbc:mysql://localhost:3306/test2"; Connection connection = DriverManager.getConnection(url,"root","root"); // 3.通通过Connection对象获取Statement对象 Statement st = connection.createStatement(); // 4.使用Statement执行SQL语句 String sql = "SELECT * FROM user"; ResultSet rs = st.executeQuery(sql); // 5.遍历返回的结果集 while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); System.out.println("id" + id + " " + username + " " + password); } // 6.关闭资源 rs.close(); st.close(); connection.close(); } }
运行结果:
3. JDBC 类介绍
3.1 Driver接口
该接口是所有JDBC程序必须实现的接口,该接口专门提供给数据库产商使用。
com.mysql.jdbc.Driver 实现了java.sql.Driver接口
java.sql.Driver接口是所有JDBC程序必须实现的接口,该接口专门提供给数据库产商使用。
3.2 DriverManger类
该类用于加载JDBC驱动并创建数据库的连接
static Connection
getConnection(String url, String user, String password)
试图建立到给定数据库 URL 的连接。语法:
1. url:
jdbc:mysql://ip地址:端口号/数据库名称
细节:如果连接的是本机数据库,数据库的默认端口号为3306jdbc.mysql:/localhost:3306/test1可写为:jdbc:mysql:///test1
2.user:数据库用户名
3.password :数据库密码3.3 Connection接口
Connection接口代表Java程序和数据库的连接
普通方法
createStatement():获取Statement(执行sql语句)prepareStatement():获取PrepareStatement对象
void
close()
立即释放此Connection
对象的数据库和 JDBC 资源,而不是等待它们被自动释放。Statement
createStatement()
创建一个Statement
对象来将 SQL 语句发送到数据库。PreparedStatement
prepareStatement(String sql)
创建一个PreparedStatement
对象来将参数化的 SQL 语句发送到数据库。管理事务的方法
开启事务
setAutoCommit()
void
setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。提交事务
commit()
void
commit()
使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection
对象当前持有的所有数据库锁。回滚事务
rollback()
void
rollback()
取消在当前事务中进行的所有更改,并释放此Connection
对象当前持有的所有数据库锁。3.4 Statement 接口
用于向数据库发送SQL语句
1.bealoon execute(): 用于向数据库发送任意sql
2.int executeUpdate(): 利用返回值判断非0来确定sql语句是否执行成功。[执行DML(insert update delete) DDL(create alter drop)]
3.ResultSet executeQuery(): 可以通过execute方法来执行任何sql语句.
4.JDBC增删改查操作
4.1 查询
查询数据
Resultset类:封装了结果集的对象
用到方法:
ResutSet executeQuery (string sql)
Resultset的方法
next():将游标下移,判断是否还有数据
getXXX(int columnIndex)获取指定列的类型数据
columnIndex:代表列的编号(从1开始)
XXX:为数据类型
getXXX(String name):获取指定列的类型数据name: 为列名(如id)
使用步骤:
在执行SQL语句操作中
1.获取ResultSet对象在返回结果中
2.调用rs.next(),判断是否有下一行,因为数据的个数不确定,所以使用while循环来操作调3.用getXX()获取数据
4.1.1查询全部
public static void main(String[] args) throws SQLException { selectAll(); } /** * 查询所有数据 * * @throws SQLException */ public static void selectAll() throws SQLException { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root"); // 3.通通过Connection对象获取Statement对象 Statement st = conn.createStatement(); // 4.执行SQL语句 String sql = "select * from user"; ResultSet rs = st.executeQuery(sql); // 5.返回的结果集 System.out.println("id username password email"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " " + username + " " + password + " " + email); } //关闭资源 rs.close(); st.close(); conn.close(); }
![]()
4.1.2 根据ID查询
运行结果:
4.2 添加数据
public static void main(String[] args) throws SQLException { insert(); selectAll(); } public static void insert() throws SQLException { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root"); // 3.获取Statement对象 Statement st = conn.createStatement(); // 4.执行sql语句 String sql = "insert into user (id,username,password,email) values (NULL,'wangwu','123','123@qq.com')"; int i = st.executeUpdate(sql); // 5.返回结果 if(i >0){ System.out.println("数据插入成功。"); }else{ System.out.println("数据插入失败。"); } // 6.关闭资源 st.close(); conn.close(); }
运行结果:
4.3 修改数据
public static void main(String[] args) throws SQLException { System.out.println("更新前的数据"); selectAll(); update(); System.out.println("更新后的数据"); selectAll(); } /** * 修改数据(使用铺货异常) */ public static void update(){ Connection conn = null; Statement st = null; try { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root"); // 3.获取Statement对象 st = conn.createStatement(); // 4.执行sql语句 String sql = "update user set password = '12345' where id = 3;"; int i = st.executeUpdate(sql); // 5.返回结果 if(i >0){ System.out.println("数据更新成功。"); }else{ System.out.println("数据更新失败。"); } } catch (SQLException e) { e.printStackTrace(); }finally { // 6.关闭资源(无论如何都要关闭资源) if(st != null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } /** * 插入数据 * @throws SQLException */ public static void insert() throws SQLException { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a"); // 3.获取Statement对象 Statement st = conn.createStatement(); // 4.执行sql语句 String sql = "insert into user (id,username,password,email) values (NULL,'wangwu','123','123@qq.com')"; int i = st.executeUpdate(sql); // 5.返回结果 if(i >0){ System.out.println("数据插入成功。"); }else{ System.out.println("数据插入失败。"); } // 6.关闭资源 st.close(); conn.close(); } /** * 查询所有数据 * * @throws SQLException */ public static void selectAll() throws SQLException { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a"); // 3.通通过Connection对象获取Statement对象 Statement st = conn.createStatement(); // 4.执行SQL语句 String sql = "select * from user"; ResultSet rs = st.executeQuery(sql); // 5.返回的结果集 System.out.println("id username password email"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " " + username + " " + password + " " + email); } //关闭资源 rs.close(); st.close(); conn.close(); }
运行结果:
4.4 删除数据
public static void main(String[] args) throws SQLException { System.out.println("删除前的数据"); selectAll(); delete(); System.out.println("删除后的数据"); selectAll(); } /** * 删除数据 */ public static void delete() { Connection conn = null; Statement st = null; try { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.连接数据库对象 conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root"); // 3.获取Statement对象 st = conn.createStatement(); // 4.执行功能sql语句 String sql = "delete from user where id = 1"; int i = st.executeUpdate(sql); // 5.返回结果 if (i > 0) { System.out.println("数据删除成功。"); } else { System.out.println("数据删除失败。"); } } catch (SQLException e) { e.printStackTrace(); } finally { // 6.关闭资源(无论如何都要关闭资源) if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } /** * 修改数据(使用铺货异常) */ public static void update() { Connection conn = null; Statement st = null; try { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a"); // 3.获取Statement对象 st = conn.createStatement(); // 4.执行sql语句 String sql = "update user set password = '12345' where id = 3;"; int i = st.executeUpdate(sql); // 5.返回结果 if (i > 0) { System.out.println("数据更新成功。"); } else { System.out.println("数据更新失败。"); } } catch (SQLException e) { e.printStackTrace(); } finally { // 6.关闭资源(无论如何都要关闭资源) if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } /** * 插入数据 * * @throws SQLException */ public static void insert() throws SQLException { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a"); // 3.获取Statement对象 Statement st = conn.createStatement(); // 4.执行sql语句 String sql = "insert into user (id,username,password,email) values (NULL,'wangwu','123','123@qq.com')"; int i = st.executeUpdate(sql); // 5.返回结果 if (i > 0) { System.out.println("数据插入成功。"); } else { System.out.println("数据插入失败。"); } // 6.关闭资源 st.close(); conn.close(); } /** * 查询所有数据 * * @throws SQLException */ public static void selectAll() throws SQLException { // 1.注册驱动 DriverManager.registerDriver(new Driver()); // 2.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a"); // 3.通通过Connection对象获取Statement对象 Statement st = conn.createStatement(); // 4.执行SQL语句 String sql = "select * from user"; ResultSet rs = st.executeQuery(sql); // 5.返回的结果集 System.out.println("id username password email"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " " + username + " " + password + " " + email); } //关闭资源 rs.close(); st.close(); conn.close(); }
运行结果:
4.5 封装数据
将获取到的数据封装到对象中((User),然后将所有的User对象存入List集合
新建一个方法,将查询到的数据装到对象中(User),并将所有的User对象存入List集合,并返回
1.新建User类
User类里面的属性有什么?
类的属性和表的列相同
表中的列数据类型怎么和Java的数据类型对应?
类型对应表
如:varchar 对应String
2.定义方法:
public (static) List<User> findAllUser()public class User { private Integer id; private String username; private String password; private String email; public User() { } public User(Integer id, String username, String password, String email) { this.id = id; this.username = username; this.password = password; this.email = email; } @Override public String toString() { return "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + "\r\n"; } }
public static void main(String[] args) throws SQLException { System.out.println(findAllUser()); } /** * 封装数据 * @return */ public static List<User> findAllUser() { List<User> users = new ArrayList<>(); Connection conn = null; Statement st = null; ResultSet rs = null; try { DriverManager.registerDriver(new Driver()); conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root"); st = conn.createStatement(); String sql = "select * from user"; rs = st.executeQuery(sql); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); User user = new User(id, username, password, email); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return users; }
运行结果:
4.6 SQL 安全问题 SQL注入
编写代码模拟登陆功能
添加完成登陆功能的方法, 返回是否登陆成功
方法:
public boolean login(String username,String password){}
具体实现:
根据用户名和密码查询数据库
select * from user where username ='" + username + "'and password = '" + password+"'"
public static void main(String[] args) throws SQLException { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.next(); System.out.println("请输入密码:"); String password = sc.next(); if (login(username, password)){ System.out.println("登入成功"); }else{ System.out.println("登入失败"); } } private static boolean login(String username, String password) throws SQLException { DriverManager.registerDriver(new Driver()); Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "2633683194a"); String sql = "select * from user where username = ? and password = ? "; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1,username); ps.setString(2,password); ResultSet rs = ps.executeQuery(); if (rs.next()) { rs.close(); ps.close(); conn.close(); return true; } else { rs.close(); ps.close(); conn.close(); return false; } }
运行结果:
SQL 安全问题 SQL注入
利用特殊的字符或关键字参与sql字符串的拼接 会造成安全问题
> 用户名密码都输入: a' or 'a' = 'a
> 用户名密码都输入: a' or 'a' = 'a' --
问题出现的原因:
sql拼接问题
SELECT * FROM user WHERE username = 'a' or 'a' = 'a' AND password = 'a' or 'a' = 'a'
解决SQL 安全问题
预编译sql:
获取PreparedStatement
PreparedStatement ps = conn.prepareStatement(sql);定义sql
参数使用?作为占位符
SELECT * FROM user WHERE username = ? AND password = ?
设置参数,给?赋值
void setXXX(int parameterIndex, String x):XXX为数据类型
参数1 : ?号的编号 从1开始
参数2 : ? 具体的值代码演示:
public static void main(String[] args) throws SQLException { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.next(); System.out.println("请输入密码:"); String password = sc.next(); if (login(username, password)) { System.out.println("登入成功"); } else { System.out.println("登入失败"); } } private static boolean login(String username, String password) throws SQLException { DriverManager.registerDriver(new Driver()); Connection conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root"); Statement st = conn.createStatement(); String sql = "select * from user where username = ? and password = ? "; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1,username); ps.setString(2,password); ResultSet rs = ps.executeQuery(); if (rs.next()) { rs.close(); st.close(); conn.close(); return true; } else { rs.close(); st.close(); conn.close(); return false; } }
运行结果:
4.7 JDBC工具类
基于上面的增删改查示例,每次进行操作都需要【获取连接】【释放资源】,这两部分代码重复了,那么可以考虑对其进行优化,将【获取连接】和【释放资源】的代码抽取到单独的类中
编写JDBC工具类方式一:
import com.mysql.jdbc.Driver; import java.sql.*; public class JDBCUtil { /** * 获取连接方法 * * @return Connection */ public static Connection getConnection() { Connection conn = null; try { DriverManager.registerDriver(new Driver()); conn = DriverManager.getConnection("jdbc:mysql:///test2", "root", "root"); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * 关闭资源 * * @param conn * @param st * @param rs */ public static void close(Connection conn, Statement st, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
将JDBCUtil 工具类应用到登入案例中
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.next(); System.out.println("请输入密码:"); String password = sc.next(); if (login(username, password)) { System.out.println("登入成功"); } else { System.out.println("登入失败"); } } private static boolean login(String username, String password) { Connection conn = JDBCUtil.getConnection(); PreparedStatement ps = null; ResultSet rs = null; try { String sql = "select * from user where username = ? and password = ? "; ps = conn.prepareStatement(sql); ps.setString(1,username); ps.setString(2,password); rs = ps.executeQuery(); return rs.next(); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtil.close(conn,ps,rs); } return false; }
编写JDBC工具类方式二:
上部分代码写好后,基本的JDBC工具类已经完成了,但是有时候我们需要考虑程序灵活性问题,比如获取连接的代码,目前连接数据库的用户名和密码是以硬编码方式传入的,那么是否可以使用配置文件的方式呢?代码如下,将数据库的连接信息写入配置文件中,使用是直接读取配置文件即可。
Properties介绍
Properties继承自Hashtable,说明其是以键与值的方式存在的,只是Properties的键与值都是必须是字符串类型的数据。Properties常被用于配置文件的写入与读取,配置文件中记录着程序的各项参数信息,使用程序的用户可以自定义某些参数,以达到软件的个性化。
配置文件:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.sql.*; import java.util.Properties; public class JDBCUtil2 { private static String driver; private static String url; private static String username; private static String password; /** * 静态代码块加载配置文件信息 */ static { FileReader in = null; Properties pro = new Properties(); try { in = new FileReader("jdbc.properties"); pro.load(in);// 加载配置信息 driver = pro.getProperty("driverClassName"); url = pro.getProperty("url"); username = pro.getProperty("username"); password = pro.getProperty("password"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 获取连接方法 * @return Connection */ public static Connection getConnection() { Connection conn = null; try { //通过反射方式注册驱动 //反射会直接执行Driver类中的静态代码块 Class.forName(driver); conn = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 关闭资源 * * @param conn * @param st * @param rs */ public static void close(Connection conn, Statement st, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
将JDBCUtil2工具类应用到登入案例中
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.next(); System.out.println("请输入密码:"); String password = sc.next(); if (login(username, password)) { System.out.println("登入成功"); } else { System.out.println("登入失败"); } } private static boolean login(String username, String password) { Connection conn = JDBCUtil2.getConnection(); PreparedStatement ps = null; ResultSet rs = null; try { String sql = "select * from user where username = ? and password = ? "; ps = conn.prepareStatement(sql); ps.setString(1,username); ps.setString(2,password); rs = ps.executeQuery(); return rs.next(); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtil2.close(conn,ps,rs); } return false; }
运行结果:
5.JDBC批量处理
当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
实现批处理方式:如果有100条sql语句,调用addBatch(sql)方法时,就会把sql语句加到list集合里去
Statement.addBatch(sql)
执行批处理SQL语句:
executeBatch()方法:执行批处理命令
clearBatch()方法:清除批处理命令
代码示例:
public static void main(String[] args) throws SQLException { System.out.println("批量处理前的数据"); selectAll(); System.out.println("批量处理后的数据"); executeBatch(); selectAll(); } public static void executeBatch() throws SQLException { Connection con = JDBCUtil.getConnection(); String sql = "INSERT INTO user VALUES(?,?,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); for (int i = 4; i < 11; i++) { pstmt.setInt(1, i); pstmt.setString(2, "stu_" + i); pstmt.setString(3, "123" + i); pstmt.setString(4, i + "@qq.com"); pstmt.addBatch(); } pstmt.executeBatch(); } public static void selectAll() throws SQLException { Connection con = JDBCUtil.getConnection(); Statement st = con.createStatement(); String sql = "select * from user;"; ResultSet rs = st.executeQuery(sql); System.out.println("id username password"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); System.out.println(id + " " + username + " " + password); } }
运行结果: