文章目录
- JDBC概述
- JDBC有什么用?
- JDBC是什么?
- JDBC API
- JDBC的搭建和使用
- 1 导入数据库驱动包
- 2 加载数据库驱动
- 3 建立数据库连接
- 4 向数据库发送sql语句
- Statement
- PrepareStatement
- 5 接收查询的结果
- 6 关闭数据库连接通道
JDBC概述
JDBC有什么用?
1.jdbc是用来连接我们的java应用程序和数据库的,使用jdbc能够让我们通过java应用程序读取数据库中的数据,还能够进行数据的存储;
2.我们能够通过jdbc连接到不同的数据库, 比如Oracle,MySQL,sql server等.
JDBC是什么?
1.JDBC: Java DataBase Connectivity的简称, 即java数据库连接. 它是一种用于执行SQL语句的Java API, 可以为多种关系型数据库提供统一的访问, 由一组用Java语言编写的类和接口组成.
2.由于市面上的各种数据库底层各不相同, 而Java开发公司又不可能根据市面上的每一种数据库都设计其相应的数据库连接方式, 因此, java开发公司选择设计JDBC这样的类和接口组成的数据库连接方式, 由各自的数据库所属公司去实现自己数据库对应的JDBC功能.
总结一下, Java API中提供了操作数据库的标准接口, 最终由不同的数据库开发商实现这些标准接口来对数据库进行操作, 而程序员只需要学习使用标准规范即可.
JDBC API
JDBC API: 供程序员调用的类和接口, 集成在java.sql包中.
需要使用的几种类和接口:
DriverManager类:管理各种不同的JDBC连接;
Connection接口:与特定数据库的连接;
Statement接口: 执行sql
PrepardeStatement接口: 执行sql
ResultSet接口: 接收查询结果
JDBC的搭建和使用
说明一下, 我这里的开发工具使用的是IntelliJ IDEA 2020.2.1, mysql8 , 这里只是简单的说一下, 开发工具和mysql 版本不同也不太影响使用, 只是有几个小点需要注意, 大的部分是没什么问题的.
1 导入数据库驱动包
我这里使用的驱动包是
mysql-connector-java-8.0.16.jar
大家应该根据自己的数据库版本去选择相应的数据库驱动包.
导入数据库驱动包的操作如下:
1.在项目工程下创建lib目录, 将驱动包复制到lib目录下.
2.在File下找到项目结构(Prioject Structure)—>函数库(Libraries)—>点击+号,选择java—>选择到项目下面刚导入的jar包—>OK—>Apply
3.导入数据库驱动包完成.
2 加载数据库驱动
注册JDBC驱动程序: 这需要初识化驱动程序,这样就可以打开与数据库的通信信道.
方式一
利用反射机制加载Driver类,给的是类的地址
Class.forName("com.mysql.cj.jdbc.Driver"); //这是mysql8的方式
//利用反射机制加载Driver类
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
方式二
使用DriverManager注册与给定的驱动程序.
DriverManger.registerDriver(new Driver());
//需要抛一个异常
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
3 建立数据库连接
这里需要DriverManger.getConnection()方法来创建一个Connection对象, 它代表一个物理连接的数据库.
Connection connection = DriverManager.getConnection(URL,User,Passwd);
URL: jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库名?characterEncoding=utf-8
&useSSL=false&serverTimezone=UTC
?后面的都是参数,使用&符号连接,键=值&键=值
characterEncoding=utf8 编码格式
useSSL=false 安全连接,现在为false
serverTimezone=UTC 时区
User:用户名
Passwd:密码
try {
String url = "jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=utf-8" +
"&useSSL=false&serverTimezone=UTC";
Connection connection = DriverManager.getConnection(url,"root","root");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
4 向数据库发送sql语句
这里主要就是通过java程序操纵数据库,需要学习两个发送sql语句的类,Statement和PrepareStatement.
Statement
获得Statement对象用于将sql语句发送到数据库
Statement st = connection.createStatement();
两个重要方法
executeUpdate(String sql);
用于执行ddl(结构定义)语句和dml(增,删,改)语句
执行ddl语句返回0,执行dml返回被操作的行数,为Int型
executeQuery(String sql);
用于执行查询语句 返回一个ResultSet集合
注意
使用Statement类发送sql语句需要拼接字符串,拼接字符串的方法为:双引号双加号"+内容+",如果数据库本身的字段为字符串还需要再加上单引号,即'"+内容+"',事例如下
//获得Statement对象
Statement st = connection.createStatement();
//发送sql语句
String name = "小明";
String sex = "女";
String age = "18";
String deptId = "3";
int res = st.executeUpdate("" +
"insert into t_staff(s_name,s_sex,s_age,s_dept_id)" +
"values('"+name+"','"+sex+"',"+age+","+deptId+")");
System.out.println(res);//1,被修改了一行
PrepareStatement
获得PrepareStatement对象用于将sql语句发送到数据库
注意,prepareStatement中的参数位置使用占位符?
PrepareStatement ps = connection.PrepareStatement("sql语句,参数位置使用?");
两个重要方法
executeUpdate(String sql);
用于执行ddl(结构定义)语句和dml(增,删,改)语句
执行ddl语句返回0,执行dml返回被操作的行数,为Int型
executeQuery(String sql);
用于执行查询语句 返回一个ResultSet集合
注意
为sql语句设置相应参数使用
ps.set相应类型(对应参数位置,参数)
的方法
//获得PrepareStatement
PreparedStatement ps = connection.prepareStatement(
"insert into t_staff(s_name,s_sex,s_age,s_dept_id)" +
"values(?,?,?,?)"
);
String name = "小暗";
String sex = "男";
String age = "19";
String deptId = "2";
ps.setString(1,name);
ps.setString(2,sex);
ps.setString(3,age);
ps.setString(4,deptId);
//发送
int res = ps.executeUpdate();
System.out.println(res);
5 接收查询的结果
这里我们会使用ResultSet类;
PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中;
使用ResultSet中的next()方法获得下一行数据;
使用getXXX(String name)方法获得值;
一篇完整的查询语句代码奉上
import java.sql.*;
public class Hello {
public static void main(String[] args) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
String url = "jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=utf-8" +
"&useSSL=false&serverTimezone=UTC";
Connection connection = DriverManager.getConnection(url, "root", "root");
//获得PrepareStatement
PreparedStatement ps = connection.prepareStatement(
"select * from t_staff where s_id=?"
);
ps.setInt(1,3);
//发送
ResultSet res = ps.executeQuery();
Test test = new Test();
while(res.next()){
test.setS_id(res.getInt("s_id"));
test.setS_name(res.getString("s_name"));
test.setS_sex(res.getString("s_sex"));
test.setS_age(res.getInt("s_age"));
test.setS_dept_id(res.getInt("s_dept_id"));
test.setS_money(res.getInt("s_money"));
}
System.out.println(test.toString());
//Test{s_id=3, s_name='虞姬', s_sex=女, s_age=29, s_dept_id=3, s_money=2800}
//关闭连接
ps.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
class Test{
private int s_id;
private String s_name;
private String s_sex;
private int s_age;
private int s_dept_id;
private int s_money;
public void setS_id(int s_id) {
this.s_id = s_id;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public void setS_sex(String s_sex) {
this.s_sex = s_sex;
}
public void setS_age(int s_age) {
this.s_age = s_age;
}
public void setS_dept_id(int s_dept_id) {
this.s_dept_id = s_dept_id;
}
public void setS_money(int s_money) {
this.s_money = s_money;
}
@Override
public String toString() {
return "Test{" +
"s_id=" + s_id +
", s_name='" + s_name + '\'' +
", s_sex=" + s_sex +
", s_age=" + s_age +
", s_dept_id=" + s_dept_id +
", s_money=" + s_money +
'}';
}
}
6 关闭数据库连接通道
每次操作完成后关闭所有与数据库的连接通道
方法:close()