文章目录
数据库编程(JDBC)
1.数据库编程:JDBC
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.
2.数据库编程的必备条件
- 编程语言,如Java,C、C++、Python等
- 数据库,如Oracle,MySQL,SQL Server等
- 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,要基于Java操作MySQL即需要该驱动包。同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc.
3.JDBC工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类.
4.JDBC优势
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
5.下载jar包的方式
6.JDBC的使用(jar包的导入)
- 准备数据库驱动包(jar包),并添加到项目的依赖中:过程如下图
如果在代码中能够访问到里面的类,就算导入成功了。
如果像这样就算导入成功了
7. JDBC使用步骤
JDBC中提供了两套API,这里使用DataSource对象。
1.创建DataSource对象(准备工作);
2.基于DataSource对象,创建Connection对象和数据库建立连接(这相当于在系统自带的客户端中,打开了客户端,输入了密码,连接成功了);
3.PrepareStatement对象拼装具体的SQL语句(这相当于在客户端中输入SQL语句的过程)
4.拼装好SQL之后,需要执行SQL (这相当于在客户端中敲下回车,此时SQL就被发到服务器了)
5.查看服务器返回的结果(这相当于在客户端显示出结果)
6.关闭连接,释放资源(这相当于退出客户端)
看完整代码之前,先对下图中的这句代码了解一下,它关系到数据库的访问能否成功,不需要记,用的时候复制粘贴过去即可,但是要特别注意需要注意的地方。
7.1 通过JDBC执行插入操作
通过JDBC来插入数据的完整代码如下:细节都在注释中,懂的可自行忽略哦~~
package java2021_1031;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* Created by Sun
* Description:《JDBC之插入insert:通过JDBC来插入数据》
*/
public class TestJDBCInsert {
public static void main(String[] args) throws SQLException {
//1.创建DataSource对象 (DataSource对象的生命周期应该是要跟随整个程序,即一个应用程序只要创建一个DataSource对象就ok了)
DataSource dataSource = new MysqlDataSource();
//接下来需要针对dataSource进行一些配置,以便后面能够顺利的访问到数据库服务器
//数据库的基本配置:主要配置三方面信息,URL、User、Password 需要进行向下转型
//配置URL:网址
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java2021_1031?characterEncoding=utf-8&useSSL=true");
//配置User:用户名
((MysqlDataSource) dataSource).setUser("root");
//配置Password:密码
((MysqlDataSource) dataSource).setPassword("root");//这里的密码跟数据库中的密码一致
//2.建立连接(和数据库建立连接)
//上面数据库的相关参数都配置好了,直接调用getConnection(),就表示和数据库建立连接
Connection connection = dataSource.getConnection();//getConnection()这个操作,将会得到一个Connection(连接)对象,要选择 java.sql这个包
//这个连接建立好之后就会给数据库发送一些请求,然后数据库会做出一些回应,就表示连接就建立好了。建立连接好了之后就可以进行后续的数据传输了。
//理解建立连接:相当于生活中的打电话,你拨通之后,对方给你一个回应,确认双方信号良好,就可以进行正常通话了,这也就表示连接建立成功了。
//connection的生命周期是比较短的,每次请求都可以创建一个新的connection
//每个请求是指:每次你要给服务器发一个请求,如每次访问数据库,都可以创建一个新的connection,当然,也可以一个connection反复去用。
//3.拼装SQL,这里要用到PrepareStatement对象
//先以插入数据为例,进行展示
/*String sql = "insert into student values (1,'重楼',101)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);*/
//上面这两句代码中要插入的数据内容都是写死的,其实也可以让程序在运行时获取到,可以动态的拼接进去,如下面这样的代码
int id = 1;
String name = "重楼";
int classid = 10;
//?是一个占位符,可以把具体的变量的值替换到?的位置
String sql = "insert into student values(?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);//进行拼装
preparedStatement.setInt(1,id);//下标替换
preparedStatement.setString(2,name);
preparedStatement.setInt(3,classid);
//这里的1,2,3相当于?的下标(下表从1开始算)
System.out.println("preparedStatement:"+preparedStatement);//打印拼装之后的效果
//4.拼装完毕之后,就可以执行SQL了
int ret = preparedStatement.executeUpdate();//执行修改语句,executeUpdate()返回的值的类型是int类型,这个返回值表示此次操作完成时候修改了多少行
//像insert delete update 操作都是用executeUpdate()方法来执行
//如果是select 的话就是用executeQuery来执行
System.out.println("ret:"+ret);//打印修改之后的效果
//5.执行完毕之后,关闭释放相关资源
preparedStatement.close();//释放语句
connection.close();//释放连接
//释放语句和释放连接这两句的释放顺序也不能错,一定是后创建的先被释放,连接先创建的所以后释放
//JDBC的代码看起来麻烦,但是写多了之后就会发现都是固定的套路,都是这一套代码,里面的基本代码都是固定代码。
//运行一次客户端就会插入一次
}
}
7.2 通过JDBC执行查找操作
通过JDBC来查找数据的完整代码如下:
package java2021_1031;
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;
/**
* Created by Sun
* Description:《JDBC之查找select:通过JDBC来查找数据》
*1.创建DataSource对象
*2.创建Connection对象,和数据库建立连接
*3.借助prepareStatement 拼装SQL语句
*4.执行SQL语句
*5.遍历结果集:插入没有结果只需插入就行了,但是查找操作会得到一系列的结果集,
* 这个结果集相当于是一张临时表,我们需要知道这张表里面都有哪些数据,需要把数据都能够获取到,所以这里需要遍历结果集。
*6.关闭释放资源
*/
public class TestJDBCSelect {
public static void main(String[] args) throws SQLException {
// 1.创建DataSource对象
DataSource dataSource = new MysqlDataSource();
//向下转型, 设置URL、用户名、密码
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java2021_1031?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("root");
// 2.创建Connection对象,和数据库建立连接
Connection connection = dataSource.getConnection();
// 3.借助prepareStatement 拼装SQL语句
String sql = "select * from student";//拼装SQL语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);//进行拼装
// 4.执行SQL语句
ResultSet resultSet = preparedStatement.executeQuery();//执行查询语句,executeQuery()返回的值的类型是ResultSet类型,它表示select 查找结果的结果集
//换句话说就是select查询的结果全都包含在ResultSet对象中,通过这个对象就可以去获取结果集。
// 5.遍历结果集
/*遍历结果集和使用迭代器遍历集合类有点像,结果集相当于一张表,这个表里有很多行,每一行是一条记录,每一行又包含很多列
* next()操作:一方面是判定当前是否存在下一行,另一方面如果存在下一行就获取当前行
* 可以直观的把resultSet对象想象成是一个“光标”,初始情况下resultSet的光标不指向任何记录,第一次调用next就会判定当前结果集是否为空
* 如果为空,直接next就返回false,如果非空,next就会返回true,同时让光标指向第一行记录。
* 后续再循环执行到next,仍然是先判定下一行是否存在,不存在,就返回false,存在就返回true,同时让光标指向下一行记录,直到返回false循环结束*/
while(resultSet.next()){ //由于不知道结果集有多少行,可以使用while循环
//resultSet的光标指向了当前行,就可以把当前行中的列数据都获取到,注意列数据的类型
int id = resultSet.getInt("id");//此处参数中写的列名必须和数据库表结构中的列名完全一致
String name = resultSet.getString("name");
int classid = resultSet.getInt("classid");
System.out.println("id:"+id+" name:"+name+" classid:"+classid);
}
// 6.关闭释放资源
resultSet.close();
preparedStatement.close();
connection.close();
//释放语句和释放连接这两句的释放顺序也不能错,一定是后创建的先被释放,连接先创建的所以后释放
}
}
7.3 通过JDBC执行删除操作
通过JDBC来删除数据的完整代码如下:
package java2021_1031;
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;
/**
* Created by Sun
* Description:《JDBC值删除delete:通过JDBC来删除数据》
*/
public class TestJDBCDelete {
public static void main(String[] args) throws SQLException {
//通过Scanner把要删除的学生姓名输入进去
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要删除的学生姓名:");
String name = scanner.next();
//1.创建DataSource对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java2021_1031?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("root");
//2.建立连接
Connection connection = dataSource.getConnection();
//3.拼装SQL
String sql = "delete from student where name = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,name);//下标替换,设置内容
//4.执行SQL
int ret = preparedStatement.executeUpdate();
if(ret == 1){
System.out.println("删除成功!");
}else{
System.out.println("删除失败~");
}
//5.关闭并释放资源
preparedStatement.close();
connection.close();
}
}
7.4 通过JDBC执行修改操作
通过JDBC来修改数据的完整代码如下:
package java2021_1031;
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;
/**
* Created by Sun
* Description:《JDBC之修改update:通过JDBC来修改数据》
*/
public class TestJDBCUpdate {
public static void main(String[] args) throws SQLException {
//让用户输入id为n的学生的姓名
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要修改的学生id:");
int id = scanner.nextInt();
System.out.println("请输入要修改的学生姓名:");
String name = scanner.next();
//1.创建DataSource对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java2021_1031?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("root");
//2.建立连接
Connection connection = dataSource.getConnection();
//3.拼装SQL
String sql = "update student set name = ? where id = ? ";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,name);//下标替换,设置内容
preparedStatement.setInt(2,id);
//4.执行SQL
int ret = preparedStatement.executeUpdate();
if(ret == 1){
System.out.println("修改成功");
}else{
System.out.println("修改失败~");
}
//5.关闭并释放资源
preparedStatement.close();
connection.close();
}
}
8.JDBC编程中主要用到的类/对象
- DataSource:用于配置如何连接MySQL
- Connection:表示建立好的一次连接(操作数据库之前需要先建立连接)
- PrepareStatement:对应到一个SQL语句
- ResultSet:表示select 查找结果的结果集
9.JDBC使用步骤总结
- 创建数据库连接Connection
- 创建操作命令Statement
- 使用操作命令来执行SQL
- 处理结果集ResultSet
- 释放资源
1.创建数据库连接Connection
- DriverManager创建
- DataSource获取
2.创建操作命令Statement - PreparedStatement
3.使用操作命令来执行SQL
// 查询操作
preparedStatement.executeQuery();
// 新增、修改、删除操作
preparedStatement.executeUpdate();
4.处理结果集ResultSet
while (resultSet.next()) {
int xxx = resultSet.getInt("xxx");
String yyy= resultSet.getString("yyy");
...
}
5.关闭并释放资源
- 释放语句和释放连接这两句的释放顺序不能错,一定是后创建的先被释放,连接先创建的所以后释放
resultSet.close();
preparedStatement.close();
connection.close();