JDBC基础
文章目录
一、JDBC简介
JDBC(Java Database Connectivity),Java数据库连接,就是使用Java语言操作关系型数据库的一套API。
本质就是Java官方定义的一套操作所有关系型数据库的规则,即接口
二、JDBC编程基础步骤
- 注册驱动
- 获取连接
- 定义SQL
- 获取执行SQL的对象
- 执行SQL
- 处理结果
- 释放资源
下面是一个简单的示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class test {
public static void main(String[] args) throws Exception {
// 1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2、获取连接
String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
String username = "root";
String password = "123456";
// MySQL所设置的username和password
Connection c = DriverManager.getConnection(url, username, password);
// 3、定义SQL
String sql = "update tb set name = 'Berry' where id = 2";
// 4、获取执行SQL的对象
Statement sta = c.createStatement();
// 5、执行SQL
int count = sta.executeUpdate(sql);
// 此处返回了执行SQL语句影响的行数
// 6、处理结果
System.out.println(count);
// 7、释放资源
sta.close();
c.close();
// 资源的释放遵循从里到外的原则
}
}
三、JDBC中的API
1、DriverManager(驱动管理类)
作用:
- 注册驱动
- 获取数据库连接
注册驱动所使用的语句 Class.forName(“com.mysql.cj.jdbc.Driver”); 在 Driver 的源码中存在一部分静态代码块,其随着类的加载自动执行。
静态代码块如下:
package com.mysql.cj.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
如果安装的是MySQL 5之后的驱动jar包,ClassforName()行代码可以省略,Java会自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类。
获取数据库连接所使用的方法为:
getConnection(String url, String username, String password)
其中 url 的格式为:
jdbc:mysql://(jdbc的协议)127.0.0.1(ip地址/域名localhost):3306(端口号)/jdbc_test(数据库名称)?参数键值对1&参数键值对2
如果连接的是本机MySQL服务器且MySQL服务默认端口默认为3306,则url可简写为:
jdbc:mysql:///数据库名称?参数键值对
2、Connection(数据库连接对象)
作用:
- 获取执行SQL的对象
包括普通执行SQL的对象(createStatement() )、预编译SQL的执行SQL对象(prepareStatement(sql) )、执行存储过程的对象(prepareCall(sql) ) - 管理事务
- setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即开启事务
- commit():提交事务
- rollback():回滚事务
下面是一个简单的示例:
首先创建一个名为 ‘tb’ 的初始表格如下图:
然后执行以下代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class test {
public static void main(String[] args) throws Exception {
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
String username = "root";
String password = "123456";
Connection c = DriverManager.getConnection(url, username, password);
//定义SQL
String sql1 = "update tb set number = 0 where id = 1";
String sql2 = "update tb set number = 1 where id = 2";
//获取执行SQL的对象
Statement sta = c.createStatement();
//开启事务
c.setAutoCommit(false);
//使用try-catch块,在出现异常时进行事务回滚
try {
//执行SQL
int a = sta.executeUpdate(sql1);
System.out.println(a);
//添加一个异常
int n = 10 / 0;
int b = sta.executeUpdate(sql2);
System.out.println(b);
} catch (Exception e) {
e.printStackTrace();
//回滚事务
c.rollback();
}
//提交事务
c.commit();
//释放资源
sta.close();
c.close();
}
}
代码执行的结果为:
a 的值已经打印,说明 sql1 语句已执行。但由于出现异常,事务回滚至开启事务前的状态,因此表格中的数据不会发生改变:
3、Statement
作用:
- 执行SQL语句
// 执行DML、DDL语句,返回值为语句影响的行数,DDL语句执行成功后也可能返回0
int -> executeUpdate(sql);
// 执行DQL语句,返回值为ResultSet结果集对象
ResultSet -> executeQuery(sql);
// 既可以执行DML、DDL语句,返回值为false;也可以执行DQL语句,返回值为true
boolean -> execute(sql);
4、ResultSet
作用:
- 封装了DQL查询语句的结果
// 获取查询结果
boolean -> next(); // 将光标向前移动一行并判断该行是否为有效行,若当前行有数据则返回true
// 获取查询数据
getValuetype(参数); // 参数为int -> 列编号,从1开始,或String -> 列名
下面以前文中的表格 ‘tb’ 示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test {
public static void main(String[] args) throws Exception {
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
String username = "root";
String password = "123456";
Connection c = DriverManager.getConnection(url, username, password);
//定义SQL
String sql = "select * from tb";
//获取执行SQL的对象
Statement sta = c.createStatement();
//执行SQL
ResultSet rs = sta.executeQuery(sql);
//处理结果
while(rs.next()){
String name = rs.getString("name");
int num = rs.getInt("number");
System.out.println(name + '\t' + num);
}
//释放资源
rs.close(); // 记得释放 ResultSet
sta.close();
c.close();
}
}
执行后的结果为:
5、PreparedStatement
作用:
- 预编译SQL语句并执行:预防SQL注入问题。(SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。)
// 获取PreparedStatement对象
PreparedStatement -> prepareStatement(sql);
// 设置参数值
setValuetype(参数1,参数2);
同样以表格 ‘tb’ 进行简单示例:
import java.sql.*;
import java.util.Scanner;
public class test {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入id和number:");
int id = scanner.nextInt();
int number = scanner.nextInt();
//获取连接
String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
String username = "root";
String password = "123456";
Connection c = DriverManager.getConnection(url, username, password);
//定义SQL
String sql = "select * from tb where id = ? and number = ?"; // SQL语句中的参数值使用 ? 占位符替代
//获取PreparedStatement对象
PreparedStatement psta = c.prepareStatement(sql);
//设置参数值
psta.setInt(1,id); // 参数1为 ?位置的编号,从1开始,参数2为 ?的值
psta.setInt(2,number);
//执行SQL
ResultSet rs = psta.executeQuery();
//处理结果
if (rs.next()){
System.out.println("查询成功!");
}else{
System.out.println("查询失败!");
}
//释放资源
rs.close(); // 记得释放 ResultSet
psta.close();
c.close();
}
}
简单测试: