目录
JDBC的概述
JDBC: JDBC(Java DataBase Connectivity Java数据库连接)就是使用java语言操作关系型数据库的一套API.
实际开发中, sql很少是手动去的输入的, 绝大多数的sql都是通过代码自动执行的, 这就需要我们使用其他编程语言来操作数据库服务器.在之前的文章中,我们是通过MySQL客户端访问MySQL服务器的,通过JDBC我们可以在 idea 上访问操作MySQL数据库或者其他任意的数据库,无需再打开数据库客户端
如果我们想要进行数据库开发,在项目中导入对应数据库的驱动包后,即可编写代码
JDBC的配置
安装驱动包
地址:Maven Repository: mysql » mysql-connector-java (mvnrepository.com)
电脑上安装的MySQL数据库是多少版本,就选择相同的版本号,此处我选择 5 版本
第二步,下载
下载完成
创建项目
打开idea新建项目,并创建好 lib 目录,将jar包粘贴进去
右键jar包,将其添加为库 Add as Library
点击确定,此时jar包就可以被idea解析了
JDBC的使用
书写JDBC的固定步骤
1.创建并初始化数据源
创建一个dataSource对象,此处实现了向上转型
DataSource dataSource = new MysqlDataSource();
为了能够调用方法,需重新向下转型为MysqlDataSource
然后设置 唯一资源定位符,用户名,MySQL密码
// 1.创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl
("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
此时我们数据源创建的操作, 只是去描述了下服务器在那里, 访问哪个数据库, 编码方式是什么, 登陆账号密码是什么等等, 但还没有真正进行连接访问, 下面进行的连接操作, 是真正开始通过网络进行通信.
2.与数据库服务器建立连接
// 2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
创建好数据源DataSource
对象后, 调用该对象的getConnection()
方法, 获取java.sql.Connection
对象, 此时就可以与数据库建立连接了.
3.构造SQL语句
// 3.构造SQL语句
String sql = "insert into jdbc values(1,'王五')"; // 写入SQL语句
// 预处理sql语句
// 对SQL语句进行预解析,减少服务器负荷
PreparedStatement statement = connection.prepareStatement(sql);
statement = connection.prepareStatement(sql);
connection 对象通过 prepareStatement(sql) 方法将 SQL 语句包装成 prepareStatement 对象,再用statement 来接收.
4.执行SQL语句
// 4.执行SQL语句
int ret = statement.executeUpdate(); // 返回一个int类型,表示受到影响的行数
System.out.println("ret = " + ret);
如果要执行的sql语句操作是 insert delete update 则使用executeUpdate()方法,返回值为受到影响的行数
如果要执行的sql语句是 select 则使用 executeQuery
方法执行,返回值是一个ResultSet
结果表对象, 其中储存了查询到的的结果, 我们可以通过遍历该结果表来获取查询到的数据.
5.释放必要的资源
// 5.释放必要的资源
statement.close();
connection.close();
释放资源, 我们执行完毕sql语句后需要及时地将资源释放, 在JDBC编程中, 最常见需要释放的类或接口有三个, 分别是Connection
, PreparedStatement
, ResultSet
, 要注意的是释放资源的顺序和开启资源的的顺序是相反的, 也就是先开启的要后释放
完整代码及运行结果
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.sql.Statement;
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
// JDBC 需要通过以下步骤来完成开发
// 1.创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl
("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
// 2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
// 3.构造SQL语句
String sql = "insert into jdbc values(1,'王五')"; // 写入SQL语句
// 预处理sql语句
PreparedStatement statement = connection.prepareStatement(sql); // 对SQL语句进行预解析,减少服务器负荷
// 4.执行SQL语句
int ret = statement.executeUpdate(); // 返回一个int类型,表示受到影响的行数
System.out.println("ret = " + ret);
// 5.释放必要的资源
statement.close();
connection.close();
}
}
6.优化构造SQL语句
在第四点构造SQL语句中,我们是把SQL语句写死的,
在实际情况中我们是需要让用户自己输入的,是不确定具体哪些值的,因此需要进行优化
读取用户键盘输入的信息:
我们可以将SQL语句中的值都替换为 ? , ? 是占位符 如下
然后再通过statement里的各自 setXXXX方法 来逐个设置占位符的内容
参数1表示第几个占位符,参数2表示设置的内容
最后也可打印出SQL语句查看是否正确
最终结果:
完整代码:
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.sql.Statement;
import java.util.Scanner;
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
// JDBC 需要通过以下步骤来完成开发
// 1.创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl
("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
// 2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
// 3.构造SQL语句
Scanner scanner = new Scanner(System.in);
System.out.println("请输入id: ");
int id = scanner.nextInt();
System.out.println("请输入名字: ");
String name = scanner.next();
String sql = "insert into jdbc values(?,?)"; // 写入SQL语句
// 预处理sql语句
PreparedStatement statement = connection.prepareStatement(sql); // 对SQL语句进行预解析,减少服务器负荷
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("sql: " + statement);
// 4.执行SQL语句
int ret = statement.executeUpdate(); // 返回一个int类型,表示受到影响的行数
System.out.println("ret = " + ret);
// 5.释放必要的资源
statement.close();
connection.close();
}
}
7.JDBC修改操作
修改数据只需要修改SQL语句即可,整体代码与插入操作一致
如图: 为id = 2 的同学改名
8.JDBC删除操作
删除数据同样只需要修改SQL语句即可,整体代码与插入操作一致
删除 id = 2 的同学的数据
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.sql.Statement;
import java.util.Scanner;
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
// JDBC 需要通过以下步骤来完成开发
// 1.创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl
("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
// 2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
// 3.构造SQL语句
Scanner scanner = new Scanner(System.in);
System.out.println("请输入id: ");
int id = scanner.nextInt();
System.out.println("请输入名字: ");
String name = scanner.next();
String sql = "delete from jdbc where id = ?"; // 写入SQL语句
// 预处理sql语句
PreparedStatement statement = connection.prepareStatement(sql); // 对SQL语句进行预解析,减少服务器负荷
statement.setInt(1,id);
//statement.setString(1,name);
System.out.println("sql: " + statement);
// 4.执行SQL语句
int ret = statement.executeUpdate(); // 返回一个int类型,表示受到影响的行数
System.out.println("ret = " + ret);
// 5.释放必要的资源
statement.close();
connection.close();
}
}
9.JDBC查询操作
其余步骤一致,区别在于第四个步骤
在增,删,改操作中,我们使用的是 statement.executeUpdate() 方法
而在查询操作中,我们使用的是 statement.executeQuery() 方法,返回的是一个 ResultSet 对象,我们可以把它想象成一个表格,因此我们要实例化一个 resultSet 来接收它
同时这个表格里会有一个光标,停留在表格第一行数据的上一行,当我们使用next()方法后,光标就会指向下一行数据(第一行数据),存在内容,就开始读取,直到下一行为null,因此通过while循环来实现
然后再通过resultSet.getXXXX()方法获取每一行中的每一列的数据,参数就是数据库表的列名
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 JDBCSelect {
public static void main(String[] args) throws SQLException {
//1.创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl
("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2.与数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.构造SQL语句
String sql = "select * from jdbc";
PreparedStatement statement = connection.prepareStatement(sql);
//4.获取查询结果
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + " name = " + name);
}
//5.释放资源
resultSet.close();
connection.close();
statement.close();
}
}