目录
1.JDBC基本原理
现在,要使用java操作数据库,则我们的项目的构建或者说代码的组成增加为了三方:开发人员(使用者,即我们自己编写的应用操作)、Java官方(即JDK中内置的一些),以及数据库(这里指MySQL)三方共同组成
(1)开发人员,是使用者,我们使用java编程去操作数据库,我们可以说是应用者
(2)Java官方的JDK中则提供了JDBC,是一组规范标准,即一系列的接口和抽象类,无论是哪种数据库,只要你符合我的标准规范,即可连接使用
JDBC,即Java Database Connectivity,java数据库连接。
是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。
这个API由java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
故而,JDBC有这样的优点:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
(3)MySQL:实现JDBC中的接口和抽象类,所以,我们如果要使用java编程来达到对数据库的操作,还需要导入mysql-connector-java数据库驱动包,数据库驱动包就是对JDBC接口和抽象类的实现。所以我们在编程时才可以直接面向JDBC抽象接口编程
数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。
同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc
……
即下面这张图所表示的:
2.数据库驱动包的导入(环境配置)
- 编程语言:这里我们使Java语言(JDK1.8)
- 数据库:MySQL
- 数据库驱动包mysql-connector-java的导入
【数据库驱动包的添加】:
网上下载.jar包——>配置开发环境
这些操作我们借助项目构建工具Maven完成
(1)借助项目构建工具maven,在创建项目时,不再选择普通的java项目,而是选择maven项目
(2)配置环境,编写pom.xml文件
【pom:项目对象模型】
【.xml是一种可扩展标记语言,使用文本表示树】
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- group:组,artifact:作品 version:版本 -->
<!-- 下面这三行可以理解为将数据库驱动包导入了哪个组别哪个作品的哪个版本中,其实就是导入哪个项目中去的意思叭-->
<groupId>com.yunlixin</groupId>
<artifactId>jdbc-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 项目的一些基本属性 -->
<properties>
<!-- compiler : 编译器 -->
<!-- 原编译器1.8 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- 目标编译器版本1.8 -->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- dependency : 依靠、依赖 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<!-- 下面这句就是去下载java的驱动包mysql-connector-java -->
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
</project>
(3)当下面红色框框下载完成,说明环境配置ok
3.JDBC的使用步骤
当环境配置完成后,我们,就可以面向JDBC的接口和抽象类编程啦!
也就相当于,我们的demo代替MySQL客户端向MySQL服务端发送请求(操作)
所以,我们的核心就是与MySQL服务器端建立连接
(1)创建MysqlDataSource类的对象db
注意,这里的MysqlDataSource类不是java中的,而是我们导入的驱动包中的
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class Demo1 {
public static void main(String[] args) throws SQLException {
// MySQL客户端与服务器的连接,类似:保存联系人信息
MysqlDataSource db = new MysqlDataSource();
}
}
(2)对db进行一些set设置,如告诉客户端如何如何找到网络中的服务器端主机,以及自己对数据库操作的用户名和密码等
方式一:用一些set函数设置
// MySQL客户端与服务器的连接,类似:保存联系人信息
MysqlDataSource db = new MysqlDataSource();
// 设置服务器主机IP/域名,这里的localhost意思是本地
db.setServerName("localhost");
// 设置端口号
db.setPort(3306);
// 传入用户名和密码,确认该用户对MySQL的操作权限
db.setUser("root");
db.setPassword("123456");
// 设置默认库
db.setDatabaseName("book");
// 其他内容的配置
db.setUseSSL(false);
db.setCharacterEncoding("utf-8");
db.setServerTimezone("Asia/Shanghai");
方式二:用url参数形式
DataSource ds = new MysqlDataSource();
String url = "jdbc:masql://localhost:3306/book?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
((MysqlDataSource) ds).setUrl(url);
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("123456");
(3)创建Connertion对象,连接数据库(这里其实有两种创建方式,我们作为新手先写第一种代码简单的,实则第二种实际情况下有时必须得用)
二者区别:
1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。
第二种代码简单:
// Connection :连接
// 类似:打通电话了
Connection c = db.getConnection()
(4)得到SQL语句对象
(5)执行操作
- 如果是对于有返回结果的SQL(主要用于select语句),我们使用executeQuery() 方法,executeQuery() 方法执行查询后返回单个结果集,我们将执行查询的结果写入ResultSet集合中,再遍历输出:
// Statement: 语句 :要说的话,这里的SQL意思是展示所有的数据库 String sql = "show databases"; try (PreparedStatement ps = c.prepareStatement(sql)) { // execute: 执行 query:查询,带结果的SQL语句 try (ResultSet rs = ps.executeQuery()) { // 遍历得到的结果存储在ResultSet集合中,再遍历打印到控制台(屏幕) // next方法就是下一行,返回结果为boolean类型,没有该行时返回false while (rs.next()) { String name = rs.getString(1); System.out.println(name); } } }
- 如果对于不带结果的SQL语句,通常用于update、insert、delete,我们使用executeUpdate()方法,executeUpdate()方法的返回值是一个整数,指示受影响的行数
结果:
返回的1表示对1行产生了影响
(6)动态SQL
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Dynamic {
public static void main(String[] args) throws SQLException {
// show databases
// 类似:保存联系人信息
MysqlDataSource db = new MysqlDataSource();
db.setServerName("localhost");
db.setPort(3306);
db.setUser("root");
db.setPassword("123456");
db.setDatabaseName("lib_0403");
db.setUseSSL(false);
db.setCharacterEncoding("utf-8");
db.setServerTimezone("Asia/Shanghai");
// 动态SQL
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
try (Connection c = db.getConnection()) {
// 用?占位符代替输入的值,以防止SQL注入
String s = "select reader_name from reader where reader_id > ?";
try (PreparedStatement ps = c.prepareStatement(s)) {
// 设置第一个占位符为name
ps.setString(1, name);
}
}
}
}
(7)对自增型字段的获取:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Dynamic {
public static void main(String[] args) throws SQLException {
// show databases
// 类似:保存联系人信息
MysqlDataSource db = new MysqlDataSource();
db.setServerName("localhost");
db.setPort(3306);
db.setUser("root");
db.setPassword("123456");
db.setDatabaseName("lib_0403");
db.setUseSSL(false);
db.setCharacterEncoding("utf-8");
db.setServerTimezone("Asia/Shanghai");
动态SQL
Scanner scanner = new Scanner(System.in);
String n = scanner.next();
// 用占位符代替输入,避免SQL注入
String sql4 = "insert into reader (reader_name) values(?)";
// 返回自增的序列号
try(PreparedStatement ps = c.prepareStatement(sql4, Statement.RETURN_GENERATED_KEYS)){
ps.setString(1,n);
ps.executeUpdate();
try(ResultSet res = ps.getGeneratedKeys()){
while(res.next()){
int id = res.getInt(1);
System.out.println(id);
}
}
}
}
}
}
4.JDBC的常用接口和抽象类
(1)获取Connection对象的两种方式在步骤中已经提及
(2)
实际开发中最常用的是PreparedStatement对象
对PreparedStatement的总结:
- SQL语句可带参也可不带参
- SQL语句在数据库系统预编译
- 执行速度优于Statement
- 占位符 ? 从下标1开始
- 占位符不能使用多值
- 可阻止常见的SQL注入危险
5.核心小结:
核心还是JDBC的应用:
1. 创建数据库连接Connection
2. 创建操作命令Statement
3. 使用操作命令来执行SQL
4. 处理结果集ResultSet
5. 释放资源