MySQL数据库(Java的数据库编程:JDBC)

news2024/11/19 14:37:21

ced485cbb11e458d81a746890b32cf3f.gif 

作者:渴望力量的土狗

博客主页:渴望力量的土狗的博客主页

专栏:MySQL数据库

目录

什么是数据库编程:

什么是JDBC? 

JDBC工作原理: 

JDBC的使用及相关操作: 

JDBC开发案例: 

JDBC常用接口和类: 

数据库连接Connection 

Statement对象

ResultSet对象  


什么是数据库编程:

数据库编程要有3个基本条件:

1、编程语言,如Java,c++/c,Python等等

2、数据库 如MySQL,Oracle,SQL Server等等

3、数据库驱动包,不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包

什么是JDBC? 

JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问. 

说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。 

JDBC工作原理: 

JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!

 

主要是通过jdbc的接口来进行的,利用接口,然后驱动数据库进行相关的操作。 

JDBC的使用及相关操作: 

1、首先我们要准备好数据库的驱动包,mysql-connector-java-5.1.47.jar也就是这个东西,
 具体下载请访问MySQL官网:https://www.mysql.com/downloads/

2、打开IDE,创建java文件

3、创建一个Directory,命名为lib,并把下载好的jar包复制到该Directory

4、把创建好的lib右键,然后Add as library 

 

 

出现这几个就是导入成功了,版本不一样可能里面的文件也会有差异。

5、创建正常的Java文件即可

 

JDBC开发案例: 

我们在使用JDBC的时候要经过以下几个步骤:

1、先去创建 DataSource 数据源. 描述了 mysql 数据库在哪

2、和数据库建立连接

3、构造 SQL 语句

4、执行 SQL. 针对 增, 删, 改, 使用 executeUpdate 来执行,针对 查, 使用 executeQuery 来执行. 

5、断开连接, 释放资源 

接下来是具体的操作代码:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCInsertDemo {

    public static void main(String[] args) throws SQLException {
        //1、先去创建 DataSource 数据源. 描述了 mysql 数据库在哪
        DataSource dataSource=new MysqlDataSource();

       ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");
       ((MysqlDataSource)dataSource).setUser("root");
       ((MysqlDataSource)dataSource).setPassword("168168");
        //2、和数据库建立连接
        Connection connection=dataSource.getConnection();
        // 通过控制台, 来输入用户的信息
        Scanner scan=new Scanner(System.in);
        System.out.println("学号:");
        int id=scan.nextInt();
        System.out.println("姓名:");
        String name=scan.next();
        //3、构造 SQL 语句
        String sql="insert into student values(?,?)";
        // jdbc 中还需要搭配一个特定的对象, 来描述这里的 sql 的情况
        PreparedStatement statement= connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println("sql: " + statement);

        //4、执行 SQL. 针对 增, 删, 改, 使用 executeUpdate 来执行,针对 查, 使用 executeQuery 来执行.
        int ret=statement.executeUpdate();
        System.out.println("ret="+ret);
        //5、断开连接, 释放资源
        statement.close();
        connection.close();

    }

}

我们在IDE中进行了插入一个学生的数据,现在我们看看学生表中是否出现了该数据:

是的,出现了,所以我们的插入是成功的。 

首先有几个需要明确的点:

1、我们在寻找数据库的位置是用到的DataSource是一个interface,需要用一MySQLDataSource来实现这个接口。然后是需要用到强制转换为MySQLDataSource类型,使用其中的set方法来进行设置URL,User,Password,注意这些数据一定要和原来的数据库可以对应上

2、设置URl的时候要使用本地回环ip地址:也就是下面这个

jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false

3、建立连接的时候使用Collection接口 ,通过DataSource(数据源)对象获取连接

4、构造sql语句的时候通常使用占位符(?),其中的?所在的位置是从1开始的。使用占位符还有的好处是可读性高,而且不容易被黑客攻击。构造的sql语句需要使用Statement对象来把语句发送到数据库。 

像下面这种sql语句就容易受到攻击:

String sql = "insert into student values("+ id +", '" + name + "')";

可以利用语句特点,把字符串类型的数据改为带;的数据,然后后面再跟个drop操作,你的表就直接寄了!!所以这样写很危险!!!一定要注意!

5、executeQuery() 方法执行后返回单个结果集的,通常用于select语句executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
 

6、最后别忘了释放资源!!资源占据也是非常影响效率的,其中包括有CPU,IO,硬盘,网络,带宽等等资源,要进行释放。

 

JDBC常用接口和类: 

数据库连接Connection 

Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
一种是通过DriverManager(驱动管理类)的静态方法获取

// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);

 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象

       DataSource dataSource=new MysqlDataSource();

       ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");
       ((MysqlDataSource)dataSource).setUser("root");
       ((MysqlDataSource)dataSource).setPassword("168168");
        //2、和数据库建立连接
        Connection connection=dataSource.getConnection();

 两种方式的区别:

1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源
时,通过connection.close()都是关闭物理连接。
2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接
是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将
Conncetion连接对象回收。

Statement对象

Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象
1、Statement 用于执行不带参数的简单SQL语句

2、PreparedStatement 用于执行带或者不带参数的SQL语句,执行速度比Statement快,SQL会预编译在数据库系统

3、CallableStatement 用于执行数据库存储过程的调用

最常用的是PreparedStatement对象,以下对其的总结:

1、SQL预编译

2、性能比Statement高

3、参数化SQL查询

4、占位符不能使用多值

5、占位符?下标从1开始

6、阻止常见SQL注入攻击

掌握两种执行SQL的方法:
executeQuery() 方法执行后返回单个结果集的,通常用于select语句
executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句


 

ResultSet对象  

我们在进行查询的时候,查询的结果是一个集合。

ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环

查询案例:


import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectDemo {
    public static void main(String[] args) throws SQLException {
        //查找数据库位置
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("168168");
        //建立连接
        Connection connection = dataSource.getConnection();
        //构造sql语句
        String sql = "select * from student where id = 1";
        PreparedStatement statement = connection.prepareStatement(sql);
        // 结果集合
        ResultSet resultSet = statement.executeQuery();
        //执行SQL
        while (resultSet.next()) {
            // next 相当于移动一下光标, 光标指向下一行. 然后移动到结尾, 就返回 false
            // 使用 getXX 方法获取到每一列.
            // 这里的参数, 就是数据库表的列名.
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println(id + ": " + name);
        }
        // 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}


和我们在cmd中的结果一致!查询成功!

到这里就结束了,后续还会慢慢完善哈,感谢支持! 

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

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

相关文章

关于电影的HTML网页设计-威海影视网站首页-电影主题HTM5网页设计作业成品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

5分钟教你如何设计一个安全web架构

今天就给大家聊聊web安全,web安全占比还是比较大的,基础的从一些html标签,到js 然后到接口,数据库,以及流量攻击,模拟请求。当然这也谈到了一个概念,全新的架构设计模式,前后端分离&…

一文讲解如何学习 Linux 内核网络协议栈

协议栈的细节 下面将介绍一些内核网络协议栈中常常涉及到的概念。 sk_buff 内核显然需要一个数据结构来表示报文&#xff0c;这个结构就是 sk_buff ( socket buffer 的简称)&#xff0c;它等同于在<TCP/IP详解 卷2>中描述的 BSD 内核中的 mbuf。 sk_buff 结构自身并不…

【毕业设计】深度学习人脸性别年龄识别系统 - python

文章目录0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程4 具体实现4.1 预训练数据格式4.2 部分实现代码5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff0…

【案例分享】华为防火墙出接口方式的单服务器智能DNS配置

介绍出接口方式的单服务器智能DNS的配置举例。 组网需求 如图1所示&#xff0c;企业部署了一台ISP1服务器对外提供Web服务&#xff0c;域名为www.example.com。ISP1服务器的私网IP地址为10.1.1.10&#xff0c;服务器映射后的公网IP地址为1.1.1.10。企业的DNS服务器上存在域名w…

为什么你的用户转化率不高?-- 新媒体运营转化效果渠道归因分析

新媒体运营人最关注的就是流量和用户转化问题。公司发布了新APP、上线了新网站项目&#xff0c;进行用户定位、策划、数据分析和内容营销&#xff0c;花重钱做产品推广&#xff0c;但最后用户转化率却不高&#xff0c;大批用户流失了......这种现象是运营人最不愿意看到的&…

老杨说运维|今年这个会议非比寻常

前言&#xff1a; 人民银行印发的《金融科技(FinTech)发展规划(2022-2025年)》中&#xff0c;重点围绕数字化转型建设&#xff0c;强调上云、数据基础建设以及数智应用的重要性&#xff0c;明确了金融科技的长期重点建设方向。 由金科创新社主办的“2022金融业新一代数据中心发…

kwebio/kweb-core:面向后端的轻量级 Kotlin Web 框架

现代网站至少由两个紧密耦合 的组件组成&#xff0c;一个在浏览器中运行&#xff0c;另一个在服务器上。它们通常用不同的编程语言编写&#xff0c;并且必须通过 HTTP(S) 连接相互通信。 Kweb 的目标是消除这种服务器/浏览器分离&#xff0c;这样您就可以专注于构建您的网站或用…

react多组件出错其他正常显示

问题&#xff1a;一个组件内部有很多个子组件&#xff0c;其中一个出错&#xff0c;怎么实现其他组件可以正常显示&#xff0c;而不是页面挂掉&#xff1f; 一、错误边界 可以捕获发生在其子组件树任何位置的 JavaScript 错误&#xff0c;并打印这些错误&#xff0c;同时展示…

CC攻击和DDOS攻击哪个对服务器影响更大

互联网企业&#xff0c;不管是小企业&#xff0c;还是大企业&#xff0c;大多数企业网站都遭受过攻击&#xff0c;而我们时不时的也能在网上看见某大型企业网站被攻击&#xff0c;崩溃的新闻&#xff0c;网络攻击可以说是屡见不鲜了。攻击力最常见的就是DDOS攻击和CC攻击&#…

使用HTML+CSS技术制作篮球明星介绍网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

2022年数维杯国际数模赛浅评

今日数维杯国际大学生数学建模挑战赛将要开赛&#xff0c;为了更好的帮助大家整理了以下注意事项&#xff0c; 竞赛开始时间&#xff1a;北京时间2022年11月17日08:00&#xff08;周四&#xff09; 竞赛结束时间&#xff1a;北京时间2022年11月21日08&#xff1a;00&#xff…

ffmpeg视频编解码 demo初探(二)(包含下载指定windows版本ffmpeg)将YUV图片序列作为流读入,编码封装成x264 MP4视频

参考文章&#xff1a;【FFmpeg编码实战】&#xff08;1&#xff09;将YUV420P图片集编码成H.264视频文件 文章目录第二个项目&#xff1a;将YUV图片序列作为流读入&#xff0c;编码封装成x264 MP4视频将YUV图片序列编码成.h264文件将YUV图片序列编码成mp4文件第二个项目&#x…

艾美捷测序级 II,纯化胰蛋白酶化验程序文献参考

胰蛋白酶是一种基于带正电荷的赖氨酸和精氨酸侧链的底物特异性胰丝氨酸蛋白酶&#xff08;Brown and Wold 1973&#xff09;。这种酶由胰腺排出&#xff0c;参与食物蛋白质的消化和其他生物过程。胰蛋白酶是一种中等大小的球状蛋白&#xff0c;作为一种无活性的胰蛋白酶原产生&…

甘露糖-顺铂mannose-cisplatin|甘露糖-聚乙二醇-顺铂cisplatin-PEG-mannose

甘露糖-顺铂mannose-cisplatin|甘露糖-聚乙二醇-顺铂cisplatin-PEG-mannose 顺铂&#xff0c;又名顺式-二氯二氨合铂&#xff0c;是一种含铂的药物&#xff0c;呈橙黄色或黄色结晶性粉末&#xff0c;微溶于水、易溶于二甲基甲酰胺&#xff0c;在水溶液中可逐渐转化成反式和水解…

基于Feign接口的全链路拦截器

1、前言 单体应用时&#xff0c;我们经常会把一些共享数据&#xff0c;比如登录信息等放在session里面&#xff0c;当然也可以放在ThreadLocal里面。随着业务复杂度的提高&#xff0c;分布式应用越来越主流。单机的存储的思想已经不适用了&#xff0c;共享session应运而生&…

如何度量预测用户付费的误差

在广告&#xff0c;电商&#xff0c;游戏等行业中&#xff0c;预测用户付费是核心的业务场景&#xff0c;能直接帮助提升收入&#xff0c;利润等核心业务指标&#xff0c;堪称预测中的明星。在预测用户付费的系列文章中&#xff0c;结合作者理论和工程实践经验&#xff0c;深入…

C++ make_heap等堆函数的使用

一、介绍 C的STL提供了make_heap、push_heap、pop_heap、sort_heap等算法&#xff0c;它们用来将一个随机存储的数组或者容器等转换为一个heap。这里所说的转换为heap意思是将原来的存储顺序改变&#xff0c;将转换成的堆层序遍历后所得到的元素顺序作为数组或者容器新的元素顺…

用HarmonyOS ArkUI调用三方库PhotoView实现图片的联播、缩放

本文演示如果用HarmonyOS的ArkUI来调用已经上架到三方库中心的社区库。体验HarmonyOS 3最新的API 9&#xff0c;欢迎大家一起参与构建这个万物互联的时代&#xff01; 活动主页 HarmonyOS线上Codelabs挑战赛已经开启&#xff0c;该系列挑战赛将围绕HarmonyOS的基础组件和容器…

ABAQUS计算不收敛问题,排查方法和解决方案都在这儿了

在进行有限元仿真计算时&#xff0c;常常会遇到计算不收敛的问题&#xff0c;而且导致求解不收敛的原因也是多种多样的&#xff0c;处理起来也是相当的麻烦。特别是在利用隐式算法的求解非线性问题时&#xff0c;对静态平衡方程进行迭代求解时极易出现计算的不收敛问题&#xf…