9:JDBC-Java API 实战

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 9:JDBC-Java API 实战

1. 说明


用Java语言操作Mysql,首先需要学习Mysql


安装教程详见:一、安装、连接以及配置MySQL


Mysql基础教程详见:「MySQL」从零到删库


2. JDBC的由来以及定义


JDBC是什么?


  • Java数据库连接(Java Database Connectivity)简称JDBC


  • JDBC是Java操作各数据库的一种规范,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC是面向关系型数据库的


打个比方?


  • 假设Java公司是布料厂,那么各SQL数据库公司就是服装设计厂


  • Java公司规定JDBC接口,允许去操作各数据库,相当于提供原材料


  • 各SQL公司去实现接口,相当于拿原材料设计出自己的服装



3. JDBC体验,statement.executeQuery() 查询


首先要导入MySQL jar包,其相当于物流公司,将布料厂的原材料运输到服装设计厂里,让服装厂设计


Java MySQL Connector/J 包下载详见:MySQL Connector/J



下载好的jar包拖入lib文件夹下



引入jar包并导入库中



连接数据库并创建一个Info



创建JDBCDemo类写入代码,导入包所用到的方法都是在 java.sql里的,import java.sql.*



4. 整理和释放


规范代码


public class JDBCDemo01 {
    public static final String URL = "jdbc:mysql://127.0.0.1:3306/student";
    public static final String USER = "root";
    public static final String PASSWORD = "xxxxxx";
    public static final String DRIVER = "com.mysql.jdbc.Driver";
    public static Connection connection;
    public static Statement statement;
    public static ResultSet resultSet;
    public static void main(String[] args) {
        try {
        //1.加载驱动程序,给布料厂打电话,我是mysql公司的
        Class.forName(DRIVER);
        //2.获得数据库的连接,告诉物流具体走什么路线
        connection = DriverManager.getConnection(URL, USER, PASSWORD);
        //3.获取数据库操作对象,货送到了,然后卸货到仓库
        statement = connection.createStatement();
        //4.从仓库中筛选出要用的货,查询Sql语句
        resultSet = statement.executeQuery("SELECT * FROM info");            
        while (resultSet.next()){
            int id = resultSet.getInt(1);
            String name = resultSet.getString(2);
            int age = resultSet.getInt(3);
            System.out.println("[" + id + ","+ name+ "," + age + "]");
        }
        //5.完成所有操作,关闭结果,关闭仓库,再关闭数据库连接
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


5. 封装JDBCUtils


如果每次查询都要重新写配置文件是件很麻烦的事,可以将配置文件封装起来,在src下创建db.properties配置文件,写入配置项



创建com.google.util包,创建JDBCUtils


public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    //静态代码,做预处理
    static {
        try {
            //JDBCUtils.class.getClassLoader()
            //读取配置文件
            InputStream inputStream = ClassLoader.getSystemResourceAsStream("db.properties");
            //加载对象
            Properties properties = new Properties();
            properties.load(inputStream);
            //读取配置项
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            driver = properties.getProperty("driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //4.测试是否加载成功
    public static void init(){
        System.out.println("加载成功");
    }
    //5.创建单例,获取配置项
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, user, password);
    }
    //6.释放,关闭结果,关闭仓库,关闭数据库连接
    public static void close(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {
        if (resultSet != null){
            resultSet.close();
        }
        if (statement != null){
            statement.close();
        }
        if (connection != null){
            connection.close();
        }
    }
    public static void close(Connection connection, Statement statement) throws SQLException {
        if (statement != null){
            statement.close();
        }
        if (connection != null){
            connection.close();
        }
    }
}


创建测试类,测试能否加载JDBCUtils



6. 增删改 —— executeUpdate()


确认获取数据库连接和操作对象信息



只有查询是executeQuery(),增删改都是executeUpdate()



运行代码查看数据库已经插入成功



更新或者删除,也是同理



运行代码查看数据库已经更新成功



    public void UpdateTest(){
        try {
            //1.获取数据库连接和操作对象
            connection = JDBCUtils.getConnection();
            statement = connection.createStatement();
            //2.更新一条数据
            String sql = "update info set name ='Pig' where id = 4";
            int res = statement.executeUpdate(sql);
            //3.判断数据是否更新成功
            if (res != 0){
                System.out.println("Update success");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
             //4.调用重载方法,关闭仓库和数据库连接
                JDBCUtils.close(connection, statement);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


7. 字符编码问题


如果插入中文时乱码怎么办?


  • 字符编码问题,需要更改数据库、IDE、终端的编码格式为UTF-8,在配置项中添加字符编码





url = jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8
user = root
password = xxxxxx
driver = com.mysql.jdbc.Driver


参考:2.6 修改数据库字符编码


8. PreparedStatement和问号占位符


如果要求用户输入数据,需要用户手动编写sql语句吗?


  • 不需要,用PreparedStatement就可以


PreparedStatement是什么?


  • PreparedStatement是预编译的,可以简化执行查询或者更新数据表数据,对于批量处理可以大大提高效率,也叫JDBC存储过程


  • public interface PreparedStatement extends Statement;


Statement和PreparedStatement的区别?


  • 使用Statement需要进行拼写SQl语句


        resultSet = statement.executeQuery("SELECT * FROM info");
        while (resultSet.next()){
            int id = resultSet.getInt(1);
            String name = resultSet.getString(2);
            int age = resultSet.getInt(3);
            System.out.println("[" + id + ","+ name+ "," + age + "]");
        }


  • 使用PreparedStatementStatement的子接口,可以传入带占位符的SQL语句,提供了补充占位符变量的方法,preparedStatement()要求写入sql语句


preparedStatement = connection.prepareStatement(sql);


package com.company;
import com.google.util.JDBCUtils;
import org.junit.Test;
import java.util.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/**
 * @author:Yeats
 * @description:
 * @date: 4/4/2022
 * @time: 4:35 PM
 */
public class JDBCDemo03 {
    public static Connection connection;
    public static PreparedStatement preparedStatement;
    public static void main(String[] args) {
        try {
            //1.获取数据库连接和操作对象
            connection = JDBCUtils.getConnection();
            //2.用户输入信息,使用占位符的sql语句,更新一条数据
            String sql = "INSERT INTO info(name, age) values(?, ?)";
            System.out.println("请先输入姓名,再输出年龄,用回车隔开:");
            Scanner scanner = new Scanner(System.in);
            String name = scanner.nextLine();
            int age = scanner.nextInt();
            //3.preparedStatement传入带占位符的sql语句,set方法设置每一个位置的值,并执行更新操作
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, name);
            preparedStatement.setInt(2, age);
            int res = preparedStatement.executeUpdate();
            //4.判断数据是否更新成功
            if (res != 0){
                System.out.println("Update success");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
            //5.调用重载方法,释放资源
                JDBCUtils.close(connection, preparedStatement);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}


注意,parameterindex是指传入问号的下标



同时需要更改配置文件JDBCUtils类中的StatementPreparedStatement


package com.google.util;
import javax.swing.*;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
 * @author:Yeats
 * @description:
 * @date: 4/4/2022
 * @time: 9:30 AM
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    //静态代码,做预处理
    static {
        try {
            //JDBCUtils.class.getClassLoader()
            //读取配置文件
            InputStream inputStream = ClassLoader.getSystemResourceAsStream("db.properties");
            //加载对象
            Properties properties = new Properties();
            properties.load(inputStream);
            //读取配置项
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            driver = properties.getProperty("driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //4.测试是否加载成功
    public static void init(){
        System.out.println("加载成功");
    }
    //5.创建单例,获取配置项
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, user, password);
    }
    //6.释放资源,关闭结果,关闭仓库,关闭数据库连接
    public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) throws SQLException {
        if (resultSet != null){
            resultSet.close();
        }
        if (preparedStatement != null){
            preparedStatement.close();
        }
        if (connection != null){
            connection.close();
        }
    }
    public static void close(Connection connection, PreparedStatement preparedStatement) throws SQLException {
        if (preparedStatement != null){
            preparedStatement.close();
        }
        if (connection != null){
            connection.close();
        }
    }
}


运行成功




如果要执行查询操作,需要将excuteUpdate()改成excuteQuery(),大体上与Statement形式相同


9. 最终Demo说明


最好一次性学完,做好准备,头脑清晰再去学


10. 对象的封装,重构代码, 学生管理系统模块化编程


项目源代码下载详见:面向对象大胆向前!Java API实战-视频和资料-Frank


IDEA导入有jar包的Java项目(版本2019.3.2),点击import



找到项目的位置,点OK



选择从已存在的源文件创建项目



确认项目名称与路径



已找到项目的源文件,请选择被添加到项目的根中,确认项目根目录



检查导入的jar包,并勾选jar包



审查建议的项目模块结构。在此阶段,您可以设置模块名称,从项目中排除特定模块,合并或拆分单个模块。所有模块之间的依赖关系都将自动更新,就像库中的依赖项一样



查看项目结构,手动导入所有jar包




直接运行项目会抛出SQL异常,需要更改db.properties代码,将localhost改成127.0.0.1:3306


url = jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8
user = root
password = xxxxxx
driver = com.mysql.jdbc.Driver
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
1月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
61 2
|
7天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
17天前
|
JSON BI API
商城上货API接口的实战案例
在商城上货过程中,API接口扮演着至关重要的角色。以下是对商城上货API接口的实战分析,涵盖其主要功能、类型、安全性以及实战案例等方面。
|
14天前
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
18天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
47 4
|
1月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
18天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
33 1
|
24天前
|
存储 JSON API
淘宝API接口实战:高效获取商品标题、分类及店铺名称
在淘宝API接口实战中,通过以下步骤高效获取商品标题、分类及店铺名称:1. 准备工作:了解淘宝开放平台文档,注册开发者账号,选择开发语言和工具。2. 获取API访问权限:申请相应权限,提供应用场景说明。3. 调用API接口:构建HTTP请求,提供必要参数。4. 解析响应数据:提取JSON数据中的所需信息。5. 数据处理和存储:进一步处理并存储数据。6. 注意事项:遵守使用规范,注意调用频率和数据安全。示例代码使用Python调用淘宝API。
|
26天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
下一篇
无影云桌面