目录
?一、JDBC是什么?
二、使用JDBC操纵数据库步骤
1. 安装JDBC驱动包
2. 在程序中导入驱动包
3. 连接数据库
4. JDBC操纵数据库?
一、JDBC是什么?
JDBC是?用来执行SQL语句操纵数据库 的 一套规范性API接口
🔊 JDBC是操纵数据库的
可能有小伙伴用的是命令行或者图形界面操纵数据库。不过实际开发时,在自己编写的代码中访问数据库的情况较多。要想在自己编写的代码中操纵数据库,就需要用到JDBC
🔊 ?API接口
由一些类/方法/函数等组成,通过直接调用 API 接口来实现一些功能。比如之前在Java标准库中提供的一些类,可以叫做Java API
🔊 规范性
主流的数据库为了方便程序员实现客户端程序,会提供一些API接口。借助这些接口,我们可以比较方便的访问数据库服务器。不过主流的数据库厂商很多,各家的API百花齐放不尽相同,实际开发过程中使用的非常不顺畅。
于是为了统一,Java提出了一套标准的接口体系。所有厂商将自家的API往标准适配,于是有了适配的程序包叫做JDBC驱动包。
在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。我们不用学各家数据库的API,只需要掌握Java JDBC API (位于 java.sql 包下)即可掌握Java数据库编程。
二、使用JDBC操纵数据库步骤
进行JDBC编程,需要先安装MySQL对应的驱动包再进行相关操作,我们一步一步来...
1. 安装JDBC驱动包
各大网站很容易搜到
2. 在程序中导入驱动包
🟢先创建一个项目
🟢再创建一个lib目录(名字自取)
🟢将下载好的驱动包复制到lib目录下(一直点ok即可)
🟢 add驱动包
🔴常见错误
?没找到add键 -> 创建lib目录的路径不对,一定要根据图示在主项目的目录下创建
3. 连接数据库
//1. 使用Datasource类,描述MySQL服务器的位置
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 和数据库服务器建立连接
Connection connection=dataSource.getConnection();//处理异常
System.out.println(connection);
🟢如果出现下列输出,则表示连接成功 ~
🔴?任何一个细节错误,都会导致连接失败!
? ? ? 检查url地址:符号是否正确,数据库test是否已经创建;
? ? ? 检查密码:密码是当时安装时设置的那个用户密码
🔊 关于URL地址
?URL即统一资源定位符,用来表示互联网上的某个资源地址
🔊 为什么先向上转型又向下转型?直接用MysqlDataSource创建对象不可以吗?
? ? ? 使用DataSource创建,得到的数据源是DataSource类型。后续写其他代码,如果使用到? 数据源,持有的类型也是DataSource类。DataSource是通用的类型,可以指带任何数据库。如果以后需要更换数据库,代码改动量小;
? ? ? 使用MysqlDataSource,得到的数据源是MysqlDataSource类型。而MysqlDataSource是? MySQL特有的类型,后续如果需要更换数据库,代码改动量大
🔊 不用记url代码,使用时直接复制即可 ~
?
4. JDBC操纵数据库?
数据库Test中有一个student表,结构如下图所示。我们使用这个案例作为参考,展示相关操作
?🟣 插入
package learn.day;
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 JDBCTest1 {
public static void main(String[] args) throws SQLException {
//1. 使用Datasource类,描述MySQL服务器的位置
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("jiuban521");
//2. 和数据库服务器建立连接
Connection connection=dataSource.getConnection();
//3. 用户输入信息
Scanner scanner=new Scanner(System.in);
System.out.println("请输入学号:");
int id=scanner.nextInt();
System.out.println("请输入姓名:");
String name=scanner.next();
//4. 构造SQL语句-JDBC操作数据库,本质上还是通过SQL来描述数据库操作
String sql=" insert into student values("+id+",' "+name+" ') ";//相当于insert into student values(id,name)。id,name是自己输入的数据
PreparedStatement statement=connection.prepareStatement(sql);
//注意:sql需要搭配PreparedStatement对象使用,不能只写一个String
//5. 执行sql语句
// update、delete、insert操作都是通过executeUpdate来执行的
// 查询操作不同,通过executeQuery来执行
int n=statement.executeUpdate();
System.out.println(n);
//6. 断开连接,释放资源
statement.close();
connection.close();
//注意:断开连接的先后顺序,先断statement
}
}
🔊 一些细节
???Connection选择的是java.sql,不是com.mysql.jdbc
?易错点:一定要选择java.sql,否则没办法完成增加操作
???Connection连接时需要处理异常
???System.out.println(n)输出改变的行数
🔊 拓展小知识
网络通信中,有两种风格
① 有连接 - 相当于“打电话”,有人接才传送信息
② 无连接 - 相当于“发微信”,不管是否接通,都先传送信息
数据库采用的是有连接的方式。好处是,保证通信的过程中线路畅通;坏处是,需要对连接进行管理,及时释放不需要用的连接(有点像打电话,没有断开通话,外面没办法打进来)
不过使用字符串拼接的方式不够科学
① 引号容易出混淆、出错
② 可能出现安全性问题(sql注入攻击 - 如果用户输入时故意构特殊代码,比如name=);drop table等代码,后果非常严重)
所以我们需要在原来代码的基础上进行改进,改进 “构造sql” 这一块的代码:
package learn.day;
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 JDBCTest1_1{
public static void main(String[] args) throws SQLException {
//1. 描述位置
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("jiuban521");
//2. 建立连接
Connection connection=dataSource.getConnection();
//3. 用户输入
Scanner scanner=new Scanner(System.in);
System.out.println("请输入学号:");
int id=scanner.nextInt();
System.out.println("请输入姓名:");
String name=scanner.next();
//4. 构造sql语句
String sql="insert into student values(?,?)";//使用?作为占位符,后续用statement对象针对?进行替换
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,id);//针对第一个?,替换成id
statement.setString(2,name);//针对第二个?,替换成name
//5. 执行sql语句
int n=statement.executeUpdate();
System.out.println(n);
//6. 断开连接,释放资源
statement.close();
connection.close();
}
}
?🟣 更新
package learn.day;
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 JDBCTest2{
public static void main(String[] args) throws SQLException {
//1. 描述位置
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("jiuban521");
//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语句4
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);
//5. 执行sql语句
int n=statement.executeUpdate();
System.out.println(n);
//6. 断开连接,释放资源
statement.close();
connection.close();
}
}
?🟣 删除
package learn.day;
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 JDBCTest3 {
public static void main(String[] args) throws SQLException {
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("jiuban521");
Connection connection=dataSource.getConnection();
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你要删除的学生的学号:");
int id=scanner.nextInt();
System.out.println("请输入你要删除的学生的学号:");
String name=scanner.next();
String sql="delete from student where id=? and name=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println(statement);
int n=statement.executeUpdate();
System.out.println(n);
statement.close();
connection.close();
}
}
?🟣 查询
package learn.day;
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;
import java.util.Scanner;
public class JDBCTest4 {
public static void main(String[] args) throws SQLException {
//描述位置
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("jiuban521");
//建立连接
Connection connection=dataSource.getConnection();
//直接查全表,不设置用户输入
//构造 sql语句
String sql="select * from student";
PreparedStatement statement =connection.prepareStatement(sql);
//执行sql语句
//我们需要得到的是一张表的所有值,所以前面的executeUpdate返回类型为int不再适用
//这里使用executeQuery,返回类型是ResultSet
ResultSet resultSet= statement.executeQuery();
//拿到结果集results,需要遍历打印
while(resultSet.next()){
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
System.out.println(id+":"+name);
}
//断开连接,释放资源
statement.close();
connection.close();
}
}
🔊?ResultSet的用法
|