Java DataBase Connectivity
-
JDBC简述
规范!!!
Sun公司制定的通过Java连接数据库规范标准,而且是要求数据库提供商解决连接和操作的问题!!!
JDK
java.sql
javax.sql这里需要从数据库提供商官网下载对应的JAR包
mysql-connector-java-5.1.47.jar
这里推荐MySQL官网,后期使用maven来解决问题 -
MySQL数据库连接需要的参数
cmd > mysql -hlocalhost -uroot -p
Enter password: 123456
1. 确定连接的数据库是哪一个? MySQL
2. 确定连接的数据库是在哪一个主机上, 数据库服务器的地址
3. 连接当前数据库的用户名
4. 对应用户名的密码JDBC的URL=协议名+子协议名+数据源名。
a 协议名总是“jdbc”。
b 子协议名由JDBC驱动程序的编写者决定。
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
几种常见的数据库连接-------------------------------oracle------------------
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@machine_name:port:dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1521-------------------------------mysql-------------------
驱动:com.mysql.jdbc.Driver
URL:jdbc:mysql://machine_name:port/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认3306---------------------------SQL Server------------------
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1433--------------------------DB2--------------------------
驱动:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是5000目前适用于我们的URL是
jdbc:mysql://localhost:3306/javaee1904?useSSL=true需要对应的用户名和密码
需要在项目中导入第三方Jar包
方式1:[不推荐]
1. 在项目中新建文件夹lib
2. 复制对应JAR 粘贴到lib目录下
3. 在JAR包上鼠标右键 Add as library方式2: [推荐]
1. 菜单栏 File -> Project Structure
2. Project Settings -> Modules -> Dependecies -> +
3. JARs or Directories
4. 找到对应的JAR -
借助于JDBC,Java程序连接MySQL数据库
package com.qfedu.a_mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class Dome1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
/*
1. 加载驱动
JDBC是Java规定规范,但是没有实现,要求数据库服务商提供对应的程序
JDK中没有直接连接MySQL的能力,需要借助于 MySQL JDBC实现static { try { DriverManager 是驱动管理类 registerDriver 注册驱动 new Driver() 创建的就是com.mysql.jdbc.Driver类对象 DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } */ Class.forName("com.mysql.jdbc.Driver"); // 2. 准备URL String url = "jdbc:mysql://localhost:3306/javaee1904?useSSL=true"; // 3. 准备用户名和密码 String user = "root"; String password = "123456"; // 4. 借助于 DriverManager驱动管理类对象,获取数据库连接对象 Connection Connection connection = DriverManager.getConnection(url, user, password); System.out.println(connection); // 5. 关闭数据库连接 connection.close(); }
}
-
JDBC核心API
java.sql.Driver 接口
–| connect(String url, Properties prop);
url: Java连接数据库的URL协议
prop: Java连接数据库所需的属性,通常是保存在文件中,读取文件获取对应的内容。java.sql.DriverManager 类
–| static registerDriver(java.sql.Driver driver);
用于注册驱动的方法,需要的参数是java.sql.Driver接口的实现类对象。
–| java.sql.Connection getConnection(String url, String user, String password);
获取数据库连接对象的方法,需要的参数是
url: JDBC连接数据库的协议URL
user:连接数据库的用户名
password: 对应用户名的密码java.sql.Connection 接口
–| java.sql.Statement createStatement();
获取数据库的搬运工对象,Statement只是把Java中的SQL语句,直接搬运到数据库中执行,该对象也
是一个资源性质的对象。需要close
–| java.sql.PreparedStatement PrepareStatement(String sql);
获取数据库预处理搬运工对象,会将传入的SQL语句搬运到数据库中,预处理,能够提高效率和避免最
基本的【SQL注入】,这也是一个资源性质的对象,需要closejava.sql.Statement 接口
–| int exeuteUpdate(String sql);
执行传入的SQL语句,主要执行的SQL语句有 create insert update delete drop… 返回值是int
类型,返回的数据是 affected rows 受到影响的行数
–| java.sql.ResultSet exeuteQuery(String sql);
执行传入的SQL语句,主要执行的就是select DQL语句,返回值是一个java.sql.ResultSet 查询结
果集对象interface java.sql.PreparedStatement extends java.sql.Statment
–| int exeuteUpdate();
执行预处理的SQL语句,主要执行的SQL语句有 create insert update delete drop… 返回值是
int类型,返回的数据是 affected rows 受到影响的行数
–| java.sql.ResultSet exeuteQuery();
执行预处理的SQL语句,主要执行的就是select DQL语句,返回值是一个java.sql.ResultSet 查询
结果集对象
–| setXXX(int index, Object obj);
XXX 任意类型 最常用的是setObject
index是下标位置,从1开始
Obj 参数
下午告诉你java.sql.ResultSet 接口
ResultSet也是一个资源性质的数据,需要close
–| boolean next(); ===> boolean hasNext();
判断当前结果集中是否可以继续遍历下面的数据
–| getXXX(int columeIndex);
XXX可以表示任何数据类型,根据字段的下标位置获取对应字段的数据
–| getXXX(String fieldName); 【常用 反射】
xxx可以表示任何数据类型,这里是根据字段名获取对应的数据 -
使用JDBC Statement操作数据库
create table work(
id int primary key auto_increment,
name varchar(30) not null ,
age int not null ,
info text not null
);
5.1 TestAdd
@Test
public void testAdd() {
Connection connection = null;
Statement statement = null;
try {
// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 准备URL user password
String url = "jdbc:mysql://localhost:3306/javaee1904?useSSL=true";
String user = "root";
String password = "123456";
// 3. 获取数据库连接
connection = DriverManager.getConnection(url, user, password);
// 4. 准备SQL语句
String sql = "insert into work(name, age, info) values('骚杰', 66, '生化核武器')";
// 5. 获取Statement对象
statement = connection.createStatement();
// 6. 执行SQL语句。使用executeUpdate方法
int affectedRows = statement.executeUpdate(sql);
System.out.println(affectedRows);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5.2 TestDelete
@Test
public void testDelete() {
Connection connection = null;
Statement statement = null;
try {
// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 准备URL user password
String url = "jdbc:mysql://127.0.0.1:3306/javaee1904?useSSL
String user = "root";
String password = "123456";
// 3. 获取数据库连接对象
connection = DriverManager.getConnection(url, user, passwor
// 4. 准备SQL语句
String sql = "delete from work where id=3";
// 5. 获取Statement对象
statement = connection.createStatement();
// 6. 执行SQL语句
int i = statement.executeUpdate(sql);
System.out.println(i);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
5.3 TestUpdate
@Test
public void testUpdate() {
Connection connection = null;
Statement statement = null;
// 1.获取数据库连接对象
connection = JdbcUtil.getConnection();
// 2. 准备SQL语句
String sql = "update work set name = '宝哥哥' where id = 4";
try {
// 3. 获取Statement 对象
statement = connection.createStatement();
// 4. 执行SQL语句
int i = statement.executeUpdate(sql);
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, statement);
}
}
5.4 TestSelect
@Test
public void testSelect() {
Statement statement = null;
ResultSet resultSet = null;
Connection connection = null;
// 1. 获取数据库连接
connection = JdbcUtil.getConnection();
// 2. 准备SQL语句
String sql = "select * from work";
try {
// 3. 获取Statement对象
statement = connection.createStatement();
// 4. 执行SQL语句,获取的数据时一个查询结果集对象ResultSet
resultSet = statement.executeQuery(sql);
ArrayList<Work> works = new ArrayList<>();
// 5. 这里需要解析ResultSet结果集对象
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String info = resultSet.getString("info");
works.add(new Work(id, name, age, info));
}
for (Work work : works) {
System.out.println(work);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, statement, resultSet);
}
}
-
被逼无奈的封装
package com.qfedu.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;/**
-
JdbcUtil 工具类
-
- 自动完成驱动的加载
-
- 自动完成必要数据的处理
-
- 简化 getConnection方法,提供给开发者使用
-
- 完成统一 close方法
*/
public class JdbcUtil {
private static String url = null;
private static String user = null;
private static String password = null;
private static String driverClass = null;
// 使用static修饰的静态代码块特征,完成驱动的自动加载
static {
try {
// 需要读取在项目目录src下的一个db.properties文件
// 1. 创建一个Properties对象
Properties properties = new Properties();
// 2. 使用load方法,加载文件,需要参数是一个FileInputStream
properties.load(new FileInputStream("./src/db.properties"));// 3. 从Properties对象中读取对应的属性 url = properties.getProperty("url"); user = properties.getProperty("user"); password = properties.getProperty("password"); driverClass = properties.getProperty("driver"); // 4. 加载驱动 Class.forName(driverClass); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
}
/**
-
简化数据库连接对象java.sql.Connection的获取方式,static修饰的静态成员方法
-
直接通过类名调用
-
@return java.sql.Connection Java连接数据库的对象
*/
public static Connection getConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}return connection;
}
/**
- 关数据库连接对象
- @param connection 传入的是一个java.sql.Connection 数据库连接对象
*/
public static void close(Connection connection) {
close(connection, null, null);
}
/**
- 关闭数据库连接对象和Statement SQL语句搬运工对象
- @param connection java.sql.Connection 数据库连接对象
- @param statement java.sql.Statement SQL搬运工对象
*/
public static void close(Connection connection, Statement statement) {
close(connection, statement, null);
}
/**
-
关闭数据库连接对象,Statement SQL语句搬运工对象和ResultSet结果集对象
-
@param connection java.sql.Connection 数据库连接对象
-
@param statement java.sql.Statement SQL搬运工对象
-
@param resultSet java.sql.ResultSet 数据库查询结果集对象
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- 完成统一 close方法
db.properties 存放在项目src目录下
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaee1904?useSSL=true
user=root
password=123456 -
-
Statement SQL注入隐患
Statement是一个SQL语句的搬运工,没有判断SQL和预处理SQL的能力,容易导致SQL注入
-
使用JDBC,PreparedStatement 操作数据库 【重点】
8.1 TestAdd
@Test
public void testAdd() {
Connection connection = JdbcUtil.getConnection();
PreparedStatement preparedStatement = null;
// 1. 准备SQL语句
String sql = "insert into work(name, age, info) values(?,?,?)";
String name = "林妹妹";
int age = 15;
String info = "天上掉下个林妹妹";
try {
// 2.通过Connection 获取 PreparedStatement对象
preparedStatement = connection.prepareStatement(sql);
// 3. 设置参数
preparedStatement.setObject(1, name);
preparedStatement.setObject(2, age);
preparedStatement.setObject(3, info);
// 4. 执行SQL语句
int i = preparedStatement.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement);
}
}
8.2 TestDelete
@Test
public void testDelete() {
Connection connection = JdbcUtil.getConnection();
PreparedStatement preparedStatement = null;
String sql = "delete from work where id = ?";
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, 2);
int i = preparedStatement.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement);
}
}
8.3 TestUpdate
@Test
public void testUpdate() {
Connection connection = JdbcUtil.getConnection();
PreparedStatement preparedStatement = null;
String sql = "update work set name = ?, age = ?, info = ? where
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, "老刘");
preparedStatement.setObject(2, 17);
preparedStatement.setObject(3, "航海中路彭于晏");
preparedStatement.setObject(4, 1);
int i = preparedStatement.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement);
}
}
8.4 TestSelectOne
@Test
public void selectOne() {
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
Connection connection = JdbcUtil.getConnection();
String sql = "select * from work where id = ?";
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, 1);
resultSet = preparedStatement.executeQuery();
Work work = null;
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String info = resultSet.getString("info");
work = new Work(id, name, age, info);
}
System.out.println(work);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement, resultSet);
}
}
8.5 TestSelectAll
@Test
public void selectAll() {
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
Connection connection = JdbcUtil.getConnection();
String sql = "select * from work";
try {
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
ArrayList<Work> works = new ArrayList<>();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String info = resultSet.getString("info");
works.add(new Work(id, name, age, info));
}
for (Work work : works) {
System.out.println(work);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement, resultSet);
}
}