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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL数据库(Java的数据库编程:JDBC)

什么是数据库编程

数据库编程要有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、断开连接, 释放资源

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

1. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
2. import javax.sql.DataSource;
3. import java.sql.Connection;
4. import java.sql.PreparedStatement;
5. import java.sql.SQLException;
6. import java.util.Scanner;
7. 
8. public class JDBCInsertDemo {
9. 
10. public static void main(String[] args) throws SQLException {
11. //1、先去创建 DataSource 数据源. 描述了 mysql 数据库在哪
12.         DataSource dataSource=new MysqlDataSource();
13. 
14.        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");
15.        ((MysqlDataSource)dataSource).setUser("root");
16.        ((MysqlDataSource)dataSource).setPassword("168168");
17. //2、和数据库建立连接
18.         Connection connection=dataSource.getConnection();
19. // 通过控制台, 来输入用户的信息
20.         Scanner scan=new Scanner(System.in);
21.         System.out.println("学号:");
22. int id=scan.nextInt();
23.         System.out.println("姓名:");
24.         String name=scan.next();
25. //3、构造 SQL 语句
26.         String sql="insert into student values(?,?)";
27. // jdbc 中还需要搭配一个特定的对象, 来描述这里的 sql 的情况
28.         PreparedStatement statement= connection.prepareStatement(sql);
29.         statement.setInt(1,id);
30.         statement.setString(2,name);
31.         System.out.println("sql: " + statement);
32. 
33. //4、执行 SQL. 针对 增, 删, 改, 使用 executeUpdate 来执行,针对 查, 使用 executeQuery 来执行.
34. int ret=statement.executeUpdate();
35.         System.out.println("ret="+ret);
36. //5、断开连接, 释放资源
37.         statement.close();
38.         connection.close();
39. 
40.     }
41. 
42. }
43.

我们在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(驱动管理类)的静态方法获取

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

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

1.        DataSource dataSource=new MysqlDataSource();
2. 
3.        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");
4.        ((MysqlDataSource)dataSource).setUser("root");
5.        ((MysqlDataSource)dataSource).setPassword("168168");
6. //2、和数据库建立连接
7.         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循环

查询案例:

1. 
2. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
3. import javax.sql.DataSource;
4. import java.sql.Connection;
5. import java.sql.PreparedStatement;
6. import java.sql.ResultSet;
7. import java.sql.SQLException;
8. public class JDBCSelectDemo {
9. public static void main(String[] args) throws SQLException {
10. //查找数据库位置
11. DataSource dataSource = new MysqlDataSource();
12.         ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");
13.         ((MysqlDataSource)dataSource).setUser("root");
14.         ((MysqlDataSource)dataSource).setPassword("168168");
15. //建立连接
16. Connection connection = dataSource.getConnection();
17. //构造sql语句
18. String sql = "select * from student where id = 1";
19. PreparedStatement statement = connection.prepareStatement(sql);
20. // 结果集合
21. ResultSet resultSet = statement.executeQuery();
22. //执行SQL
23. while (resultSet.next()) {
24. // next 相当于移动一下光标, 光标指向下一行. 然后移动到结尾, 就返回 false
25. // 使用 getXX 方法获取到每一列.
26. // 这里的参数, 就是数据库表的列名.
27. int id = resultSet.getInt("id");
28. String name = resultSet.getString("name");
29.             System.out.println(id + ": " + name);
30.         }
31. // 释放资源
32.         resultSet.close();
33.         statement.close();
34.         connection.close();
35.     }
36. }

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

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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
2天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
2天前
|
SQL NoSQL 关系型数据库
初识MySQL数据库——“MySQL数据库”
初识MySQL数据库——“MySQL数据库”
|
2天前
|
缓存 分布式计算 监控
Java并发编程:深入理解线程池
【4月更文挑战第17天】在Java并发编程中,线程池是一种非常重要的技术,它可以有效地管理和控制线程的执行,提高系统的性能和稳定性。本文将深入探讨Java线程池的工作原理,使用方法以及在实际开发中的应用场景,帮助读者更好地理解和使用Java线程池。
|
4天前
|
缓存 监控 Java
Java并发编程:线程池与任务调度
【4月更文挑战第16天】Java并发编程中,线程池和任务调度是核心概念,能提升系统性能和响应速度。线程池通过重用线程减少创建销毁开销,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。任务调度允许立即或延迟执行任务,具有灵活性。最佳实践包括合理配置线程池大小、避免过度使用线程、及时关闭线程池和处理异常。掌握这些能有效管理并发任务,避免性能瓶颈。
|
4天前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。
|
5天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
6天前
|
Java 编译器
Java并发编程中的锁优化策略
【4月更文挑战第13天】 在Java并发编程中,锁是一种常见的同步机制,用于保证多个线程之间的数据一致性。然而,不当的锁使用可能导致性能下降,甚至死锁。本文将探讨Java并发编程中的锁优化策略,包括锁粗化、锁消除、锁降级等方法,以提高程序的执行效率。
12 4
|
7天前
|
存储 安全 Java
Java语法掌握:打好编程基础的关键(二)
Java语法掌握:打好编程基础的关键
41 0
|
7天前
|
存储 Java
Java语法掌握:打好编程基础的关键(一)
Java语法掌握:打好编程基础的关键
10 0
Java语法掌握:打好编程基础的关键(一)