JDBC详解学习文档(下)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: JDBC详解学习文档

4. Statement 接口


4.1JDBC 访问数据库的步骤



  1. 注册和加载驱动(可以省略)


  1. 获取连接


  1. Connection 获取 Statement 对象


  1. 使用 Statement 对象执行 SQL 语句


  1. 返回结果集


  1. 释放资源


4.2 Statement 作用:


代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。


4.3Statement 中的方法:


image.png


4.4释放资源


  1. 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接


  1. 释放原则:先开的后关,后开的先关。ResultSet  Statement  Connection


  1. 放在哪个代码块中: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 条记录,主键是自动增长



步骤:


  1. 创建连接对象


  1. 创建 Statement 语句对象


  1. 执行 SQL 语句:executeUpdate(sql)


  1. 返回影响的行数


  1. 释放资源


代码:


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 接口:


作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。



接口中的方法:


image.png


4.7.2常用数据类型转换表


image.png


注意:java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:java.util.Date


4.7.3需求:确保数据库中有 3 条以上的记录,查询所有的学员信息


步骤:


  1. 得到连接对象


  1. 得到语句对象


  1. 执行 SQL 语句得到结果集 ResultSet 对象


  1. 循环遍历取出每一条记录


  1. 输出的控制台上


  1. 释放资源结果:


代码:



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 接口中的注意事项:


  1. 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set


  1. 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set


  1. 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection


5. 数据库工具类 JdbcUtils


什么时候自己创建工具类?


如果一个功能经常要用到,我们建议把这个功能做成一个工具类,可以在不同的地方重用。


5.1需求:


上面写的代码中出现了很多重复的代码,可以把这些公共代码抽取出来。


5.2创建类 JdbcUtil 包含 3 个方法:


  1. 可以把几个字符串定义成常量:用户名,密码,URL,驱动类


  1. 得到数据库的连接:getConnection()


  1. 关闭所有打开的资源:


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需求:


  1. 有一张用户表


  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步骤:


  1. 得到用户从控制台上输入的用户名和密码来查询数据库


  1. 写一个登录的方法


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); 
        }
    }
}



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL druid Java
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
30 0
|
3月前
|
SQL Java 关系型数据库
Java学习—JDBC
Java学习—JDBC
|
3月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(下)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
348 1
|
3月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(中)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
28 0
|
3月前
|
SQL Java 关系型数据库
JDBC技术【SQL注入、JDBC批量添加数据、JDBC事务处理、其他查询方式】(三)-全面详解(学习总结---从入门到深化)
JDBC技术【SQL注入、JDBC批量添加数据、JDBC事务处理、其他查询方式】(三)-全面详解(学习总结---从入门到深化)
33 0
|
3月前
|
SQL 存储 Java
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
34 0
|
3月前
|
SQL Java 关系型数据库
JDBC技术【JDBC概述、获取数据库连接、 下载数据库驱动】(一)-全面详解(学习总结---从入门到深化)
JDBC技术【JDBC概述、获取数据库连接、 下载数据库驱动】(一)-全面详解(学习总结---从入门到深化)
44 0
JDBC技术【JDBC概述、获取数据库连接、 下载数据库驱动】(一)-全面详解(学习总结---从入门到深化)
|
6月前
|
Java 关系型数据库 MySQL
JSP 教学文档管理系统myeclipse开发mysql数据库bs框架java编程jdbc
JSP 教学文档管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语,数据库文件名是jspsjxwd.sql,系统名称jxwd,言开发系统主要采用B/S模式开发。
39 0
|
SQL Oracle Java
Java学习之路004——JDBC基础操作
使用JDBC对Mysql数据库进行基础查询操作的演示,包括JDBC连接器下载、引用、使用等。
105 0
|
Java 数据库连接
JDBC学习(十二):使用BeanHandler实现查询
JDBC学习(十二):使用BeanHandler实现查询
166 0