JDBC编程
1.程序是怎么操作数据库的?
使用程序只所以能操作数据库,主要是因为数据库厂商提供了操作的 API,也就是数据库驱动,驱使数据库行动起来,就是数据库驱动,不光是程序,向我们之所以能通过命令行操作 MySQL,也是因为MySQL 的数据库驱动,对于操作界面来说,数据库驱动就是:
输入的命令就是 MySQL 数据驱动的一部分。
数据库驱动包含了数据库操作 API,它们的关系如下:
2.什么是 JDBC?
JDBC 定义
java数据库连接。它是java API 提供了一种规范,目的是用这套规范实现不同数据库之间的统一访问 。
JDBC,即 Java Database Connectivity,Java 数据库连接。是一种用于执行 SQL 语句的 Java API,它是 Java 中的数据库连接规范。这个 API 由 java.sql.,javax.sql. 包中的一些类和接口组成,它为 Java 开发人员操作数据库提供了一个标准的 API,可以为多种关系数据库提供统一访问。
简单来说,使用了 JDBC 之后,不管是什么数据库与什么数据库驱动,我们只需要使用一套标准代码就可以实现对不同数据库进行统一操作(添加、修改、删除、查询),也就解决了我们上面说的那些问题了。
JDBC 工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问 API 的一种高级抽象,它主要包含一些通用的接口类。
JDBC 访问数据库层次结构:
JDBC 优势:
Java 语言访问数据库操作完全面向抽象接口编程。
开发数据库应用不用限定在特定数据库厂商的 API。
程序的可移植性大大增强。
3.JDBC 使用
JDBC 操作步骤如下。
3.1 创建项目并添加 MySQL 驱动
1.创建一个 Java 项目,并添加 MySQL 驱动(mysql-connector-java-5.1.47.jar),需要注意不同数据库版本要对应相应的驱动包。
双击src项目(空项目),如图操作:
也可以进入项目设置目录:
操作步骤:点击项目属性 -> Modules -> Dependencies -> 点击“+”号 -> 1.Jars or directories -> 选择驱动包 -> 点击 OK 确认。
找到下载的jar包的路径:
查看是否添加成功,如果有,说明MySQL jar 包已经成功加入到项目中了:
3.2 使用代码操作数据库
操作数据库 MySQL 提供了两种操作 API:
DriverManager
DataSource(推荐使用)
接下来咱们使用 DataSource 来实现操作数据库。
使用代码操作数据库分为以下 5 个步骤:
1.获取数据源(DataSource)(准备工作,点击 MySQL 连接工具,并输入用户名、密码)
// 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("12345678");
2.获取连接(Connection)(敲击回车试图建立客户端和服务器端的连接)
连接对象是 Connection,注意此步骤操作容易出错,一定是 com.mysql.jdbc 包下的 Connection 对象:
Connection connection = (Connection) dataSource.getConnection();
3.获取执行器(连接到服务器并切换到数据库)
执行器是用来执行 SQL 命令的,执行器有三种:
Statement
PreparedStatement
CallableStatement
实际开发中最常用的是 PreparedStatement 对象,PreparedStatement 优点如下:
连接对象是 PreparedStatement,注意此步骤操作容易出错,一定是 java.sql 包下的 PreparedStatement 对象:
//3.得到执行器(组装SQL)
String insertSQL = "insert into city(id,name) values(?,?)";//组装SQL,使用占位符"?"
PreparedStatement statement = connection.prepareStatement(insertSQL);
//填充占位符
statement.setInt(1,4);
statement.setString(2,"深圳");
PreparedStatement 有主要两种重要的方法:
executeQuery():方法执行后返回单个结果集的,通常用于 select 语句。
executeUpdate():方法返回值是一个整数,指示受影响的行数,通常用于update、insert、
delete 语句。
4.查询或操作数据库(输入命令,并得到结果)
查询数据库使用PreparedStatement.executeQuery 方法,返回一个 ResultSet 对象,具体实现代码如下:
int result = statement.executeUpdate();//返回一个受影响的行数
System.out.println("受影响的行数:" + result);
5.关闭连接(关闭客户端)
//5.关闭资源
statement.close();//关闭执行器
connection.close();//关闭连接
例:
添加操作示例:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class AddCity {
public static void main(String[] args) throws SQLException {
//1.获得数据源DataSource(设置MySQL的服务器地址)
MysqlDataSource dataSource = new MysqlDataSource();
//1.1设置连接的MySQL服务器
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
//1.2设置连接MySQL的用户名
dataSource.setUser("root");
//1.3设置密码
dataSource.setPassword("12345678");
//2.得到链接Connection
Connection connection = (Connection) dataSource.getConnection();
//3.得到执行器(组装SQL)
String insertSQL = "insert into city(id,name) values(?,?)";//组装SQL,使用占位符"?"
PreparedStatement statement = connection.prepareStatement(insertSQL);
//填充占位符
statement.setInt(1,5);
statement.setString(2,"宝鸡");
//4.执行SQL
int result = statement.executeUpdate();//返回一个受影响的行数
System.out.println("受影响的行数:" + result);
//5.关闭资源
statement.close();//关闭执行器
connection.close();//关闭连接
}
}
修改操作示例:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Upcity {
public static void main(String[] args) throws SQLException {
//1.获得数据源DataSource
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("12345678");
//2.得到链接Connection
Connection connection=(Connection) dataSource.getConnection();
//3.组装SQL,得到执行器
String updataSQL="update city set name = ? where id =?";
PreparedStatement statement = connection.prepareStatement(updataSQL);
statement.setString(1,"广东");
statement.setInt(2,4);
//4.执行SQL,得到执行结果
int result = statement.executeUpdate();//返回一个受影响的行数
System.out.println("受影响的行数:" + result);
//5.关闭资源
statement.close();//关闭执行器
connection.close();//关闭连接
}
}
删除操作示例:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Decity {
public static void main(String[] args) throws SQLException {
//1.得到数据源DataSource
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("12345678");
//2.得到连接Connection
Connection connection= dataSource.getConnection();
//3.组装SQL,得到执行器
String deleteSQL="delete from city where id = ?";
PreparedStatement statement = connection.prepareStatement(deleteSQL);
statement.setInt(1,5);
//4.执行SQL,得到执行结果
int result = statement.executeUpdate();
System.out.println("执行结果:"+result);
//5.关闭资源
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 SelCity {
public static void main(String[] args) throws SQLException {
//1.得到DataSource
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java33?characterEncoding=utf8&useSSL=true");
dataSource.setUser("root");
dataSource.setPassword("12345678");
//2.得到Connection
Connection connection= (Connection) dataSource.getConnection();
//3.得到执行器,组装SQL
String selectSQL="selece * from city where id<?";
PreparedStatement statement= connection.prepareStatement(selectSQL);
statement.setInt(1,10);
// 4.执行SQL,打印查询的结果【特殊】
ResultSet resultSet=statement.executeQuery();//得到结果集
while(resultSet.next()){//如果结果集的下一行有数据的话
//每次循环可以得到一行数据
City city=new City();
//resultSet.getInt("id")--->查询当前行中列名为“id”的值
city.setId(resultSet.getInt("id"));
city.setName(resultSet.getString("name"));
//打印city对象
System.out.println(city);
}
//5.关闭资源【特殊】
resultSet.close();
statement.close();
connection.close();
}
}