概述
●
JDBC(Java DataBase Connectivity)java数据库连接
●
是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,
它由一组用Java语言编写的类和接口组成。
●
有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.
●
●
J a v a A P I
中 提 供 了 操 作 数 据 库 的 标 准 接 口
,
最 终 由 不 同 的 数 据 库 开 发 商 实 现 这 些 标 准 接 口 来 对 数 据 库 操 作
.
Java
定义者制定了
JDBC
规范
数据库开发商实现接口
程序员学习使用标准规范
JDBC API:
供程序员调用的接口与类,集成在
java.sql
包中
DriverManager
类作用:管理各种不同的
jDBC
驱动
Connection
接口 与特定数据库的连接
Statement
接口 执行
sql
PreparedStatement
接口 执行
sql
ResultSet
接口 接收查询结果
JDBC搭建
JDBC API:
供程序员调用的接口与类,集成在
java.sql
包中
DriverManager
类作用:管理各种不同的
jDBC
驱动
Connection
接口 与特定数据库的连接
Statement
接口 执行
sql
PreparedStatement
接口 执行
sql
ResultSet
接口 接收查询结果
●
注册JDBC驱动程序:
●
这需要初始化驱动程序,这样就可以打开与数据库的通信信道。
Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现
或者
DriverManager.registerDriver(new Driver());
●
建立与数据库连接:
●
这需要使用
DriverManager.getConnection()
方法来创建一个
Connection
对象,它代表一个物理连接的数据库
.
● Connection conn =
DriverManager.getConnection(URL,USER,PASS);
URL:jdbc:mysql://ip(127.0.0.1):
端口
(3306)/
数据库
名
?serverTimezone=Asia/Shanghai
USER:
用户名
(root)
PASS:
密码
●
获得
Satement
执行
sql
语句
●Statement st = connection.createStatement();
Satement
中的方法
:
Int executeUpdate(String sql)
用于执行
ddl
语句和
dml(
增
,
删
,
改
)
语句 返回
操作的行数
用于执行
ddl
语句返回
0
用于执行
dml
语句返回操作的行数
ResultSet executeQuery(String sql);
用于执行查询语句 返回一个
ResultSet
集合
●
获得
PrepareStatement
执行
sql
语句
●
在
sql
语句中参数位置使用占位符
,
使用
setXX
方法向
sql
中设置参数
● PrepareStatement ps = connection.prepareStatement(sql);
PrepareStatement
中的方法
:
Int executeUpdate()
用于执行
ddl
语句和
dml(
增
,
删
,
改
)
语句 返回操作的行数
用于执行
ddl
语句返回
0
用于执行
dml
语句返回操作的行数
ResultSet executeQuery();
用于执行查询语句 返回一个
ResultSet
集合
●
关闭与数据库的链接通道
●
每次操作完成后关闭所有与数据库交互的通道
st.close();
rs.close();
conn.close();
ps.close();
PreparedStatement和Statement
基于以下的原因:
1、代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无
论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values
('"+var1+"' , '"+var2+"' , "+var3+" , '"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4)
values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例
2、最重要的一点是极大地提高了安全性.
防止sql注入
Stringsql= “ delete from user where id = ”+num;
如果我们把[or 1=1]作为id传入进来?
delete from tb_name where id = 1 or 1 = 1;
因为‘1’ = ‘1’肯定成立
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹
配的关系.
预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
PreparedStatement
和
Statement
中的
executeQuery()
方法中会返回一
个
ResultSet
对象
,
查询结果就封装在此对象中
.
●
使用
ResultSet
中的
next()
方法获得下一行数据
●
使用
getXXX(String name)
方法获得值
实例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo1 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//2.加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");//相当于启动mysql软件
//DriverManager.registerDriver(new Driver());
//3.建立与数据库的连接,获得连接对象
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
Connection connection = DriverManager.getConnection(url, user, password);//连接数据库 (登录数据库)
System.out.println(connection);//com.mysql.cj.jdbc.ConnectionImpl@37574691
//连接mysql的通道
//4.发送sql(向数据库发送sql语句)
Statement st = connection.createStatement();//输入流 com.mysql.cj.jdbc.StatementImpl@442675e1
System.out.println(st);
st.executeUpdate("insert into major (name) values ('英语')");
//5.关闭数据库连接
st.close(); //关闭mysql输入通道
connection.close();// 关闭java与mysql的连接通道
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo2 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
try {
//demo2.save("丽丽",110,"女","2004-04-12","13244465555","汉中",2);
// demo2.update(110,"tom1","男","2004-2-2","15233334222","汉中1");
demo2.delete("110 ");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void delete (String num) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
// 获得连接
//连接数据库
Connection connection = DriverManager.getConnection(url,user,password);
//向数据库写数据
//发送
Statement st = connection.createStatement();
st.executeUpdate("delete from student where num ="+num);
//关闭
st.close();
connection.close();
}
public void update (int num,String name,String gender,String birthday,String phone,String address) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
// 获得连接
//连接数据库对象 (来连接mysql)
Connection connection = DriverManager.getConnection(url,user,password);
//向数据库写数据
//发送 (输入通道 /输入流)
Statement st = connection.createStatement();
// executeUpdate 直接执行sql语句
st.executeUpdate("update student set name='"+name+"',gender='"+gender+"',birthday='"+birthday+"',phone='"+phone+"',reg_time=now(),address='"+address+"' where num="+num);
//关闭
st.close();
connection.close();
}
public void save (String name,int num,String gender,String birthday,String phone,String address,int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
// 获得连接对象 (来连接mysql)
//连接数据库
Connection connection = DriverManager.getConnection(url,user,password);
//向数据库写数据
//发送
Statement st = connection.createStatement();
st.executeUpdate(" INSERT INTO student (NAME,num,gender,birthday,phone,address,reg_time,majorid) " +
"VALUES('"+name+"',"+num+",'"+gender+"','"+birthday+"','"+phone+"','"+address+"',now(),'"+majorid+"')");
//关闭
st.close();
connection.close();
}
}
import java.sql.*;
public class Demo3 {
/*
PreparedStatement 和 Statement 区别
相同点: 都是向数据库发送sql
Statement : 将参数直接拼接到sql, 要拼接字符串, 写起来麻烦, 安全性差(意受攻击), 可以在参数中拼接 or 1=1 会攻击数据库中的数据(会将数据库中的数据全部删除)
PreparedStatement : 先用?站位, 然后通过setObject方法赋值(占位符所占的位置) , 写起来不用拼接字符串, 安全可靠的
(执行sql语句先暂停一下判断(检查)sql语句是否安全, 安全才执行sql语句) 在给占位符位置赋值时 进行检测 , 可以防止sql注入恶意攻击 防止对数据库中的数据造成破坏
*/
public static void main(String[] args) {
Demo3 demo2 = new Demo3();
try {
//demo2.save("丽丽","女","2004-04-12","13244465555","汉中",2);
// demo2.update(110,"丽丽","男","2004-4-2","15233334222","汉中1");
demo2.delete("111 or 1=1");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void delete (String num) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
// 获得连接
//连接数据库
Connection connection = DriverManager.getConnection(url, user, password);
//向数据库写数据
//发送
//预先编译sql语句(不是真正的编译sql)
PreparedStatement ps = connection.prepareStatement("delete from student where num = ?");
// 给?占位符占的位置赋值
ps.setObject(1,num);
ps.executeUpdate();//
//关闭
ps.close();
connection.close();
}
public void update(int num, String name, String gender, String birthday, String phone, String address) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
// 获得连接
//连接数据库
Connection connection = DriverManager.getConnection(url, user, password);
//向数据库写数据
//发送 ?占位符, 表示此处需要接受一个参数
PreparedStatement ps = connection.prepareStatement("update student set name = ?,gender = ?,birthday = ?,phone = ?,address = ? where num = ?");
// 给?占位符占的位置赋值
ps.setObject(1,name);
ps.setObject(2,gender);
ps.setObject(3,birthday);
ps.setObject(4,phone);
ps.setObject(5,address);
ps.setObject(6,num);
// 真正执行sql语句
ps.executeUpdate();
//关闭
ps.close();
connection.close();
}
public void save(String name, String gender, String birthday, String phone, String address, int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//启动数据库
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
// 获得连接
//连接数据库
Connection connection = DriverManager.getConnection(url, user, password);
//向数据库写数据
//发送 ?占位符, 表示此处需要接受一个参数
PreparedStatement ps = connection.prepareStatement("insert into student (name,gender,birthday,phone,address,reg_time,majorid)values (?,?,?,?,?,now(),?)");
// 给?占位符占的位置赋值
ps.setObject(1, name);
ps.setObject(2, gender);
ps.setObject(3, birthday);
ps.setObject(4, phone);
ps.setObject(5, address);
ps.setObject(6, majorid);
//真正执行sql语句
ps.executeUpdate();
//关闭
ps.close();
connection.close();
import java.sql.*;
import java.util.ArrayList;
public class Demo4 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Demo4 demo4 = new Demo4();
//com.ffyc.jdbc.Student student = demo4.findStudentByNum(115);
//System.out.println(student);
ArrayList<Student> students = demo4.findStudentByGender("女");
System.out.println(students);
}
public ArrayList<Student> findStudentByGender(String gender) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
Connection connection = DriverManager.getConnection(url, user, password);
ArrayList<Student> students = new ArrayList<>();
PreparedStatement ps = connection.prepareStatement("select num,name,gender,birthday,phone,reg_time from student where gender = ?");
ps.setObject(1,gender);//给站位符位置设置值
ResultSet rs = ps.executeQuery();//真正执行sql语句
while (rs.next()){
//每循环一次, 拿到一个学生对象(拿到学生表中的一个学生对象)
Student student = new Student();
student.setNum(rs.getInt("num"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthday(rs.getDate("birthday"));
student.setPhone(rs.getString("phone"));
student.setRegTime(rs.getTimestamp("reg_time"));
students.add(student);//将学生对象存入到学生集合中
}
return students;
}
public Student findStudentByNum(int num) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/schoold?serverTimezone=Asia/Shanghai";//(软件mysql的地址根据地址找到mysql这个软件)
String user = "root";//mysql 账号
String password = "root";//mysql 密码
Connection connection = DriverManager.getConnection(url, user, password);
//程序输入数据库 sql语句通道
PreparedStatement ps = connection.prepareStatement("select num,name,gender,birthday,phone,reg_time from student where num = ?");
ps.setObject(1,num);
//查询操作
//查询结果从数据库中输入到程序中 有个输入程序通道
ResultSet rs = ps.executeQuery(); //将查询结果封装到一个ResultSet对象中, 需要将ResultSet对象中的数据封装到对应的对象中
// 将查询的结果存到(封装到ResultSet对象中) ResultSet对象存的是查询结果
//next () 如果结果集中有数据返回true,否则返回false
Student student = null;
while (rs.next()){
student = new Student();
student.setNum(rs.getInt("num"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthday(rs.getDate("birthday"));
student.setPhone(rs.getString("phone"));
student.setRegTime(rs.getTimestamp("reg_time"));//获取时间戳 返回年月日 时分秒
}
rs.close(); //关闭mysql向程序输入数据通道
ps.close(); // 关闭程序向数据库输入sql语句 的通道
connection.close(); //关闭程序与数据库的连接
return student;
}
}
import java.util.Date;
public class Student {
private int num;
private String name;
private String gender;
private Date birthday;
private String phone;
private Date regTime;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getRegTime() {
return regTime;
}
public void setRegTime(Date regTime) {
this.regTime = regTime;
}
@Override
public String toString() {
return "Student{" +
"num=" + num +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday=" + birthday +
", phone='" + phone + '\'' +
", regTime=" + regTime +
'}';
}
}