Java进阶十—JDBC

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, SQLExceptionpublic 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, SQLExceptionpublic 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;@Testpublic 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.mzph.cn/news/617291.shtml

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

相关文章

ChatGPT:人工智能与人类交流的桥梁

在人工智能的浪潮中,ChatGPT以其独特的交流能力成为了一个亮点。作为一个基于强大的GPT-4模型的聊天机器人,ChatGPT不仅仅是技术的展示,它更是人工智能与人类交流的桥梁。 人工智能的语言理解革命 ChatGPT的出现标志着人工智能在语言理解和…

攻防实战-手把手带你打穿内网

六朝何事,只成门户私计! 目录 环境配置 网络配置 本次实战绘制出来的网络拓扑图如下: 第一层:12server-web1 信息搜集 网站url: 目录扫描 扫到后台地址: 发现有注册功能, 先注册一下尝试能…

预约上门按摩系统目前面临的挑战有哪些

按摩预约上门服务系统上线之后在运营的过程中主要面临的挑战主要有以下几个方面: 1.技师管理和培训:为了保证服务的质量,需要对技师进行管理和培训。这包括确保技师具备必要的技能和资格,以及提供必要的培训,以确保他们…

[金融支付]EMV是什么?

文章目录 EMVCoEMVCo是谁?EMVCo是做什么的?EMVCo是如何运作的?EMVCo 是否强制要求 EMV 规范? EMVEMV的历史背景EMV技术的一些关键点 EMV TechnologiesEMV 认证EMV的三层认证 EMV规范在全球各地存在差异参考 EMVCo EMVCo是谁&…

系列二、Spring Security中的核心类

一、Spring Security中的核心类 1.1、自动配置类 UserDetailsServiceAutoConfiguration 1.2、密码加密器 1.2.1、概述 Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数&a…

《BackTrader量化交易图解》第10章:Trade 交易操作

文章目录 10 Trade 交易操作10.1 量化回测分析流程10.2 Cerebro 类模块10.3 案例:Trade 交易10.4 实盘交易机器隐性规则10.5 Stake 交易数额和 Trade 交易执行价格 10 Trade 交易操作 10.1 量化回测分析流程 从本章开始讲解 BackTrader 的实盘操作。前面的章节讲过…

如何监控电脑屏幕-对电脑屏幕进行监控有什么方法?如何实现电脑屏幕监控?

随着电脑的普及,越来越多的人开始需要监控电脑屏幕,无论是出于工作需要还是家庭安全考虑。 然而,如何实现电脑屏幕监控却是一个需要探讨的问题。 一、监控电脑屏幕的方法 使用电脑监控软件,这是一种很常用的监控方式&#xff0c…

vivado编译设置、执行设置、bit流生成设置

合成设置 使用“合成设置”可以指定约束集、合成策略、合成选项,以及要生成的报告。选项由选定的定义综合策略或综合报告策略,但您可以用自己的策略覆盖这些策略设置。您可以选择一个选项来查看对话框底部的描述。了解更多有关“合成设置”的信息&#…

BSP视频教程第29期:J1939协议栈CAN总线专题,源码框架,执行流程和应用实战解析,面向车通讯,充电桩,模组通信等(2024-01-08)

视频教程汇总帖:【学以致用,授人以渔】2024视频教程汇总,DSP第12期,ThreadX第9期,BSP驱动第29期,USB实战第5期,GUI实战第3期(2024-01-08) - STM32F429 - 硬汉嵌入式论坛 …

VBA_MF系列技术资料1-310

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于…

用通俗易懂的方式讲解:一文讲透最热的大模型开发框架 LangChain

在人工智能领域的不断发展中,语言模型扮演着重要的角色。特别是大型语言模型(LLM),如 ChatGPT,已经成为科技领域的热门话题,并受到广泛认可。 在这个背景下,LangChain 作为一个以 LLM 模型为核…

printk的使用与理解

文章目录 一、理清printk二、printk的使用三、printk的打印级别1、基本解释2、详细解释3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值 四、printk的输出地方五、其它 一、理清printk printk如何使用&#…

RabbitMQ安装和快速入门

文章目录 1. RabbitMQ2. 安装RabbitMQ2.1 创建shell文件2.2 编写shell文件2.3 检查rabbitmq状态2.4 设置开机自启动2.5 启动插件2.6 开放端口号2.7 创建用户2.8 登入管理页面 3. SpringBoot中集成RabbitMQ3.1 依赖安装3.2 SpringBoot配置3.3 RabbitMQ的配置类3.4 定义消费者和生…

jmeter--2.常用组件以及作用域

目录 1.常用的组件以及执行顺序 2.常用的组件作用 2.1 测试计划:jmeter启动,其它组件的容器 2.2 线程组(测试片段):代表一定虚拟用户数,测试片段代表模块 2.3 配置元件:配置信息 2.4 前置处…

设计一个简易版的数据库路由

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

DETR tensorRT 的 C++ 部署

DETR tensorRT 的 C 部署 本篇说说DETR tensorRT 的 C 部署。 【完整代码、模型、测试图片】 1 导出 onnx 模型(建议先看) 方法1:导出DETR onnx并修改模型输出Gather层,解决tesorrt 推理输出结果全为0问题,参考【D…

数据类型、数据类型转换(Java)

一、数据类型的分类 1. byte:1字节,-128~127 2. short:2字节,-32768~32767 3. int:4字节 默认整型 4. long:8字节 注意:随便写一个整型字面量会默认是整型的,所以我们在写一个…

加速 Android Studio 依赖项下载

在某些网络环境中,访问互联网可能受到限制,在Android Studio中,项目构建时可能需要下载依赖项,如果网络受到限制,就无法下载或下载速度非常慢只有十几 kb/s ,设置可以帮助解决下载问题。 进入设置页面找到…

RK3568驱动指南|第十一篇 pinctrl 子系统-第126章 通过pinctrl状态设置引脚复用实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

电影《艾里甫与赛乃姆》简介

电影《艾里甫与赛乃姆》由天山电影制片厂于1981年摄制,该片由傅杰执导,由买买提祖农司马依、布维古丽、阿布里米提沙迪克、努力曼阿不力孜、买买提依不拉音江、阿不都热合曼艾力等主演。 该片改编自维吾尔族民间爱情叙事长诗《艾里甫与赛乃姆》&#xf…