文章目录
JDBC概述
- JDBC(Java DataBase Connectivity)java数据库连接
- 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
- 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.
- Java API中提供了操作数据库的标准接口,最终由不同的数据库开发商实现这些标准接口来对数据库操作.
JDBC API
供程序员调用的接口与类,集成在java.sql包中
- DriverManager类作用:管理各种不同的jDBC驱动
- Connection 接口 与特定数据库的连接
- Statement 接口 执行sql
- PreparedStatement接口 执行sql
- ResultSet接口 接收查询结果
JDBC搭建
JDBC搭建步骤
- 导入MySQL数据库驱动包
- 加载数据库驱动(博主目前用的是mysql8)
- 建立与数据库的连接
- 向数据库发送sql语句
- 接收查询语句
- 关闭数据库连接
1.导入MySQL数据库驱动包
- 在工程目录下新建 lib 目录,将需要的jar包复制到该目录下
- 将jar包引入工程
- 编写程序
点击File --> project structure
根据图示步骤走
点开Java后,我们选择刚刚创建的工程下的建立lib文件的MySQL驱动包
之后确定,应用即可
到此,我们就将MySQL驱动包导入到IDEA中了
2.加载数据库驱动
- 方式一 Class.forName(“com.mysql.cj.jdbc.Driver”);
- 方式二 DriverManager.registerDriver(new Driver());
// mysql 5 的驱动
Class.forName("com.mysql.jdbc.Driver");
// 加载驱动方式1
try {
// 利用反射机制加载driver类
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 加载驱动方式2
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
3.建立数据库连接
// jdbc:mysql:// "ip:端口号" / 数据库名 ? 参数(键=值) & 参数(键=值)
String url = "jdbc:mysql://127.0.0.1:3306/yhlz_db?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
// 参数 地址,用户名(数据库),密码(数据库)
Connection c = DriverManager.getConnection(url,"root","password");
4.向数据库发送sql语句
- 方式1: connection.createStatement()
- 方式2: connection.prepareStatement()
方式一
String name = "迪迦";
String sex = "男";
int phone = 911;
int grade = 2;
String time = "2021-01-12";
/* 2种发送方式
// 获得statement,向数据库发送sql语句(静态)
1.connection.createStatement()
// 预编译
2.connection.prepareStatement()
*/
Statement s1 = c.createStatement();
// ddl语句 execute() 返回值boolean类型
s1.execute("create table test(id int,name varchar(10))");
s1.execute("drop table test");
// dml语句 executeUpdate() 增删改查 返回值int类型
// 添加语句
s1.executeUpdate("insert into t_student(t_student_id,t_student_name,t_student_sex,t_student_phone,t_student_grade_id,t_student_date) values(null,'"+name+"','"+sex+"',"+phone+","+grade+",'"+time+"')");
// 更新语句
s1.executeUpdate("update t_student set t_student_sex = '"+sex+"' where t_student_id = 5");
// 删除语句
s1.executeUpdate("delete from t_student where t_student_id = 6");
原表信息
在添加时我们要注意,插入的值
如果我们要添加的数据是字符串的话
那么我们需要 这样写 记住口则 : 单引 + 双引 + 双加
就是这样的 ‘"+ 参数 +"’
如果不是字符串的话不用加单引 : 双引 + 双加
// 添加语句
s1.executeUpdate("insert into t_student(t_student_id,t_student_name,t_student_sex,t_student_phone,t_student_grade_id,t_student_date) values(null,'"+name+"','"+sex+"',"+phone+","+grade+",'"+time+"')");
这里主键t_student_id 是7的原因是博主之前测试了一次,故而再次创建时,主键就变为了7
// 更新语句
s1.executeUpdate("update t_student set t_student_sex = '"+sex+"' where t_student_id = 5");
// 删除语句
s1.executeUpdate("delete from t_student where t_student_id = 7");
执行后我们就会发现id=7的信息被删除了
方式二
// 方式2: preparedStatement
// 将sql语句预编译到PreparedStatement,?是占位符,表示每个位置的值
PreparedStatement p = c.prepareStatement("insert into t_student(t_student_name,t_student_sex,t_student_phone,t_student_grade_id,t_student_date) values(?,?,?,?,?)");
// 然后通过指定方法向sql语句中的占位符赋值
p.setString(1,name);
p.setString(2,sex);
p.setInt(3,phone);
p.setInt(4,grade);
p.setString(5,time);
// 预编译好,数据赋值后,然后发送
p.executeUpdate();
createStatement 和 preparedStatement
- 前者每executeUpdate一次,就会向数据库发送一条sql语句
- 后者代码可读性高,效率高,安全性高,防止sql注入
5.接收查询语句
- executeQuery()
- 只能是dql语句
这里我们一般选择第二个方法,通过列名获取数据库中的数据
connection.createStatement() 下的查询
我们创建Student类来接收数据库中stu表的数据
package com.ff.slg.jdbc.day2;
/**
* @ClassName Student
* @Description 接收数据库中的stu表信息
* @Author 码农天宇
* @Date 2021/1/21 11:37
* @Version 1.0
*/
public class Student {
private String name;
private String sex;
private int num;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", num=" + num +
", address='" + address + '\'' +
'}';
}
}
// 接收查询结果 只能是 dql语句 executeQuery()将查询结果封装在ResultSet中,可以多条
ResultSet r = s1.executeQuery("select stu_name,stu_sex,stu_num,address from yhlz_stu where stu_age > 15");
// 将resultset中的结果提取出来
ArrayList<Teacher> list = new ArrayList<Teacher>();
// 将resultset中的结果提取出来
while(r.next()){
// 创建学生对象 ,用来接收封装查询出来的数据
Student st = new Student();
st.setNum(r.getInt("stu_num"));
st.setName(r.getString("stu_name"));
st.setSex(r.getString("stu_sex"));
st.setAddress(r.getString("address"));
list.add(st);
}
System.out.println(list);
原表信息
查询结果
connection.preparedStament() 下的查询
同理,我们创建Teacher类,接收数据库中stu表的信息
package com.ff.slg.jdbc.day2;
/**
* @ClassName Teacher
* @Description 接收数据库中的tea表信息
* @Author 码农天宇
* @Date 2021/1/21 11:22
* @Version 1.0
*/
public class Teacher {
private String name;
private String sex;
private int num;
private String home;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getHome() {
return home;
}
public void setHome(String home) {
this.home = home;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", num=" + num +
", home='" + home + '\'' +
'}';
}
}
PreparedStatement p2 = c.prepareStatement("select tea_name,tea_sex,tea_num,tea_home from yhlz_tea where tea_age > ?");
p2.setInt(1,2);
// 接收查询结果 只能是 dql语句 executeQuery()将查询结果封装在ResultSet中,可以多条
ResultSet r = p2.executeQuery();
ArrayList<Teacher> list = new ArrayList<Teacher>();
// 将resultset中的结果提取出来 next()方法是
while(r.next()){
// 创建老师对象 ,用来接收封装查询出来的数据
Teacher t = new Teacher();
t.setNum(r.getInt("tea_num"));
t.setName(r.getString("tea_name"));
t.setSex(r.getString("tea_sex"));
t.setHome(r.getString("tea_home"));
list.add(t);
}
System.out.println(list);
原表信息
查询结果
6.关闭数据库连接
r.close();
s1.close();
c.close();