当前位置: 首页 > news >正文

【MySQL】Java的JDBC编程

目录

♫什么是JDBC

♫JDBC常用接口和类

♪Connection接口

♪Statement对象

♪ResultSet对象

♫JDBC的使用

♪添加“驱动包”

♪创建数据源,描述数据库服务器在哪

♪和数据库服务器建立连接

♪构建SQL语句

♪执行SQL语句

♪释放资源


♫什么是JDBC

我们前面操作数据库都是使用数据库自带的客户端通过网络访问数据库服务器,而要想通过代码来访问数据库服务器就需要自己实现一个数据库客户端(各种数据库都提供了一系列API可以使我们较为方便地实现一个客户端),而由于不同数据库提供的API不同,在Java领域就有大佬出来将这些API统一成一套:JDBC,每个数据库也都提供了能够适应JDBC的“驱动包”(API的具体实现)。JDBC这套API已经成为Java标准库的一部分,它屏蔽了不同数据库原生API之间的差异,使用一套API规范了不同数据库的编程操作。

♫JDBC常用接口和类

♪Connection接口

Connection 接口用于和数据库服务器建立连接,它的实现类由数据库提供,获取 Connection 对象通常有两种方式:
♩通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
♩通过DataSource(数据源)对象获取:
        //1.创建数据源,描述数据库服务器在哪//创建实例DataSource dataSource = new MysqlDataSource();//设置数据库所在的位置((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");//设置数据库的用户名((MysqlDataSource)dataSource).setUser("root");//设置数据库的密码((MysqlDataSource)dataSource).setPassword("123456");//2.和数据库服务器建立连接//记录哪个和哪个要进行通信了Connection connection = dataSource.getConnection();

注:DriverManager类来获取的Connection连接,需要用到反射且是无法重复利用的;而DataSource提供连接池的支持,使用完会被线程池回收。

♪Statement对象

Statement 对象主要将 SQL语句发送到数据库中,每个Statement对象都通过Connection对象创建。Statement对象可以是普通的Statement(用于执行静态SQL语句)、PreparedStatement(是预编译的Statement对象,用于执行预编译的SQL语句)和CallableStatement(用于调用存储过程的Statement对象)。Statement对象中还有有两种执行SQL的方法:

♩executeQuery():执行后返回单个结果集,常用于select语句

♩executeUpdate():执行后返回受影响行数,常用于update、insert、delete语句

♪ResultSet对象

使用JDBC时,执行SQL查询会返回一个结果集。ResultSet是一个包含查询结果的表格,包括行和列。可以使用ResultSet接口检索和处理这些行和列,以便在Java应用程序中使用这些数据。

♫JDBC的使用

♪添加“驱动包”

要想使用JDBC需要到数据库的官网或者是“中央仓库”去下载对应数据库版本的“驱动包”,然后在idea项目下创建一个新目录,将“驱动包”拷贝到目录里,再右键选择Add as Library...键将“驱动包”作为库添加到当前项目中即可。

添加好“驱动包”后就可以开始JDBC编程了~

♪创建数据源,描述数据库服务器在哪

创建数据源可以使用DriverManger和DataSource两种,由于反射不属于常规编程手段,故这里采用DataSource的方法:

 //1.创建数据源,描述数据库服务器在哪//创建实例DataSource dataSource = new MysqlDataSource();//设置数据库所在的位置((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");//设置数据库的用户名((MysqlDataSource)dataSource).setUser("root");//设置数据库的密码((MysqlDataSource)dataSource).setPassword("1234");

注:MySQL数据连接的URL参数格式为: jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值

♪和数据库服务器建立连接

描述数据库服务器在哪后就可以和服务器建立连接了,通过dataSource的getConnection获取连接对象:

 //2.和数据库服务器建立连接//记录哪个和哪个要进行通信了Connection connection = dataSource.getConnection();

♪构建SQL语句

连接好服务器就可以构建要执行的SQL语句了,可以直接通过字符串常量构建SQL语句:

 //3.构造sql语句//描述sql是什么样子的String sql = "insert into student values(1,‘张三’)";//jdbc中还需要搭配一个特点的对象,来描述这里的sql的情况PreparedStatement statement = connection.prepareStatement(sql);

还可以通过输入的方式动态构建SQL语句:

 Scanner scanner = new Scanner(System.in);int id = scanner.nextInt();String name = scanner.next();//?为占位符,下标从1开始String sql = "insert into student values(?,?)";PreparedStatement statement = connection.prepareStatement(sql);//将id填充到第一个占位符statement.setInt(1,id);//将name填充到第二个占位符statement.setString(2,name);

注:一般不介意采用字符串拼接的方式构建SQL语句,不仅代码的可读性低,而且容易遭受SQL注入攻击

♪执行SQL语句

构建完SQL语句就可以让服务器执行对应的SQL语句了,增删改通过executeQuery()放回变更的行数,查询通过executeUpdate()放回查询的结果集:

♩增删改

 String sql = "insert into student values(1,‘张三’)";PreparedStatement statement = connection.prepareStatement(sql);//4.执行sql//给服务器发送网络请求int len = statement.executeUpdate();

♩查询

 String sql = "select * from student";PreparedStatement statement = connection.prepareStatement(sql);ResultSet resultSet = statement.executeQuery();//遍历结果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id + ":" + name);}

♪释放资源

操作完之后需要断开连接,释放资源:

        try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException("数据库错误");}

http://www.lryc.cn/news/194399.html

相关文章:

  • windows OpenCV(包含cuda)最简安装教程
  • Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)
  • 狂砸40亿美元,亚马逊向OpenAI竞争对手Anthropic投资
  • 目标检测YOLO实战应用案例100讲-基于YOLOv5_tiny算法的路面裂缝智能检测
  • P5682 [CSP-J2019 江西] 次大值% 运算 set 去重的一道好题
  • vue3后台管理框架之API接口统一管理
  • 线性表的插入、删除和查询操作
  • 基于深度学习网络的疲劳驾驶检测算法matlab仿真
  • 【文件系统】Linux文件系统的基本存储机制
  • Outlook导入导出功能灰色,怎么解决
  • Chrome 同站策略(SameSite)问题
  • docker搭建nginx+php-fpm
  • 数据结构与算法---单调栈结构
  • Python爬虫:某书平台的Authorization参数js逆向
  • Android MediaCodec 框架 基于codec2
  • 【RocketMQ 系列三】RocketMQ集群搭建(2m-2s-sync)
  • Go TLS服务端绑定证书的几种方式
  • 【算法与数据结构】--高级算法和数据结构--排序和搜索
  • 【Java】jvm 元空间、常量池(了解)
  • Spring Boot自动加载
  • MPNN 模型:GNN 传递规则的实现
  • Flink kafka 数据汇不指定分区器导致的问题
  • 【软考】14.1 面向对象基本概念/分析设计测试
  • MFC-对话框
  • Essential Steps in Natural Language Processing (NLP)
  • Flink中KeyBy、分区、分组的正确理解
  • QT6集成CEF3--01 准备工作
  • 随机误差理论与测量
  • 树莓派4b配置通过smbus2使用LCD灯
  • UPS 原理和故障案例分享