Java进阶十—JDBC

news2025/1/11 18:46:28

Java进阶十—JDBC

一.说明 

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

MySQL入门教程-CSDN博客

二.JDBC的由来以及定义 

 JDBC是什么?

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

打个比方?

  • 假设Java公司是布料厂,那么各SQL数据库公司就是服装设计厂
  • Java公司规定JDBC接口,允许去操作各数据库,相当于提供原材料
  • 各SQL公司去实现接口,相当于拿原材料设计出自己的服装

 

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

1.首先下载架包:Maven Repository: mysql » mysql-connector-java (mvnrepository.com) 

下载完成后,将架包拖入idea中的lib文件夹下(没有的话,自己创建),然后点击

点击OK

 2.连接

package com.jdbc;

import java.sql.*;

public class JDBCDemo {

    public static final String URL = "jdbc:mysql://localhost:3306/student";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

   // 需要抛出异常:ClassNotFoundException, SQLException
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        // 1.加载驱动程序 ——> 打电话给布料公司,你给我送来,我是mysql公司
        Class.forName("com.mysql.jdbc.Driver");

        // 2.获取数据库连接 ——> 告诉送货员,送货路线
        Connection connection = DriverManager.getConnection(URL,USER,PASSWORD);

        // 3.获取数据库操作对象 ——> 货到了,卸货到仓库
        Statement statement = connection.createStatement();

        // 4.从仓库选择要用的货
        // 我要查询student表
        ResultSet resultSet  = statement.executeQuery("SELECT * FROM student");
        // 判断是否有数据
        while (resultSet.next()) {
            int id = resultSet.getInt(1);
            String name = resultSet.getString(2);
            int age = resultSet.getInt(3);
            double score = resultSet.getDouble(4);
            int classId = resultSet.getInt(5);

            System.out.println("["+id+","+name+","+age+","+score+","+classId+"]");
        }

        // 5.关闭仓库与数据库
        statement.close();
        connection.close();
        
    }
}

四.整理和释放 

 整理上面的代码

package com.jdbc;

import java.sql.*;

public class JDBCDemo {

    // 配置
    public static final String URL = "jdbc:mysql://localhost:3306/student";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";
    public static final String DRIVER = "com.mysql.jdbc.Driver";

    public static Connection connection;
    public static Statement statement;
    public static ResultSet resultSet;

   // 需要抛出异常:ClassNotFoundException, SQLException
    public static void main(String[] args)  {

        try {
            // 1.加载驱动程序 ——> 打电话给布料公司,你给我送来,我是mysql公司
            Class.forName(DRIVER);

            // 2.获取数据库连接 ——> 告诉送货员,送货路线
            connection = DriverManager.getConnection(URL,USER,PASSWORD);

            // 3.获取数据库操作对象 ——> 货到了,卸货到仓库
            statement = connection.createStatement();

            // 4.从仓库选择要用的货
            // 我要查询student表
             resultSet  = statement.executeQuery("SELECT * FROM student");
             
            // 判断是否有数据
            while (resultSet.next()) {
                int id = resultSet.getInt(1);
                String name = resultSet.getString(2);
                int age = resultSet.getInt(3);
                double score = resultSet.getDouble(4);
                int classId = resultSet.getInt(5);

                System.out.println("["+id+","+name+","+age+","+score+","+classId+"]");
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 5.关闭仓库与数据库
                statement.close();
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
        
    }
}

五.封装JDBCUtils

 每个人的配置都不一样,那我们就读取位置文件。

1.创建db.properties配置文件,写入配置

2.创建JDBCUtils类,读取配置

package com.google.util;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {

    public static String url;
    public static String user;
    public static String password;
    public static String driver;

    // 使用静态代码块,做预处理
    static {
        // 使用try/catch包裹
        try {
            // 读取配置文件
            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");

            System.out.println(url+"\n"+user+"\n"+password+"\n"+driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 测试是否能加载成功
    public static void init() {
        System.out.println("加载成功");
    }

    // 创建单例,获取配置项
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url,user,password);
    }

    // 释放,关闭结果,关闭仓库,关闭数据库连接
    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();
        }
    }


}

3.测试是否能读取 

package com.google.util;

public class Test {
    public static void main(String[] args) {
        JDBCUtils.init();
    }
}

注意:ClassLoader的getResourceAsStream方法使用及在java和web项目中的路径问题_classloader.getresourceasstream-CSDN博客 

六.增删改 executeUpdate() 

 使用创建JDBCUtils类,更新数据

package com.google.util;

import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class UpdateTest {

    public Connection connection;
    public Statement statement;

    @Test
    public void updateTest() {
        try {
            // 1.获取数据库连接和操作对象
            connection = JDBCUtils.getConnection();
            statement = connection.createStatement();
            // 2.更新一条数据
            String sql = "update student set score=33 where id=4";
            int res = statement.executeUpdate(sql);

            if (res > 0) {
                System.out.println("更新成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                JDBCUtils.close(connection,statement);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

删除数据

 public void deleteTest() {
        try {
            // 1.获取数据库连接和操作对象
            connection = JDBCUtils.getConnection();
            statement = connection.createStatement();
            // 2.删除一条数据
            String sql = "delete from student where id=6";
            int res = statement.executeUpdate(sql);

            if (res > 0) {
                System.out.println("删除成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                JDBCUtils.close(connection,statement);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

 插入数据

 public void insertTest() {
        try {
            // 1.获取数据库连接和操作对象
            connection = JDBCUtils.getConnection();
            statement = connection.createStatement();
            // 2.插入一条数据
            String sql = "insert into student values(6,'LiLi',15,44.3,2)";
            int res = statement.executeUpdate(sql);

            if (res > 0) {
                System.out.println("插入成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                JDBCUtils.close(connection,statement);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

七.字符编码问题 

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

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

八. PreparedStatement和问号占位符 

如果想从键盘中输入数据, 而不是像下面这样

String sql = "insert into student values(7,'mimi',33,52.3,1)";

那就把Statement换成PreparedStatement 

1.第一步:修改封装JDBCUtils:把Statement换成PreparedStatement 

package com.google.util;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {

    public static String url;
    public static String user;
    public static String password;
    public static String driver;

    // 使用静态代码块,做预处理
    static {
        // 使用try/catch包裹
        try {
            // 读取配置文件
            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();
        }
    }

    // 测试是否能加载成功
    public static void init() {
        System.out.println("加载成功");
    }

    // 创建单例,获取配置项
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url,user,password);
    }

    // 释放,关闭结果,关闭仓库,关闭数据库连接
    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();
        }
    }


}

第二步: 使用下面代码方式

package com.google.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class Test {

    // 注意此处是静态的
    public static Connection connection;
    public static PreparedStatement preparedStatement;
    // 接收器
    public static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {


        try {
            // 1.获取数据库
            connection = JDBCUtils.getConnection();

            // 2.插入一条数据
            String sql = "insert into student values(?,?)";
            System.out.println("请输入id,年龄,用回车隔开");
            // 接收数据
            int id = scanner.nextInt();
            int age = scanner.nextByte();


            // 3.preparedStatement传入带占位符的sql语句,set方法设置每一个位置的值,并执行更新操作
            preparedStatement = connection.prepareStatement(sql);
            // 将接收器的数据放入sql语句的?中
            preparedStatement.setInt(1,id);
            preparedStatement.setInt(2,age);


            int res = preparedStatement.executeUpdate();

            if (res > 0) {
                System.out.println("插入成功");
            }


        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                JDBCUtils.close(connection,preparedStatement);
            } catch (SQLException e) {
                scanner.close();
                throw new RuntimeException(e);
            }
        }

    }

}

同理删除与更改一样

读取只需要更改一小部分

            // 2.插入一条数据
            String sql = "select * from student where id=?";
            System.out.println("请输入id");
            // 接收数据
            int id = scanner.nextInt();


            // 3.preparedStatement传入带占位符的sql语句,set方法设置每一个位置的值,并执行更新操作
            preparedStatement = connection.prepareStatement(sql);
            // 将接收器的数据放入sql语句的?中
            preparedStatement.setInt(1,id);


            ResultSet res = preparedStatement.executeQuery();

          while (res.next()) {
              System.out.println(res.getInt(1)+"|"+res.getInt(2));
          }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1374943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最细RocketMQ源码一:NameSrv

一、入口 NameServer的启动源码在NameStartup,现在开始debug之旅 二、createNamesrcController public static NamesrvController createNamesrvController(String[] args) throws IOException, JoranException {System.setProperty(RemotingCommand.REMOTING_VER…

倍福(Bechhoff) CX8090嵌入式PC控制器开发没有想像中的那么难

笔者曾2023年初曾为云南阜外医院新风系统开发自动控制系统。医院所有新风设备和公区照明全部采用倍福嵌入式PC控制器实现智能控制。其中新风和供水计量通过CX8090实现控制;公区照明通过BC9050实现控制;并采用美国邦纳人机界面(THM035B)实现远…

MES系统数据采集的几种方式

生产制造执行MES系统具有能够帮助企业实现生产数据收集与分析、生产计划管理、生产过程监控等的功能板块,在这里小编就不一一介绍了,主要讲讲它的数据采集功能板块,可以说,数据采集是该系统进行数据统计与生产管理等后续工作的基础…

Logstash应用-同步ES(elasticsearch)到HDFS

1.场景分析 现有需求需要将elasticsearch的备份至hdfs存储,根据以上需求,使用logstash按照天级别进行数据的同步 2.重难点 数据采集存在时间漂移问题,数据保存时使用的是采集时间而不是数据生成时间采用webhdfs无法对文件大小进行设置解决…

uniapp 设置底部导航栏

uniapp 设置原生 tabBar 底部导航栏。 设置底部导航栏 一、创建页面,一定要在 pages.json 文件中注册。 二、在 pages.json 文件中,设置 tabBar 配置项。 pages.json 页面 {"pages": [...],"globalStyle": {...},"uniIdRout…

软件测试|探索Python中获取最高数值的几种方法

前言 在数据分析、统计和编程领域,经常会遇到需要从一组数值中找出最高数值的情况。Python 作为一门功能丰富的编程语言,提供了多种方法来实现这一目标。在本文中,我们将探索几种获取最高数值的方法,帮助大家在不同情况下选择最适…

Python 潮流周刊#34:Python 3.13 的 JIT 方案又新又好

△△请给“Python猫”加星标 ,以免错过文章推送 你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。本周刊开源,欢迎投稿[1]。另有电报频道[2]作为副刊,补充发布更加丰富的资讯,…

滚柱导轨精度等级是如何划分?

滚柱导轨的精度等级主要根据其表面精度、滑块与导轨表面的公差以及定位精度等性能指标来划分。根据不同的标准和应用需求,精度等级的划分存在一定的差异。 1、行走平行度:普通级(无标注/C)5μm,高级(H&…

如何在数学建模竞赛中稳定拿奖

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

NIO通信代码示例

NIO通信架构图 1.Client NioClient package nio;import constant.Constant;import java.io.IOException; import java.util.Scanner;public class NioClient {private static NioClientHandle nioClientHandle;public static void start() {nioClientHandle new NioClientHa…

【Spring Cloud】Sentinel流量限流和熔断降级的讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 &am…

网工内推 | 高级网工,H3C认证优先,朝九晚六,周末双休

01 万德 招聘岗位:高级网络工程师 职责描述: 1、项目交付:项目管理和交付,包括项目前期的规划、实施以及后期的运维支持、项目验收等。 2、技术支持:为客户及合作伙伴提供网上问题远程和现场支持;对公司内…

【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )

文章目录 一、二元谓词1、二元谓词简介2、 std::sort 算法简介3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则 一、二元谓词 1、二元谓词简介 " 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , …

全链路压力测试有哪些主要作用

全链路压力测试是在软件开发和维护过程中不可或缺的一环,尤其在复杂系统和高并发场景下显得尤为重要。下面将详细介绍全链路压力测试的主要作用。 一、全链路压力测试概述 全链路压力测试是指对软件系统的全部组件(包括前端、后端、数据库、网络、中间件等)在高负载…

vue/vue3/js来动态修改我们的界面浏览器上面的文字和图标

前言&#xff1a; 整理vue/vue3项目中修改界面浏览器上面的文字和图标的方法。 效果&#xff1a; vue2/vue3: 默认修改 public/index.html index.html <!DOCTYPE html> <html lang"en"><head><link rel"icon" type"image/sv…

HarmonyOS自定义组件生命周期函数介绍

aboutToAppear 在创建自定义组件的新实例后&#xff0c;在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量&#xff0c;更改将在后续执行build()函数中生效。 aboutToDisappear 在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变…

Redis:原理速成+项目实战——Redis实战10(Redis消息队列实现异步秒杀)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战9&#xff08;秒杀优化&#xff09; &#x1f4da;订阅专栏&#xff1a;Redis&…

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…

实战环境搭建-linux下安装tomcat

安装tomcat Index of /dist/tomcat/tomcat-9/v9.0.8/bin 下载apache-tomcat-9.0.8.tar.gz&#xff0c;可以使用wget; 2、将压缩包tar -zxvf apache-tomcat-9.0.8.tar.gz解压到/home/tomcat 3、修改环境变量 vi /etc/profile export JAVA_HOME/home/java/jdk1.8.0_221 expo…

IntelliJ IDEA Java 连接 mysql 配置(附完整 demo)

下载 MySQL 驱动 从MySQL官网下载JDBC驱动的步骤如下&#xff1a; 1&#xff09;访问MySQL的官方网站&#xff1a;MySQL 2&#xff09;点击页面上方的"DOWNLOADS"菜单&#xff1b; 3&#xff09;在下载页面&#xff0c;找到"MySQL Community (GPL) Downloads…