JDBC,即 Java Database Connectivity,Java 数据库连接。是⼀种用于执行 SQL 语句的 Java API,它是 Java 中的数据库连接规范。这个 API 由 java.sql.,javax.sql. 包中的⼀些类和接口组成,它为Java 开发⼈员操作数据库提供了⼀个标准的 API,可以为多种关系数据库提供统⼀访问
简单来说,使用了 JDBC 之后,不管是什么数据库与什么数据库驱动,我们只需要使用⼀套标准代码就可以实现对不同数据库进行统⼀操作(添加、修改、删除、查询),也就解决了我们上面说的那些问题了。
JDBC 为多种关系数据库提供了统⼀访问方式,作为特定厂商数据库访问 API 的⼀种高级抽象,它主要包含⼀些通用的接口类。
(1)是Java语言访问数据库操作的编程,JDBC可以在MYSQL,SQL Server中使用
(2)开发数据库应用不用限定在特定的数据厂商的API
(3)程序的可移植性大大增强
(1)创建⼀个 Java 项⽬,并添加 MySQL 驱动(mysql-connector-java-5.1.47.jar),需要注意不同数据库版本要对应相应的驱动包
(2)双击scr,点击Modules,再点Dependencies,点击+号,选择驱动包,最后点OK
然后点击External libraries,看是否添加好驱动包
操作数据库 MySQL 提供了两种操作 API:
⭐DriverManager
⭐DataSource(推荐使用)
接下来咱们使用DataSource 来实现操作数据库
// 1.创建数据源
MysqlDataSource dataSource = new MysqlDataSource();
// 1.1 设置连接的 MySQL服务器地址
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?
characterEncoding=utf8&useSSL=true");
// 1.2 设置⽤户名
dataSource.setUser("root");
// 1.3 设置密码
dataSource.setPassword("******");
连接对象是 Connection,注意此步骤操作容易出错,⼀定是 com.mysql.jdbc 包下的 Connection 对象
//2,得到连接
Connection Connection connection = (Connection) dataSource.getConnection();
执行器是来执行SQL 命令的,执行器有三种:
Statement
PreparedStatement 是最常用的
CallableStatement
String insertSQL = "insert into book(id,name) values(?,?)";
PreparedStatement statement = connection.prepareStatement(insertSQL);
PreparedStatement 有主要两种重要的⽅法:
⭐executeQuery():方法执行后返回单个结果集的,通常用于 select 语句。
⭐executeUpdate():方法返回值是⼀个整数,指示受影响的行数,通常用于 update、insert、delete 语句。
//添加,删除,更新操作
int num = statement.executeUpdate();//返回受影响的行数
//查询操作
ResultSet resultSet = statement.executeQuery();//得到结果集
关闭数据库连接是为了不浪费 MySQL 服务器端的资源
statement.close();
connection.close();
在数据库libary下操作图书book表
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class AddBook {
public static void main(String[] args)throws SQLException {
//1,得到数据源 DataSource
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/libary?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("******");//密码
//2,得到连接 Connection
Connection connection = (Connection) dataSource.getConnection();
//3,得到执行器,组装SQL
String insertSQL = "insert into book(id,name) values(?,?)";
PreparedStatement statement = connection.prepareStatement(insertSQL);
//填充占位符
statement.setInt(1,4);
statement.setString(2,"三体");
//4,执行SQL
int num = statement.executeUpdate();//返回受影响的行数
System.out.println("受影响的行数" + num);
//5,关闭资源
statement.close();
connection.close();
}
}
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UpBook {
public static void main(String[] args)throws SQLException {
//1,得到数据源
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/libary?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("******");
//2,得到连接
Connection connection = (Connection) dataSource.getConnection();
//3,得到执行器,组装SQL
String updateSQL = "update book set name=? where name=?";
PreparedStatement statement = connection.prepareStatement(updateSQL);
statement.setString(1,"追风筝的人");//填充占位符
statement.setString(2,"论语");
//4,执行SQL
int num = statement.executeUpdate();
System.out.println("受影响行数:" + num);
//5,关闭资源
statement.close();
connection.close();
}
}
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DeBook {
public static void main(String[] args)throws SQLException {
//得到数据源
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/libary?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("******");
//得到连接
Connection connection = (Connection) dataSource.getConnection();
//组装SQL
String delSQL = "delete from book where id=?";
PreparedStatement statement = connection.prepareStatement(delSQL);
statement.setInt(1,3);
//执行SQL
int result = statement.executeUpdate();
System.out.println("结果" + result);
//关闭资源
statement.close();
connection.close();
}
}
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SeBook {
public static void main(String[] args)throws SQLException {
//得到数据源
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/libary?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("zh020621");
//得到连接Connection
Connection connection = (Connection) dataSource.getConnection();
//组装SQL
String seSQL = "select * from book where id";
PreparedStatement statement = connection.prepareStatement(seSQL);
statement.setInt(1,3);
//执行SQL,打印查询的结果【特殊】
ResultSet resultSet = statement.executeQuery();//得到结果集
while(resultSet.next()){//结果集有下一行的话
// 每次循环可以得到一行数据
Book book = new Book();
// resultSet.getInt("id") 查询当前行中列名为“id”的值
book.setId(resultSet.getInt("id"));
book.setName(resultSet.getString("name"));
System.out.println(book);
}
//关闭资源【特殊】
resultSet.close();
statement.close();
connection.close();
}
}
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
(1)通过DataSource(数据源)对象获取,实际应用使用DataSource多
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();
(2)通过DriverManager(驱动管理类)的静态方法获取
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
注意:DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象
Statement接口提供了执行语句和获取结果的基本方法;
(1)支持普通的不带参的查询SQL;
(2)支持批量更新,批量删除;
(3)默认情况下,同一时间每个Statement对象只能打开一个Resultset对象
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套方法提供了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环
例如:查询操作时就会用到ResultSet
ResultSet resultSet = statement.executeQuery();//得到结果集
while(resultSet.next()){
// 每次循环可以得到一行数据
Book book = new Book();
book.setId(resultSet.getInt("id"));
book.setName(resultSet.getString("name"));
System.out.println(book);
}