JAVA的JDBC编程
数据库编程的必备条件
1.编程语言:JAVA,C,C++,Python等
2.数据库:如Oracle,Mysql,sql server等
3.数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包。如:mysql提供了java的驱动包mysql-connector-java,需要基于java操作mysql急需要该驱动包.同样的,要基于javaa操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
JAVA的数据库编程:JDBC
JDBC,即Java Database Connectivity,java数据库链接,是一种用于执行sql语句的java API,是java中的数据库连接规范,这个API由java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java开发人员的数据库连接规范提供了一个标准的API,可以为多种关系数据库提供统一访问.
JDBC工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类。
JDBC访问数据库层次接口:
JDBC使用
1.前期工作
准备数据库驱动包,并添加到项目的依赖中:
在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib中。再配置该jar包到本项目的依赖中:右键点击项目Open Module Settings,在Modules中,点击项目,配置Dependencies,点击+,JARS or Directories,将该lib文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖.
2.使用步骤
- 创建数据库连接Connection
DriverManager创建
DataSource获取 - 创建操作命令Statement
PreparedStatement - 使用操作命令来执行SQL
- 处理结果集ResultSet
- 释放资源(先创建的后释放,这点很重要)
3.具体实现
1.TestJDBC.java
package com.yty;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author yty
* @version 1.0
* @date 2021-11-16 19:15
*/
public class TestJDBC {
public static void main(String[] args) throws SQLException {
//1.创建DataSource对象(Datasource对象生命周期应该是要跟随整个程序
DataSource dataSource =new MysqlDataSource();
//接下来针对dataSource进行配置,以便后面能够顺利访问数据库
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mysqlJDBC?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
//2.建立和数据库的连接
//为了验证当前的网络通信是否正常
//不正常会有SQLException异常
//connection对象生命周期应该是短的,每个请求创建一个新的connection
Connection connection=dataSource.getConnection();
//3.拼装SQL语句,用到PrepareStatement对象
//现已插入数据为例
//当前插入的数据是写死的,其实也可以让程序再运行时得到
//动态的拼接进去
int id=1;
String name="曹操";
int classId=10;
//?表示占位符,可以把具体的变量的值替换到?位置
String sql="insert into student values(?,?,?)";
PreparedStatement statement= connection.prepareStatement(sql);
//1,2,3相当于?下标(从1开始算)
statement.setInt(1,id);
statement.setString(2,name);
statement.setInt(3,classId);
System.out.println("statement: "+ statement);
//4.拼装完成之后执行sql
//inser delect update 都是以executeUpdate方法来执行
//select就使用executeUpdate来执行
//返回值表示此次操作修改了多少行
int ret=statement.executeUpdate();
System.out.println("ret: "+ ret);
//5.执行完毕之后,关闭释放资源
//一定是先创建的后释放,顺序一定不能记错!!!
statement.close();
connection.close();
}
}
2.TestSlelct.java
package com.yty;
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 TestSelect {
public static void main(String[] args) throws SQLException {
// 1. 创建 DataSource 对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mysqljdbc?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
// 2. 创建 Connection 对象, 和数据库建立连接.
Connection connection = dataSource.getConnection();
// 3. 借助 PrepareStatement 拼装 SQL 语句.
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 执行 SQL 语句
ResultSet resultSet = statement.executeQuery();
// 5. 遍历结果集. 遍历过程和使用迭代器遍历集合类有点像
// 结果集相当于一张表. 这个表里有很多行, 每一行是一条记录(又包含很多列)
// next() 一方面是判定当前是否存在下一行. 另一方面如果存在下一行就获取到这一行.
// 可以直观的把 resultSet 对象想象成是一个 "光标"
while (resultSet.next()) {
// resultSet 的光标指向了当前行, 就可以把当前行中的列数据都获取到
// 当前表中的每一行包含三个列. id, name, classId, 可以根据列名来获取对应的列数据.
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int classId = resultSet.getInt("classId");
System.out.println("id: " + id + " name: " + name + " classId: " + classId);
}
//5.释放资源
//后创建的先释放
resultSet.close();
statement.close();
connection.close();
}
}
3.TestUpdate.java
package com.yty;
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;
/**
* @author yty
* @version 1.0
* @date 2021-11-17 0:09
*/
public class TestUpdate {
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/mysqlJDBC?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
//2.建立连接
Connection connection=dataSource.getConnection();
//3.拼装sql语句
String sql="update student set name=? where id=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,id);
//4.执行sql
int ret=statement.executeUpdate();
if (ret==1){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
//5.关闭资源
statement.close();
connection.close();
}
}
4.TestDelete.java
package com.yty;
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;
/**
* @author yty
* @version 1.0
* @date 2021-11-17 0:10
*/
public class Testdelect {
public static void main(String[] args) throws SQLException {
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/mysqlJDBC?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
//2.创建Connection对象,和数据库连接
Connection connection=dataSource.getConnection();
//3.拼装sql
String sql="delete from student where name= ? ";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,name);
//4.执行sql
int ret=statement.executeUpdate();
if (ret==1){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
//5.关闭资源
statement.close();
connection.close();
}
}