Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
JDBC访问数据库层次结构:

那么如何实现JDBC呢?


pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。
<!-- 添加 mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
package com.shaoyuwang;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 测试jdbc: Java代码与数据库连接,打印全部数据库名
*/
public class Demo1 {
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.setUseSSL(false);
db.setCharacterEncoding("utf-8");
db.setServerTimezone("Asia/Shanghai");
// Connection c = null;
// try {
// c = db.getConnection();
// } finally {
// if (c != null) {
// c.close();
// }
// }
String sql = "show databases";
// Connection :连接
try (Connection c = db.getConnection()) {
// Statement: 语句 :要说的话
try (PreparedStatement ps = c.prepareStatement(sql)) {
// execute: 执行 query:查询
try (ResultSet rs = ps.executeQuery()) {
// 遍历得到的结果,打印到控制台(屏幕)
while (rs.next()) {
String name = rs.getString(1);
System.out.println(name);
}
}
}
}
}
}
a. 通过DataSource方式
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");
try (Connection c = db.getConnection()) {
// ......
}
b. 通过DriverManager方式
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/lib_0403?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
Connection c = DriverManager.getConnection(url, "root", "123456");
String sql = "show databases";
try (PreparedStatement ps = c.prepareStatement(sql)) {
// 。。。。。。
}
try (PreparedStatement ps = c.prepareStatement(sql)) {
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int reid = rs.getInt(1);
int rid = rs.getInt("rid");
String bid = rs.getString(3);
String borrowedAt = rs.getString("borrowed_at");
System.out.printf("%d, %d, %s, %s\n", reid, rid, bid, borrowedAt);
}
}
}
try (PreparedStatement ps = c.prepareStatement(sql)) {
// n影响行数
int n = ps.executeQuery();
System.out.println(n);
}
String n = scanner.nextLine();
try (Connection c = db.getConnection()) {
// 被 SQL 注入
// String sql = "select reid, rid, bid, borrowed_at from records where reid > " + n + " order by reid";
// ? 表示占位符
String sql = "select reid, rid, bid, borrowed_at from records where reid > ? order by reid";
try (PreparedStatement ps = c.prepareStatement(sql)) {
// 有了 PreparedStatment 之后
// execute 之前
// 为占位符绑定真实的数据
// 1表示第i个?,n表示填入的数据
ps.setString(1, n);
System.out.println(ps);
try (ResultSet rs = ps.executeQuery()) {
// 。。。。。。
}
}
}
// Statement.RETURN_GENERATED_KEYS 返回自增的键
try(PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
ps.setString(1, name);
ps.executeUpdate();
try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) {
int rid = rs.getInt(1);
System.out.println(rid + "|" + name);
}
}
}
import com.shaoyuwang.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* jdbc使用事务
*/
public class TransDemo {
public static void main(String[] args) throws SQLException {
String sql1 = "insert into records (rid, bid) values (1, 2)";
String sql2 = "update books set count = count - 1 where bid = 2";
// 要使用事务,在同一个事务中,操作 sql1 和 sql2,意味着必须在一条 Connection 完成
try (Connection c = DBUtil.connection()) {
// connection 中有一个 自动提交(autocommit)的属性,默认情况下,是 true(开启)
// 开启状态下,意味着,每一条 sql 都会被独立的视为一个事务
// 我们要让 sql1 和 sql2 看作整体,只需要关闭 connection 的自动提交
c.setAutoCommit(false);
// 此时就可以手动的控制事务的结束位置,并且需要手动提交
try (PreparedStatement ps = c.prepareStatement(sql1)) {
ps.executeUpdate();
}
try (PreparedStatement ps = c.prepareStatement(sql2)) {
ps.executeUpdate();
}
// 由于我们关闭了自动提交了,所以,所有的修改还没有真正地落盘
c.commit(); // 只有加上这句话,才表示事务被提交了(数据真正落盘了)
}
}
}
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 获取Connection对象
*/
public class DBUtil {
private static final DataSource dataSource;
static {
MysqlDataSource db = new MysqlDataSource();
String url = "jdbc:mysql://localhost:3306/lib_0403?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
db.setUrl(url);
db.setUser("root");
db.setPassword("123456");
dataSource = db;
}
public static Connection connection() throws SQLException {
return dataSource.getConnection();
}
}
总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是MySQL的学习,学习JDBC编程,通过Java程序来操作控制数据库,以及JDBC使用事务。之后的学习内容将持续更新!!!