4. Statement 接口
4.1JDBC 访问数据库的步骤
- 注册和加载驱动(可以省略)
- 获取连接
- Connection 获取 Statement 对象
- 使用 Statement 对象执行 SQL 语句
- 返回结果集
- 释放资源
4.2 Statement 作用:
代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。
4.3Statement 中的方法:
4.4释放资源
- 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
- 释放原则:先开的后关,后开的先关。ResultSet Statement Connection
- 放在哪个代码块中:finally 块
4.5执行 DDL 操作
4.5.1需求:使用 JDBC 在 MySQL 的数据库中创建一张学生表
4.5.2代码:
package com.itheima; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * 创建一张学生表*/ public class Demo4DDL { public static void main(String[] args) { //1. 创建连接 Connection conn = null; Statement statement = null; try { conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root"); //2. 通过连接对象得到语句对象 statement = conn.createStatement(); //3. 通过语句对象发送 SQL 语句给服务器 //4. 执行 SQL statement.executeUpdate("create table student (id int PRIMARY key auto_increment, " + "name varchar(20) not null, gender boolean, birthday date)"); //5. 返回影响行数(DDL 没有返回值) System.out.println("创建表成功"); } catch (SQLException e) { e.printStackTrace(); } //6. 释放资源 finally { //关闭之前要先判断 if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
4.6执行 DML 操作
需求:向学生表中添加 4 条记录,主键是自动增长
步骤:
- 创建连接对象
- 创建 Statement 语句对象
- 执行 SQL 语句:executeUpdate(sql)
- 返回影响的行数
- 释放资源
代码:
package com.sqltest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * 向学生表中添加 4 条记录,主键是自动增长*/ public class Demo5DML { public static void main(String[] args) throws SQLException { // 1) 创建连接对象 Connection connection = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root"); // 2) 创建 Statement 语句对象 Statement statement = connection.createStatement(); // 3) 执行 SQL 语句: executeUpdate(sql) ; int count = 0; // 4) 返回影响的行数 count += statement.executeUpdate("insert into student values(null, '孙悟空', 1, '1993-03- 24')"); count += statement.executeUpdate("insert into student values(null, '白骨精', 0, '1995-03- 24')"); count += statement.executeUpdate("insert into student values(null, '猪八戒', 1, '1903-03- 24')"); count += statement.executeUpdate("insert into student values(null, '嫦娥', 0, '1993-03- 11')"); System.out.println("插入了" + count + "条记录"); // 5) 释放资源 statement.close(); connection.close(); } }
4.7执行 DQL 操作
4.7.1ResultSet 接口:
作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。
接口中的方法:
4.7.2常用数据类型转换表
注意:java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:java.util.Date
4.7.3需求:确保数据库中有 3 条以上的记录,查询所有的学员信息
步骤:
- 得到连接对象
- 得到语句对象
- 执行 SQL 语句得到结果集 ResultSet 对象
- 循环遍历取出每一条记录
- 输出的控制台上
- 释放资源结果:
代码:
package com.sqltest; import java.sql.*; /** * 查询所有的学生信息*/ public class Demo6DQL { public static void main(String[] args) throws SQLException { //1) 得到连接对象 Connection connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/day24","root","root"); //2) 得到语句对象 Statement statement = connection.createStatement(); //3) 执行 SQL 语句得到结果集 ResultSet 对象 ResultSet rs = statement.executeQuery("select * from student"); //4) 循环遍历取出每一条记录 while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); boolean gender = rs.getBoolean("gender"); Date birthday = rs.getDate("birthday"); //5) 输出的控制台上 System.out.println("编号:" + id + ", 姓名:" + name + ", 性别:" + gender + ", 生日:" + birthday); } //6) 释放资源 rs.close(); statement.close(); connection.close(); } }
4.7.4关于 ResultSet 接口中的注意事项:
- 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
- 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set
- 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
5. 数据库工具类 JdbcUtils
什么时候自己创建工具类?
如果一个功能经常要用到,我们建议把这个功能做成一个工具类,可以在不同的地方重用。
5.1需求:
上面写的代码中出现了很多重复的代码,可以把这些公共代码抽取出来。
5.2创建类 JdbcUtil 包含 3 个方法:
- 可以把几个字符串定义成常量:用户名,密码,URL,驱动类
- 得到数据库的连接:getConnection()
- 关闭所有打开的资源:
close(Connection conn, Statement stmt),close(Connection conn, Statement stmt, ResultSet rs)
JdbcUtil.java 代码:
package com.sqltest.utils; import java.sql.*; /** * 访问数据库的工具类*/ public class JdbcUtils { //可以把几个字符串定义成常量:用户名,密码,URL,驱动类 private static final String USER = "root"; private static final String PWD = "root"; private static final String URL = "jdbc:mysql://localhost:3306/day24"; private static final String DRIVER= "com.mysql.jdbc.Driver"; /** * 注册驱动*/ static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 得到数据库的连接*/ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL,USER,PWD); } /** * 关闭所有打开的资源*/ public static void close(Connection conn, Statement stmt) { if (stmt!=null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 关闭所有打开的资源*/ public static void close(Connection conn, Statement stmt, ResultSet rs) { if (rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } close(conn, stmt); } }
5.3案例:用户登陆
5.3.1需求:
- 有一张用户表
- 添加几条用户记录
create table user ( id int primary key auto_increment, name varchar(20), password varchar(20) ) insert into user values (null,'jack','123'),(null,'rose','456'); -- 登录, SQL 中大小写不敏感 select * from user where name='JACK' and password='123'; -- 登录失败 select * from user where name='JACK' and password='333';
使用 Statement 字符串拼接的方式实现用户的登录, 用户在控制台上输入用户名和密码。
5.3.2步骤:
- 得到用户从控制台上输入的用户名和密码来查询数据库
- 写一个登录的方法
a. 通过工具类得到连接
b. 创建语句对象,使用拼接字符串的方式生成 SQL 语句
c. 查询数据库,如果有记录则表示登录成功,否则登录失败
d. 释放资源
5.3.3代码
package com.sqltest; import com.itheima.utils.JdbcUtils; import javax.xml.transform.Result; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; public class Demo7Login { //从控制台上输入的用户名和密码 public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String name = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); login(name, password); } /** * 登录的方法*/ public static void login(String name, String password) { //a) 通过工具类得到连接 Connection connection = null; Statement statement = null; ResultSet rs = null; try { connection = JdbcUtils.getConnection(); //b) 创建语句对象,使用拼接字符串的方式生成 SQL 语句 statement = connection.createStatement(); //c) 查询数据库,如果有记录则表示登录成功,否则登录失败 String sql = "select * from user where name='" + name + "' and password='" + password + "'"; System.out.println(sql); rs = statement.executeQuery(sql); if (rs.next()) { System.out.println("登录成功,欢迎您:" + name); } else { System.out.println("登录失败"); } } catch (SQLException e) { e.printStackTrace(); } finally { //d) 释放资源 JdbcUtils.close(connection, statement, rs); } } }