文章目录
前言
在实际开发时,项目中的数据通常是存储在数据库中的,要想使用其中的数据,就必须编写程序连接到数据库对数据进行操作。Java对数据库的操作提供了相应的支持,它可以提供了一套可以执行SQL语句的API,即JDBC。本章主要围绕JDBC常用API、JDBC基本操作等知识进行详细详解。
一、JDBC概述
JDBC(Java DataBase Connectivity):JAVA数据库连接 。
有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库。
JDBCAPI:用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问, 它由一组用Java语言编写的类和接口组成。
1.DriverManager类:管理不同的JDBC驱动。
2.Connection接口:与特定数据库连接。
3.Statement接口:执行sql。
4.PreparedStatement接口:执行sql。
5.ResultSet接口:接收查询结果。
二、JDBC搭建
1.在工程目录下新建 lib 目录,将需要的jar包复制到该目录下。
2.将jar包引入工程
idea中如何能够使用手动引入的第三方jar包:
File -> Project Structure -> Modules -> 选中要添加build path的项目 -> Dependencies -> 点击右边的小加号 -> 选择JARs or directories ->选择要添加的外部jar包。
三、编写程序
1.注册JDBC驱动程序
注册JDBC驱动程序:打开与数据库的通信通道,通过反射实现。
try {
// 1.注册JDBC驱动程序 :这需要初始化驱动程序,这样就可以打开与数据库的通信信道。
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2.建立与数据库连接
使用DriverManager.getConnection()方法来创建一个 Connection对象,它代表一个物理连接。
String user = "jdbc:mysql://localhost:3306/student_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai" ;
String userName="root";
String password="0521";
Connection con = DriverManager.getConnection(user,userName,password);
3.获得Satement执行sql语句
Statement中常用的方法:
1.int executeUpdate(String sql) 用于执行ddl语句和dml(增删改)
2.ResultSet executeQuery(String sql) 用于执行查询语句,返回一个ResultSet集合
Statement st = con.createStatement() ;
st.executeUpdate("INSERT INTO t_student(name,weight,height,stu_grade)values ('张五',140.1,175.1,5)");
String num="1 OR 1=1"; //sql注入攻击 因为1=1 一直成立 所以会把表中所有数据都给删除
st.executeUpdate("DELETE FROM t_student3 WHERE id="+num);
st.executeUpdate("UPDATE t_student SET weight=180.0,height=190.0 WHERE id=15");
4.获得PrepareStatement执行sql语句
PreparedStatement 中常用的方法:
1.int executeUpdate() 用于执行ddl语句和dml(增删改)
2.ResultSet executeQuery() 用于执行查询语句,返回一个ResultSet集合
获得PrepareStatement执行sql语句 在sql语句中参数位置使用占位符,使用setXX方法
//增
PreparedStatement pst1=con.prepareStatement("INSERT INTO t_student(name,weight,height,stu_grade,register)values (?,?,?,?,?)"); //增
pst1.setString(1,"金子豪");
pst1.setFloat(2,152.1f);
pst1.setFloat(3,178.1f);
pst1.setInt(4,3);
pst1.setObject(5,new Date());
pst1.executeUpdate();
//删
PreparedStatement pst2=con.prepareStatement("DELETE FROM t_student WHERE id=?");
String num="1 OR 1=1";
pst2.setString(1,num); //Data truncation: Truncated incorrect DOUBLE value: '1 OR 1=1'
// 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
pst2.executeUpdate();
//改
PreparedStatement pst3=con.prepareStatement("UPDATE t_student SET weight=?,height=? WHERE id=?");
pst3.setFloat(1,200.0f);
pst3.setFloat(2,200.0f);
pst3.setInt(3,5);
pst3.executeUpdate();
注意:执行完成后调用close方法关闭与数据库的链接通道。
pst1.close();
pst2.close();
pst3.close();
con.close();
四、PreparedStatement和Statement区别
1.虽然使用PreparedStatement比Statement多出几行代码,但是前者的可读性和可维护性更强,比直接用Statement高出很多档次。
2.PreparedStatement能防止sql注入,Statement不能。PreparedStatement采用预编译模式,每个占位符只能插入一个值。
Statement st = con.createStatement() ;
st.executeUpdate("INSERT INTO t_student(name,weight,height,stu_grade)values ('张五',140.1,175.1,5)");
String num="1 OR 1=1"; //sql注入攻击 因为1=1 一直成立 所以会把表中所有数据都给删除
st.executeUpdate("DELETE FROM t_student3 WHERE id="+num);
PreparedStatement pst2=con.prepareStatement("DELETE FROM t_student WHERE id=?"); //删
String num="1 OR 1=1";
pst2.setString(1,num); //Data truncation: Truncated incorrect DOUBLE value: '1 OR 1=1'
// 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
pst2.executeUpdate();
五、结果集处理
执行完查询语句后,通常我们需要对查询结果进行处理。executeQuery()方法会返回一个ResultSet对象,查询结果就封装在此对象中,
1.使用ResultSet的next()方法可以获取下一行数据
2.使用getXXX(String name)方法获得值
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String user = "jdbc:mysql://localhost:3306/student_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
String userName = "root";
String password = "0521";
con = DriverManager.getConnection(user, userName, password);
PreparedStatement pst1 = con.prepareStatement("SELECT\n" +
" id,\n" +
" NAME,\n" +
" weight,\n" +
" height,\n" +
" stu_grade,\n" +
" register\n" +
"FROM\n" +
" t_student\n" +
"WHERE id = ?");
pst1.setInt(1, num); //查询id号为num的对象的数据
ResultSet res = pst1.executeQuery();
while (res.next()) {
Student stu=new Student();
stu.setId(res.getInt("id"));
stu.setName(res.getString("name"));
stu.setWeight(res.getFloat("weight"));
stu.setHeight(res.getFloat("height"));
stu.setStu_grade(res.getInt("stu_grade"));
stu.setRegister(res.getTimestamp("register"));
myArray.add(stu);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
总结
本文主要讲解了JDBC的基本知识,包括什么是JDBC、JDBC的常用API、如何使用JDBC进行编程,以及如何在项目中使用JDBC。通过本章的学习,不仅可以了解到什么是JDBC,还能掌握JDBC操作数据库的步骤。