jdbc概述
什么是jdbc?
java语言连接数据库的一套接口,jdbc是SUN公司定制的一套接口
为什么要SUN公司要制定一套接口?
每个数据库的底层实现原理不同,程序员要想使用java连接某一个数据库就需要遵循哪一个数据库的规范。设想,我们程序员如果想用另一个数据库,就要遵循另一个数据库的规范,这样非常的繁琐。
所以SUN公司制定一套接口,每个数据库厂家负责编写JDBC的实现类,这些实现类存储在jar包,这些jar包就是驱动。我们程序员面向JDBC接口写代码。
引用B站老杜的一张图来描述JDBC的本质:
用代码来解释JDBC本质
SUN公司制定的一套接口
public interface JDBC{ void getConnection();//SUN公司制定的JDBC接口 } //Mysql数据库公司实现JDBC接口 public class MySql implements JDBC{ public void getConnection(){ System.out.println("连接Mysql数据库成功"); } } //程序员面向JDBC接口编程 public class JavaProgrammer{ public static void main(String[] args){ JDBC jdbc = new Mysql();//多态 jdbc.getConnection; } }
JDBC开发前的准备工作
先从数据库官网下载对应的驱动jar包,以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。 IDEA有自己的配置方式。
eclipse引入jar包
新建项目,在项目下新建lib文件,lib文件下引入jar包,右键jar包,点击build path 点击 add to build path,在Web App Libraries下看到奶瓶形状的jar包就表示引入成功了
idea引入驱动
1.点击File,点击Project Structure
2.找到Libraires 点击+号 选择java
3.找到jar包路径选中即可
JDBC编程六步:
1.注册驱动(要连哪个品牌的数据库)
2.获取连接(使用完之后一定要关闭通道)
3.获取数据库操作对象(专门执行sql语句的对象)
4.执行sql语句
5.处理查询结果集(只有sql是select语句,才有这一步)
6.释放资源(必要)
代码演示:
package com.atdongli.java; import java.sql.*; public class JdbcTest { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try{ //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db01","root", "2020"); //3.获取数据库操作对象 stmt = conn.createStatement(); //4.执行sql语句 String sql = "select name,address from users where id = 2 or id = 3"; //5.处理查询结果集 // int executeUpdate(insert/delete/update) //增删改返回处理的数量 // ResultSet executeQuery(select) rs = stmt.executeQuery(sql); //专门执行查询语句 while(rs.next()) { //jdbc下标从1开始 //如果rs.next()为true 光标会指向结果集的下一行 来完成对结果集的遍历 String name = rs.getString("name"); //获取结果集的数据用rs.getString()方法:不论数据库中数据是什么类型 String address = rs.getString("address");//都以String类型形式取出 同理getInt() System.out.println(name + "," + address); } }catch(Exception e) { e.printStackTrace(); }finally { //6.释放资源 if(rs != null) { try { rs.close(); }catch(Exception e){ e.printStackTrace(); } } if(stmt != null) { try { stmt.close(); }catch(Exception e) { e.printStackTrace(); } } if(conn != null) { try { conn.close(); }catch(Exception e) { e.printStackTrace(); } } } } }
/* * 使用PreparedStatement代替Statement,实现对数据库的增删改查 * */ public class PrepareStatementTest { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; try{ //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db01","root", "2020"); System.out.println(conn); //3.编写sql语句返回preparedStatement的实例 String sql = "insert into users(name,address) values(?,?)"; //?:表示占位符 ps = conn.prepareStatement(sql); //4.填充占位符 ps.setString(1,"诸葛亮"); ps.setString(2, "三国"); //5.执行sql语句 ps.execute(); }catch(Exception e) { e.printStackTrace(); }finally { //6.释放资源 if(ps != null) { try { ps.close(); }catch(Exception e){ e.printStackTrace(); } } if(conn != null) { try { conn.close(); }catch(Exception e) { e.printStackTrace(); } } } } }
sql注入问题及解决
1.sql注入是什么?
用户输入的信息包含sql语句的关键字,并且这些关键字参与sql语句的编译过程,导致sql语句的意愿被扭曲,进而达到sql注入。
Statement有sql注入问题,才引出PreparedStatement。2.sql注入问题的解决
只要用户提供的信息不参与sql语句的编译过程,问题解决。既是用户提供的信息含sql语句的关键字,但没有参与编译,不起作用。要想解决sql注入,必须使用java.sql.PreparedStatement。PreparedStatement接口继承Statement,是属于预编译的数据库操作对象。原理是:预先对sql语句的框架进行编译,然后给sql语句传值。
关键是:用户提供的信息含sql语句的关键字,但没有参与编译,不起作用
对比Statement和PreparedStatement
Statement存在sql语句注入问题,PreparedStatement解决了此问题
Statement编译一次执行一次,PreparedStatement是编译一次可执行n次(前提是sql语句不变),PreparedStatement效率更高
PreparedStatement编译阶段做类型的安全检测
综上:PreparedStatement使用较多,只有极少数情况用Statement(必须使用sql语句拼接的,要用Statement)