什么是JDBC
JDBC(Java Data Base Connectivity, Java数据库连接)是Java程序和数据库之间的桥梁,包含
了⼀套Java定义的⽤于执⾏SQL语句的接⼝,使开发者能够编写数据库的程序。JDBC 的主要作⽤是:与数据库建⽴连接、发送SQL语句和处理数据库执⾏结果
访问数据库的步骤
- 确定数据库服务器的地址,端口号
- 建立连接,用户名,密码(不同的数据库以哪种协议连接)
- 发送执行的SQL语句
- 接受返回结果
- 关闭连接
JDBC是由Java平台提供的接口,具体的实现是由数据库的厂商实现完成的
修改idea中的内置的MAVEN
修改其配置
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
-->
<!-- 加入如下mirror节点 使用国内阿里云仓库镜像 开始 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>central</id>
<mirrorOf>*</mirrorOf>
<name>aliyun central</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>spring</id>
<mirrorOf>*</mirrorOf>
<name>aliyun spring</name>
<url>https://maven.aliyun.com/repository/spring</url>
</mirror>
<!-- 加入如下mirror节点 使用国内阿里云仓库镜像 结束-->
</mirrors>
创建一个MAVEN工程
创建项目的方式
创建完成后,对其项目的配置文件pom写一个jdbc的依赖
首先建一个管理依赖的节点
然后通过https://mvnrepository.com/
先搜索mysql
点击第二个
点8.0.33
复制,并将其粘贴到管理依赖节点处
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
点击进行下载
JDBC的使用
1.加载数据库厂商的驱动包(通过其驱动包拉操作数据库)
2.建立数据库的连接
JDBC URL
3.创建Statement
4.定义SQL
5.执行SQL,获得查询结果
6.遍历结果
7.进行关闭,释放资源
进行测试
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;
public class Demon_01DriverManager {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//1.加载数据库厂商提供的驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得数据库的连接
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/u?characterEncoding=utf8" +
"&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");
//3.创建Statement对象
statement = connection.createStatement();
//4.定义一个SQL语句并执行
System.out.println("请输入学生的姓名");
Scanner scanner =new Scanner(System.in);
//接受用户的输入
String name =scanner.next();
String sql = "select student_id, sn, name, mail, class_id from student where name = '" + name + "'";
//5.执行SQL,获取查询的结果
resultSet = statement.executeQuery(sql);
//6结果集进行遍历
//如果下一条有记录则返回true,否则返回false
while (resultSet.next()){
long stu_id = resultSet.getLong(1);
String stu_sn = resultSet.getString(2);
String stu_name = resultSet.getString(3);
String stu_mail = resultSet.getString(4);
long class_id = resultSet.getLong(5);
System.out.println(MessageFormat.format("学生编号={0},学号={1},学生姓名={2},学生邮件={3},学生班级={4}",
stu_id, stu_sn, stu_name, stu_mail, class_id));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源,进行关闭
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
注:
1.如果在其输入 'or/**/1=1;# 会出所有的结果集,非常不安全
2.我们通过DriverManager每次调⽤getConnection⽅法都会初始化⼀个新的连接,使⽤完成后会关闭真实 连接,导致资源浪费。
DataSource使⽤了连接池的技术,会在初始化时创建⼀定数量的数据库连接,这些连接可以重复使⽤,关闭时并不是真正关闭连接,⽽是将连接归还给连接池,以供后续使⽤,有效地提⾼资源利⽤率和和性能
我们通过数据源DataSource来获取对象
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;
public class Demon_02DataSource {
public static void main(String[] args) {
// 定义MySQL数据源对象
MysqlDataSource mysqlDataSource = new MysqlDataSource();
// 设置数据库连接串
mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/u?characterEncoding=utf8&allowPublicKeyRetrieval" +
"=true&useSSL=false");
// 用户名
mysqlDataSource.setUser("root");
// 密码
mysqlDataSource.setPassword("123456");
// 定义JDBC的数据源对象
DataSource dataSource = mysqlDataSource;
// 定义连接对象
Connection connection = null;
// 定义预处理SQL执行对象
PreparedStatement statement = null;
// 定义结果集对象
ResultSet resultSet = null;
try {
// 1. 通过数据源获取数据库连接
connection = dataSource.getConnection();
// 2. 获取预处理SQL执行对象
// 定义要执行的SQL
String sql = "select student_id, sn, name, mail, class_id from student where name = ?";
statement = connection.prepareStatement(sql);
// 接收用户的输入
System.out.println("请输入学生姓名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
// 3. 用真实值替换占位符
statement.setString(1, name);
// 4. 执行SQL,获取结果集
resultSet = statement.executeQuery();
// 5. 遍历结果集
while (resultSet.next()) {
// 获取学生Id
long stuId = resultSet.getLong("student_id");
String stuSn = resultSet.getString(2);
String stuName = resultSet.getString(3);
String stuMail = resultSet.getString(4);
long classId = resultSet.getLong(5);
System.out.println(MessageFormat.format("学生编号={0}, 学号={1}, 学生姓名={2}, 邮箱={3}, 班级编号={4}", stuId, stuSn,
stuName, stuMail, classId));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 依次释放资源,关闭连接
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
当我们运行 'or/**/1=1;#时 不会出现所有的结果集
封装使用
当我们写一个项目时,总是会有一些重复的操作,在这个项目中也是一样,比如说获得数据库的连接,关闭连接,释放资源等,我们可以将它们进行封装
package utils;
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
// 数据源
private static DataSource dataSource = null;
// 数据库连接串
private static final String URL = "jdbc:mysql://127.0.0.1:3306/u?characterEncoding=utf8" +
"&allowPublicKeyRetrieval=true&useSSL=false";
// 用户名
private static final String USER = "root";
// 密码
private static final String PASSWORD = "123456";
// 当类加载到JVM的时候,执行数据源的初始化
static {
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USER);
mysqlDataSource.setPassword(PASSWORD);
dataSource = mysqlDataSource;
}
/**
* 构造方法私有化,防止new这个对象
*/
private DBUtil() {}
/**
* 获取数据库连接
* @return
* @throws SQLException
*/
public static Connection getConnection () throws SQLException {
return dataSource.getConnection();
}
/**
* 释放资源,关闭连接
* @param resultSet
* @param statement
* @param connection
*/
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
通过分装进行一个插入的使用
import utils.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class Demon_03Insert {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement statement = null;
try {
// 1. 获取数据库连接
connection = DBUtil.getConnection();
// 2. 定义SQL
String sql = "insert into student (sn, name, mail, class_id) values (?,?,?,?)";
// 3. 定义SQL预处理对象
statement = connection.prepareStatement(sql);
// 4. 接收用户参数
System.out.println("请输入学号:");
Scanner scanner = new Scanner(System.in);
String sn = scanner.next();
System.out.println("请输入姓名:");
String name = scanner.next();
System.out.println("请输入邮箱:");
String mail = scanner.next();
System.out.println("请输入班级编号:");
Long classId = Long.valueOf(scanner.next());
// 5. 用真实数据填充占位符
statement.setString(1, sn);
statement.setString(2, name);
statement.setString(3, mail);
statement.setLong(4, classId);
// 6. 执行SQL获取结果
int row = statement.executeUpdate();
// 7. 判断结果
if (row == 1) {
System.out.println("插入成功");
} else {
System.out.println("插入失败");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源,关闭连接
DBUtil.close(null, statement, connection);
}
}
}
运行
希望能对大家有所帮助!!!!