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: 目录扫描 扫到后台地址: 发现有注册功能, 先注册一下尝试能…

浅谈Vue中的NextTick。

一、NextTick() 等待下一次 DOM 更新刷新的工具方法。 当你在 Vue 中更改响应式状态时,最终的 DOM 更新并不是同步生效的,而是由 Vue 将它们缓存在一个队列中,直到下一个“tick”才一起执行。这样是为了确保每个组件无论发生多少状态改变&…

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

按摩预约上门服务系统上线之后在运营的过程中主要面临的挑战主要有以下几个方面: 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属于…

DNS劫持是怎么回事?DNS劫持如何预防?(国科云)

DNS劫持是一种常见的网络攻击手段,攻击者通过DNS缓存投毒、NS篡改等手段,将用户解析的目标地址重定向至受攻击者控制的恶意网站,从而窃取用户的敏感信息或进行其他违法操作。因此,了解DNS劫持的原理和危害,并采取有效的…

46. 全排列(回溯)

同样是回溯算法&#xff0c;相比于前两道题 77. 组合&#xff08;回溯&#xff09; 17. 电话号码的字母组合&#xff08;回溯&#xff09; 这道题中&#xff0c;对于回溯遍历的内容可以使用一个boolean数组来进行标记判断 class Solution {public List<List<Integer>…

c++隐式类型转换与explicit

我们知道&#xff0c;一个float与int做运算时&#xff0c;系统会首先个int类型转换为float类型之后再进行运算&#xff0c;这种隐式类型转换也会发生在类中 看以下例子&#xff0c;定义一个类 class myTime { public:int Hour;myTime() {};myTime(int h) :Hour(h) {}; }; 在…

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

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

printk的使用与理解

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

LeetCode906. Super Palindromes

文章目录 一、题目二、题解 一、题目 Let’s say a positive integer is a super-palindrome if it is a palindrome, and it is also the square of a palindrome. Given two positive integers left and right represented as strings, return the number of super-palindr…

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 定义消费者和生…

Redis-集群

主从哨兵集群分布部署 2、哨兵模式 除了redisl master、redis slave&#xff0c;我们有另外的一个节点&#xff0c;叫redis Sentinel啊。redis Sentinel会去同时连接master和slave啊。这个sentinel&#xff0c;它是同时和我们对应的master和slave&#xff0c;保持了一个心跳的…