9:JDBC-Java API 实战

2023-05-16

目录

  • 1. 说明
  • 2. JDBC的由来以及定义
  • 3. JDBC体验,statement.executeQuery() 查询
  • 4. 整理和释放
  • 5. 封装JDBCUtils
  • 6. 增删改 —— executeUpdate()
  • 7. 字符编码问题
  • 8. PreparedStatement和问号占位符
  • 9. 最终Demo说明
  • 10. 对象的封装,重构代码, 学生管理系统模块化编程

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

9:JDBC-Java API 实战 的相关文章

  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • Cassandra java驱动程序协议版本和连接限制不匹配

    我使用的java驱动程序版本 2 1 4卡桑德拉版本 dsc cassandra 2 1 10cql 的输出给出以下内容 cqlsh 5 0 1 Cassandra 2 1 10 CQL spec 3 2 1 Native protocol
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个

随机推荐

  • Python 使用 Qt5 实现水平导航栏

    在 Qt5 中可以使用 QWidget 包含两个水平布局 xff0c 通过点击水平布局里的按钮 xff0c 实现下标滑动与页面的切换 可以按照以下步骤来实现上面图片中的功能 xff1a 导入必要的 Qt 包 xff1a span class
  • OOP上半部分-Java与生活

    目录 1 1 1 问题产生和引导1 1 2 烦人1 1 3 变换思维1 1 4 规划明确目标站在更高层次思考问题1 1 5 上代码 xff0c 设计体验面向对象编程 xff0c 实例和对象1 1 6 去你md成员变量行为类和this1 1
  • Centos7 搭建Jupyter NoteBook教程

    目录 1 Anaconda31 1 下载1 2 安装 2 环境配置2 1 添加PATH到 root bashrc文件中2 2 激活配置的环境变量 3 搭建虚拟环境3 1 创建虚拟环境3 2 开启环境3 3 查看已有的虚拟环境 4 jupyt
  • OOP下半部分-Java与生活

    目录 面向对象三大特性 xff1a 封装 继承 多态2 1 1 需求重定义2 1 2 继承2 2 2 饿狼传说之多层继承2 2 3 方法的重写2 2 4 super啃老2 2 5 啃老啃到彻底2 2 6 final2 2 7 提出新的问题2
  • Centos7 搭建单机Spark分布式集群

    目录 1 JDK Hadoop Spark安装与配置1 1 解压包1 2 配置环境变量 2 Scala安装与配置2 1 Scala安装2 2 配置环境变量 3 配置集群3 1 配置sprak3 2 启动spark 4 问题 xff1a 虚拟
  • 面向对象大胆向前 Java API 实战

    目录 0 xff1a Base API 引言API的定义和用处ScannerNumberMathRandomThreadLocalRandomDateDateFormat和SimpleDateFormatCalendarSystem 详见
  • Yeats_Liao的书单

    计算机软件类 大话计算机 冬瓜哥 架构师的自我修炼 李智慧 图解算法 xff1a 使用C语言 吴灿铭 胡昭民 编程原则 马克思 卡纳特 亚历山大 啊哈 xff01 算法 啊哈磊 Java Web框架开发技术 Spring 43 Spring
  • 0:Base API-Java API 实战

    目录 0 1 引言0 2 API的定义和用处0 3 Scanner xff08 普通类 xff09 0 4 Number xff08 包装类 xff09 0 5 Math xff08 工具类 xff09 0 6 Random xff08 父
  • 黑客与画家 [美] Paul Graham 读书摘录

    充分理解程序员带来的美和智慧 xff0c 这是本书做到的 P15 为什么书呆子不受欢迎 xff1f 平庸带来的严重后果 xff0c 直接导致学生的叛逆心理 我误解最深的一个词是 老成 tact 成年人使用这个词 xff0c 含义似乎就是 闭
  • 教育的真谛 [英] 尼古拉斯·泰特 读书摘录

    自柏拉图以来 xff0c 教育的目的与性质始终是西方哲学传统关注和探讨的问题 纵览2500年来的思想成果 xff0c 作者尼古拉斯 泰特博士在 教育的真谛 xff1a 伟大思想家的观点及其现实意义 中指出 xff0c 人类的教育活动至少应包
  • 1:Unit test and main function-Java API 实战

    目录 1 抛出企业问题 xff0c 脱离main测试 xff0c 模块化编程2 Junit单元测试的含义和用途3 怎么获取各种Jar包 xff1f Maven Repository 获取各类各个版本的jar xff0c 这就是仓库 脱离老师
  • CentOS 安装 Samba服务器(多用户组、多用户有不同的访问权限)

    增加smb用户 root 64 localhost sir01 smbpasswd a linuxsir 查看 smb 现有用户 pdbedit L 验证用户登录文件夹 smbclient 192 168 101 93 forlder U
  • 2:StringBuilder-Java API 实战

    目录 1 String存在的问题2 Stringbuilder以及链式调用的含义 1 String存在的问题 认识String 字符串广泛应用在编程中 xff0c 在 Java 中字符串属于对象 xff0c Java 提供了 String
  • 3:Throwable-Java API 实战

    目录 1 异常的介绍2 异常举例以及解决常见错误bug方案3 RuntimeException4 trycatch作用 xff0c 闲扯淡诱骗毕业设计5 NullPointerException空指针异常6 throws7 throws和t
  • 4:File-Java API 实战

    目录 1 引言2 绝对路径和相对路径 xff1f 先学送快递吧 xff01 3 绝对路径4 相对路径5 File类6 Linux上的绝对路径有所不同 1 引言 文件要区别绝对路径和相对路径 xff0c 在Win系统中的文件路径和Linux
  • 5:IO Stream-Java API 实战

    目录 1 相对论和IO流之说2 汉语文学理解IO流3 图解IO流4 俩亲爹 xff1a InputStream和OutPutStream5 FileInputStream字节流读取文件6 FileOutPutStream字节流写入文件7 b
  • 6:CharSet-Java API 实战

    目录 1 阶段2 字符集编码吹X3 转换字符编码 1 阶段 Java NIO File Java NIO中的Files类 xff08 java nio file Files xff09 提供了多种操作文件系统中文件的方法 Java File
  • 7:Multithreading-Java API 实战

    目录 1 问题的提出2 核心数 进程 线程3 进程和线程的区别以及对应应用4 多线程程序含义 多线程的作用5 多线程的执行过程6 Runnable7 简化操作以及线程名8 抢购鞋 多线程案例9 后台 守护进程的提出10 匿名内部类创建多线程
  • 8:Java Conllections FrameWork-Java API 实战

    目录 1 原生数组带来的问题 xff0c 抛出问题2 Conllections家族3 黑帮的帮规4 ArrayList第一讲5 ArrayList第二讲6 ArrayList第三讲7 Linked链表8 LinkedList一带而过9 提醒
  • 9:JDBC-Java API 实战

    目录 1 说明2 JDBC的由来以及定义3 JDBC体验 xff0c statement executeQuery 查询4 整理和释放5 封装JDBCUtils6 增删改 executeUpdate 7 字符编码问题8 PreparedSt