目录
1.JDBC工作原理
JDBC
为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问
API
的一种高级抽象,它主要包含一些通用的接口类。
1)JDBC 访问数据库层次结构
2)JDBC 优势:
Java 语言访问数据库操作完全面向抽象接口编程开发数据库应用不用限定在特定数据库厂商的 API程序的可移植性大大增强
2. JDBC使用
2.1 JDBC 配置
1)准备数据库驱动包
2)在项目中创建文件夹
lib
,并将依赖包
mysql-connector-java-5.1.49.jar
复制到
lib
中。
3)右键 lib目录,点击 add as library
点击这个选项,才能把jar包引入到项目中,此时项目才会从jar里面读取内部的 .class文件,否则代码就找不到jar中的一些类。
再配置该
jar包到本项目的依赖中:右键点击项目Open Module Settings
,在
Modules
中,点击项目,配置 Dependencies,点击
+
,
JARS or Directories
,将该
lib
文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖。
3.代码编程
1)创建好数据源
创建DataSource 对象,这个对象描述了数据库服务器在什么地方
///1.创建好数据源
DataSource dataSource = new MysqlDataSource();
//设置数据库所在地址
((MysqlDataSource) dataSource).setUrl();
//设置数据库的而用户名
((MysqlDataSource) dataSource).setUser();
//设置数据库的额密码
((MysqlDataSource) dataSource).setPassword();
2)与数据库服务器建立连接
Connection connection = dataSource.getConnection();
3)操作数据库
关键在于构造一个 SQL语句 在JDBC中构造SQL,不必带上; ;只是在命令中用来区分不同的语句,现在是直接在代码中操作
String sql = "insert into student values (?, ?)";
// 此处光是一个 String 类型的 sql 还不行, 需要把这个 String 包装成一个 "语句对象"
PreparedStatement statement = connection.prepareStatement(sql);
4)执行SQL
SQL 里面如果是 insert, update, delete, 都使用 executeUpdate 方法。 SQL 里面如果是 select, 则使用 executeQuery 方法。 返回值就表示这个操作, 影响到了 几行. 就相当于在控制台里输入 sql 之后, 得到的数字
int ret = statement.executeUpdate();
System.out.println(ret);
5)释放资源
SQL 已经执行完毕. 然后还需要释放资源
statement.close();
connection.close();
6)在MySQL中键student 表
如果不建表的话,会执行失败
7)验证
idea 控制台执行增入一个
来看MySQL表中的数据
3.1 代码优化
通过控制台,我们可以输入直接想要的数据
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 TestJDBC {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
// 1. 创建好数据源
DataSource dataSource = new MysqlDataSource();
// 设置数据库所在的地址
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
// 设置登录数据库的用户名
((MysqlDataSource) dataSource).setUser("root");
// 这个是设置登录数据库的密码
((MysqlDataSource) dataSource).setPassword("");
// 2. 让代码和数据库服务器建立连接~~ 相当于到达了菜鸟驿站
Connection connection = dataSource.getConnection();
// 2.5 让用户通过控制台输入一下待插入的数据.
System.out.println("请输入学号: ");
int id = scanner.nextInt();
System.out.println("请输入姓名: ");
String name = scanner.next();
// 3. 操作数据库. 以插入数据为例.
// 关键所在就是构造一个 SQL 语句~
// 在 JDBC 中构造的 SQL, 不必带上 ;
// ; 只是在命令行中用来区分不同的语句. 现在是直接在代码中操作
String sql = "insert into student values(?, ?)";
// 此处一个 String 类型的 sql 还不行, 需要把这个 String 包装成一个 "语句对象"
PreparedStatement statement = connection.prepareStatement(sql);
// 进行替换操作.
statement.setInt(1, id);
statement.setString(2, name);
System.out.println("statement: " + statement);
// 4. 执行 SQL , 相当于扫码取件
// SQL 里面如果是 insert, update, delete, 都使用 executeUpdate 方法.
// SQL 里面如果是 select, 则使用 executeQuery 方法.
// 返回值就表示这个操作, 影响到了 几行. 就相当于在控制台里输入 sql 之后, 得到的数字~
int ret = statement.executeUpdate();
System.out.println(ret);
// 5. 此时 SQL 已经执行完毕. 然后还需要释放资源.
statement.close();
connection.close();
}
}
运行结果
数据库保存的数据
4. JDBC常用接口和类
4.1 JDBC API
在
Java JDBC
编程中对数据库的操作均使用
JDK
自带的
API
统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API
(位于
java.sql
包下)即可掌握
Java
数据库编程。
4.2 数据库连接Connection
Connection
接口实现类由数据库提供,获取
Connection
对象通常有两种方式:
1)一种是通过
DriverManager
(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connectionconnection = DriverManager.getConnection(url);
2) 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象
DataSourceds=newMysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connectionconnection = ds.getConnection();
以上两种方式的区别是:
1. DriverManager 类来获取的 Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过 connection.close() 都是关闭物理连接。2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接 是可以复用的,每次使用完数据库连接,释放资源调用 connection.close() 都是将Conncetion 连接对象回收。
4.3 Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。
主要掌握两种执行SQL的方法:
executeQuery() 方法执行后返回单个结果集的,通常用于 select 语句executeUpdate() 方法返回值是一个整数,指示受影响的行数,通常用于 update 、 insert 、 delete语句
4.4 ResultSet对象
ResultSet
对象它被称为结果集,它代表符合
SQL
语句条件的所有行,并且它通过一套
getXXX
方法提供了对这些行中数据的访问。
ResultSet
里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet
的
next()方法 ,
如果我们想要得到
ResultSet
里的所有记录,就应该使用
while
循环。
5. 应用案例
5.1 删除操作
步骤是一样的
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 JDBCDelete {
public static void main(String[] args) throws SQLException {
//删除数据库中的记录
//让用户输入一个 ID, 根据ID 来删除
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
//2.建立连接
Connection connection = dataSource.getConnection();
//3.用户输入 id
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个要删除的 id: ");
int id = scanner.nextInt();
//4.拼接sql语句
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
//5.执行sql
int ret = statement.executeUpdate();
System.out.println("ret= " + ret);
//6.回收释放资源
statement.close();
connection.close();
}
}
在数据库中也显示成功了
5.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.util.Scanner;
public class JDBCUpdate {
public static void main(String[] args) throws SQLException {
// 根据 id 来修改学生姓名. 让用户输入 要修改的 id, 以及对应的修改后的名字.
//1.创建数据库源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
//2.和数据库建立连接
Connection connection = dataSource.getConnection();
//3.输入信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要修改的学生id:");
int id = scanner.nextInt();
System.out.println("将名字修改成:");
String name = scanner.next();
//4.拼装SQL
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2, id);
System.out.println("statement" + statement);
//5.执行sql
int ret = statement.executeUpdate();
System.out.println("ret= " + ret);
//回收资源
statement.close();
connection.close();
}
}
运行结果
5.3 查询操作
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/java102?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
//2.建立数据库连接
Connection connection = dataSource.getConnection();
//3.拼装SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行sql, 查询需要使用 executeQuery
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集合(返回临时表),先获取每一行,在获取每一行的若干类
while (resultSet.next()) {
//当前行获取当前列
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id= " + id + "name= " +name);
}
//6.释放资源
resultSet.close();
statement.close();
connection.close();
}
}
查询结果