文章目录
- 一、什么是Java的JDBC
- 二、JDBC编程
- 三、代码整体展示
一、什么是Java的JDBC
JDBC,即Java Database Connectivity。意思是java数据库连接。是一种用来执行 SQL 语句的 JavaAPI,是Java中数据库的连接规范。这个 API 由 java.sql* 和 javax.sql* 包中的类和接口组成,可以为多种关系数据库提供统一访问。
JDBC的工作原理
JDBC优势:
- JAVA语言访问数据库操作完全面向抽象类接口编程。
- 开发数据库应用不用限定在特定的数据库厂商的 API。
- 程序的可移植性大大增强。
二、JDBC编程
-
编程前准备
前面我们知道,要进行 JDBC 编程需要使用 JavaAPI 和数据库进行连接。所以在进行编程之前需要先导入相应的 .jar 包。如下图所示:
(本人这里使用的是 idea 编译器)
经过上面操作就可以进行编程了。 -
代码实现
- 创建 DateSource 数据库,描述 mysql 在什么位置
DataSource dataSource = new MysqlDataSource();
//设置数据库所在的位置,端口以及数据库名
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
注: 如上图所示,这里是一个向下转型,在后续的代码中使用的是 DataSource 类型的实例。
上面的四行代码,我们最需要注意的是第二句,如图:
这里的 IP 地址在解释一下:我们各自电脑的 IP 地址可能不同,但在这里统一写作 127.0.0.1。这是一个特殊的 IP 地址,叫做 “环回IP” 表示主机自己。只要数据库服务器和 JDBC 程序在同一个电脑,就可以使用这个 IP 地址。
- 和数据库建立连接
Connection connection = dataSource.getConnection();
//通过控制台来输入信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号:");
int id = scanner.nextInt();
System.out.println("请输入姓名:");
String name = scanner.next();
如图所示,这里的 connection 选择划红线的呢一个。
- 构造 sql 语句
这里的构造有两种方式
第一种:直接使用字符串语句录入
String sql = "insert into student values("+ id +",'"+ name + "')";
//jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况
PreparedStatement statement = connection.prepareStatement(sql);
这种形式的代码比较难以阅读,不好理解。此外,这个代码也是比较容易引起“SQL 注入攻击”。
这也是一种入侵服务器的方式,假设输入name时这样操作:"); drop table … 这样就会删除后面的内容,造成很大的影响。
第二种:使用 PreparedStatement 通过占位符替换的方式,来实现动态 sql 构造。
String sql = "insert into student values(?,?)";
//jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("sql:" + statement);
上述的形式相对而言更加靠谱,需要注意的是,上面(?,?) 这个地方不是从 0 开始,而是从 1 开始计算。
注意,这里要选择红框中的这个关键字。
- 执行SQL
使用 executeUpdate 执行增删改
//4. 执行 sql,针对 增,删,改,使用 executeUpdate 来执行
// 查,使用 executeQuery 来执行
// 这里返回的含义是,这里的操作影响了几行
int ret = (int) statement.executeLargeUpdate();
System.out.println("ret = " + ret);
使用 executeQuery 执行查
注:这里的查操作存在于单独的一个类中
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectDemo {
public static void main(String[] args) throws SQLException {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("wjh123456");
Connection connection = dataSource.getConnection();
String sql = "select*from student";
PreparedStatement statement = connection.prepareStatement(sql);
//实现查操作
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()){
//next 相当于移动一下光标,光标指向下一行
//获取到每一列
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + ":"+ name);
}
//释放资源
resultSet.close();
statement.close();
connection.close();
}
}
如图所示,光标所指的位置就是数据表的第一行,每次读取后向下移动一个。
- 释放资源
statement.close();
connection.close();
这里要注意的是,我们先连接(connection)了数据库,再构造了(statement)对象。但是这里的顺序为什么要先关闭 statement 在关闭 connection?
如图所示:
这里要进入家中顺序是:大门 -> 二门
出家门的顺序是:二门 -> 大门
所以不难理解,这里的关闭顺序是:先创建后关闭。
三、代码整体展示
实现增删改操作的代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCinsertDemo {
public static void main(String[] args) throws SQLException {
//实现 JDBC 编程的步骤
//1. 先创建 DataSource 数据库,描述了 mysql 在哪
DataSource dataSource = new MysqlDataSource();
//设置数据库所在的位置,端口以及数据库名
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("wjh123456");
//2. 和数据库建立连接
Connection connection = dataSource.getConnection();
//通过控制台来输入信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号:");
int id = scanner.nextInt();
System.out.println("请输入姓名:");
String name = scanner.next();
//3. 构造 sql 语句
//不安全
//String sql = "insert into student values("+ id +",'"+ name + "')";
String sql = "insert into student values(?,?)";
//jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("sql:" + statement);
//4. 执行 sql,针对 增,删,改,使用 executeUpdate 来执行
// 查,使用 executeQuery 来执行
// 这里返回的含义是,这里的操作影响了几行
int ret = (int) statement.executeLargeUpdate();
System.out.println("ret = " + ret);
//5. 断开连接,释放资源
statement.close();
connection.close();
}
}
运行展示:
添加元素前:
添加元素:
注:这里的删除,修改操作只需要修改 sql后的语句即可。
要注意的仍然是针对 增,删,改,使用 executeUpdate 来执行。
实现查找操作的代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectDemo {
public static void main(String[] args) throws SQLException {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("wjh123456");
Connection connection = dataSource.getConnection();
String sql = "select*from student";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()){
//next 相当于移动一下光标,光标指向下一行
//获取到每一列
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + ":"+ name);
}
//释放资源
resultSet.close();
statement.close();
connection.close();
}
}
运行结果:
与添加的元素情况一致,查找成功!