JDBC是什么?
JDBC是Java DataBase Connectivity的简称,代表数据库连接。其实是由Java官方(Sun公司)提供的一套操作数据库的接口规范。由各个数据库厂商实现JDBC这套接口,提供数据库驱动包jar文件。
这样我们不需要知道各个数据库的实现原理,只需要通过JDBC这套接口提供的API就可以去操作各种数据库,真正执行的是驱动jar包中的实现类。
JDBC使用步骤
这里我们以MySQL数据库为例,演示JDBC的使用步骤。先准备好要操作的数据库和表
-- 创建数据库db4
CREATE DATABASE db4;
-- 使用数据库
USE db4;
-- 创建user表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10),
PASSWORD VARCHAR(20)
)
-- 添加数据
INSERT INTO USER(username,PASSWORD) VALUES('张三','123');
INSERT INTO USER(username,PASSWORD) VALUES('李四','456');
INSERT INTO USER(username,PASSWORD) VALUES('王五','789');
INSERT INTO USER(username,PASSWORD) VALUES('赵六','101');
查询user表所有数据,如下图
导入MySQL驱动包
1. 在项目模块里新建libs目录
2. 复制mysql-connector-java-5.1.37-bin.jar到libs目录下
3. 选择jar包右键-->Add As Library
注册MySQL驱动
//固定写法
Class.forName("com.mysql.jdbc.Driver");
获取数据库连接
//数据库地址:"jdbc:mysql://localhost:3306/db3"
//用户名:"root"
//密码:"root"
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4", "root", "root");
获取执行SQL语句的Statement对象
Statement stmt = conn.createStatement();
执行sql语句
执行DML(增删改),使用executeUpdate方法;执行DQL(查询表数据),使用executeQuery方法
//添加一条表记录
String insertSQL="INSERT INTO USER(username,PASSWORD) VALUES('田七','987')";
stmt.executeUpdate(insertSQL);
//修改id为1的表记录
String updateSQL="UPDATE USER SET username='wangmaomao' WHERE id=1";
stmt.executeUpdate(updateSQL);
//删除username为'田七'的记录
String deleteSQL="DELETE FROM USER WHERE username='田七'";
stmt.executeUpdate(deleteSQL);
//查收user表中所有的数据
String selectSQL="SELECT * FROM USER";
ResultSet rs = stmt.executeQuery(selectSQL);
//处理结果集,findAll方法在下面
List<User> list = findAll(rs);
处理结果集
查询语句得到的结果是ResultSet结果集,我们定义一个方法来遍历结果集,代码如下。
//处理结果集
public static List<User> findAll(ResultSet rs) throws SQLException {
//处理结果集
List<User> list=new ArrayList<>();
while(rs.next()){
User user=new User();
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
user.setId(id);
user.setUsername(username);
user.setPassword(password);
list.add(user);
}
return list;
}
释放资源
//释放Statement
stmt.close();
//释放Connection连接
conn.close();
执行完上面演示步骤之后,在SQLYog中查询user表中所有数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4a8BNFpy-1591239979652)(<assets/4.1 JDBC-37ad8281.png>)]
JDBCUtil工具类封装
定义配置文件
# MyQL驱动类
driver=com.mysql.jdbc.Driver
# 数据的地址url
url=jdbc:mysql://localhost:3306/db4
# 用户名
username=root
# 密码
password=root
封装JDBCUtils工具类
package com.itheima.jdbc.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
//MySQL数据库驱动
public static String driver;
//MySQL数据库地址
public static String url;
//MySQL数据库用户名
public static String username;
//MySQL数据库密码
public static String password;
//白话:只要使用本工具类,静态代该处码块就会执行
static{
try {
//读取配置文件
Properties pro=new Properties();
//获取src目录下jdbc.properties的输入流
InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
pro.load(inputStream);
//获取配置文件中的属性值
driver=pro.getProperty("driver");
url=pro.getProperty("url");
username=pro.getProperty("username");
password=pro.getProperty("password");
//注册驱动,并读取配置文件
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
* @return
*/
public static Connection getConnection()
throws SQLException {
Connection conn =
DriverManager.getConnection(url, username, password);
return conn;
}
/**
* 释放资源
* @param conn 数据库连接
* @param statement 数据库执行者
*/
public static void close(Statement statement,Connection conn){
close(null,statement,conn);
}
/**
* 释放资源
* @param conn 数据库连接
* @param statement 数据库执行者
*/
public static void close(ResultSet resultSet,Statement statement,Connection conn){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
用户登录&SQL注入
package com.itheima.jdbc.demo;
import com.itheima.jdbc.utils.JDBCUtils;
import java.sql.*;
import java.util.Scanner;
public class JDBCDemo1 {
public static void main(String[] args) throws SQLException {
Connection conn = JDBCUtils.getConnection();
//获取执行sql的Statement对象
Statement statement = conn.createStatement();
//键盘录入用户名和密码
Scanner sc=new Scanner(System.in);
System.out.println("键盘录入用户名");
String username = sc.nextLine();
System.out.println("键盘录入密码");
String password = sc.nextLine();
//执行sql语句
String sql=
"select * from user where username='"+username
+"' AND "+"password='"+password+"'";
System.out.println(sql);
ResultSet rs = statement.executeQuery(sql);
if(rs.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
rs.close();
statement.close();
conn.close();
}
}
键盘录入的时SQL注入,导致任意的用户名和密码都能登录成功。
用户登录&预处理Statement
package com.itheima.jdbc.demo;
import com.itheima.jdbc.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCDemo2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement preStmt =null;
try {
//获取数据库连接
conn = JDBCUtils.getConnection();
//键盘录入用户名和密码
Scanner sc=new Scanner(System.in);
System.out.println("键盘录入用户名");
String username = sc.nextLine();
System.out.println("键盘录入密码");
String password = sc.nextLine();
//获取预处理的Statement
String sql=
"select * from user where username=? password=?";
preStmt =conn.prepareStatement(sql);
//设置用户名,给第一个? 赋值
preStmt.setObject(1,username);
//设置密码,给第二个? 赋值
preStmt.setObject(2,password);
//执行sql语句,获取结果集
ResultSet rs = preStmt.executeQuery();
//如果next()为true,说明查询到改用户名和密码
if(rs.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
} catch (SQLException e) {
System.out.println("登录失败,sql语句不正确");
}finally {
//释放资源
JDBCUtils.close(conn,preStmt);
}
}
}
执行上面代码,验证登录
JDBC事务管理
Connection连接对象,提供了事务管理相关的方法,这里我们掌握以下3个方法
public void setAutoCommit(boolean flag)
当flag设置为false时,表示开启事务。
public void commit()
调用此方法提交事务,数据会持久化更新
public void rollback()
当出问题时回滚事务,数据会回到开启事务之前的状态
JDBC事务代码演示
public class JDBCDemo4 {
public static void main(String[] args) {
PreparedStatement pstmt =null;
Connection conn =null;
ResultSet rs =null;
try {
conn = JDBCUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
PreparedStatement p1 = conn.prepareStatement("update account set balance=balance-500 where id=?");
p1.setInt(1,1);
p1.executeUpdate();
//这里故意演示一个问题 sql语句里有一些错误的代码xxx
//PreparedStatement p2 = conn.prepareStatement("update account xxx set balance=balance+500 where id=?");
PreparedStatement p2 = conn.prepareStatement("update account set balance=balance+500 where id=?");
p2.setInt(1,2);
p2.executeUpdate();
//提交事务
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
//如果有问题,回滚事务
try {
System.out.println("出问题了,回滚事务...");
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
JDBCUtils.close(rs,pstmt,conn);
}
}
}