1.1、JDBC是什么?

JDBC是一种用于执行SQL语句的Java API。(Java Data Base Connectivity,java数据库连接),是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。

1.2、JDBC原理是什么?

驱动(实现类)用于连接和操作数据库,实现JDBC(接口规范),

Java提供访问数据库的规范称为JDBC,而生产厂商提供规范的实现类称为驱动。

JDBC的7个步骤:注册驱动,创建连接,创建statement对象,执行sql语句,处理结果集,释放资源,关闭连接。

1.3、JDBC的应用场景举例

现在市面上都在研发无人驾驶汽车.假如Google研发了自己的无人驾驶汽车,百度也研发了自己的无人驾驶汽车. 而且这些汽车对外都提供了一些函数,让程序员可以控制自己的汽车.

Oracle(Java语言的研发者)发现无人驾驶汽车很火,那么自己就指定了一组接口,约定:不论以后哪家公司研发无人驾驶汽车,必须遵循我的这组接口.否则是无法接入我们的JAVA生态圈的. 那么Oracle指定的这组驱动就相当于JDBC.

class  GoogleCar  implement  ICar{Public void start(){调用谷歌Car对外提供的函数start}Public void run(){调用谷歌Car对外提供的函数run}Public void stop(){调用谷歌Car对外提供的函数 stop}
}class  BaiDuCar  implement  ICar{Public void start(){调用百度Car对外提供的函数start}Public void run(){调用百度Car对外提供的函数run}Public void stop(){调用百度Car对外提供的函数 stop}
}ICar car=new GoogleCar();
car.start();
car.run();
car.stop();ICar car=new BaiDuCar();
car.start();
car.run();
car.stop();
//JDBC就是SUN早期设计的一组接口和部分类,这组接口主要约定了用JAVA语言操作各个不同数据仓库的规范.

1.4、JDBC对数据库增删改查操作举例

1.4.1、准备数据

#创建数据库
create database mydb;
#使用数据库
use mydb;
###创建分类表
create table category(cid int PRIMARY KEY AUTO_INCREMENT  ,cname varchar(100)
);
#初始化数据
insert into category (cname) values('家电');
insert into category (cname) values('服饰');
insert into category (cname) values('化妆品');

1.4.2、导入驱动jar包

创建lib目录,用于存放当前项目需要的所有jar包,选择jar包,右键执行build path / Add to Build Path

1.4.3、JDBC的7个开发步骤

1.注册驱动.
2.获得连接.
3.创建发送命令的Statement对象
4.执行sql语句
5.处理结果集
6.释放资源.
7.关闭连接

1.4.4、JDBC的实例代码

@Test
public void demo01() throws Exception{// 查询所有的分类信息// 注意:使用JDBC规范,采用都是 java.sql包下的内容//1 注册驱动Class.forName("com.mysql.jdbc.Driver");
//JDBC规范定义驱动接口:java.sql.Driver,MySql驱动包提供了实现类:com.mysql.jdbc.Driver//2 获得连接String url = "jdbc:mysql://localhost:3306/mydb";
//jdbc是固定的,其后是mysql数据库,ip地址、端口号、要连接的是哪个数据库名称Connection conn = DriverManager.getConnection(url, "root", "123456");
//连接数据库的url地址、用户名和密码//3创建语句执行者,也就是创建一个Statement对象,用来执行sql语句。Statement st = conn.createStatement();//4执行SQL语句,此处是查询语句ResultSet rs = st.executeQuery("select * from category");
/*
int executeUpdate(String sql); --执行insert delete update 语句,用于增删改操作.
ResultSet executeQuery(String sql); --执行select语句.用于查询操作
boolean execute(String sql); --执行select返回true 执行其他的语句返回false.用于判断操作。
*///5处理结果集while(rs.next()){// 依次获得每一行数据Integer cid = rs.getInt("cid");//获得cid字段列数据String cname = rs.getString("cname");//获得cname字段列数据System.out.println(cid + " , " + cname);}//6释放资源rs.close();st.close();//7关闭连接conn.close();
//与io流一样,关闭的顺序是先得到的后关闭}效果:
1...家电
2...服饰
3...化妆品

2.1、抽取的JDBCUtils工具类

“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,所以可以封装为工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。

JdbcUtils

package com.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*jdbc开发步骤:* 注册驱动* 创建连接* 创建statement* 执行sql语句* 处理结果集* 释放资源* 关闭连接*///JdbcUtils是由jdbc的7个步骤封装而成的工具类
//抽取出了注册驱动、创建连接、释放资源、关闭连接public class JdbcUtils {private static String driver="com.mysql.jdbc.Driver";private static String url="jdbc:mysql://localhost:3306/mydb";private static String username="root";private static String password="123456";static{try {//注册驱动Class.forName(driver);} catch (Exception e) {throw new RuntimeException(e);}}//创建连接public static Connection getConnection() throws Exception {Connection conn = DriverManager.getConnection(url,username,password);return conn;}//释放资源public static void closeResource(Connection conn,Statement st,ResultSet rs) {if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(st != null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

增删改查测试类

package com.jdbc;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;import org.junit.Test;
//JdbcUtils是由jdbc的7个步骤封装而成的工具类
//抽取出了注册驱动、创建连接、释放资源、关闭连接
//直接调用即可
public class demo2 {//插入数据@Testpublic void demo01() {Connection conn=null;Statement st=null;ResultSet rs=null;try {//获取连接conn=JdbcUtils.getConnection(); st = conn.createStatement();//插入数据int r=st.executeUpdate("insert into category(cname) values('测试')");//处理结果System.out.println(r);} catch (Exception e) {throw new RuntimeException(e);}finally{//无论如何都要释放资源、关闭连接JdbcUtils.closeResource(conn, st, rs);}}//修改数据@Testpublic void demo02() {Connection conn=null;Statement st=null;ResultSet rs=null;//获取连接try {conn=JdbcUtils.getConnection(); st = conn.createStatement();//插入数据int r=st.executeUpdate("update category set cname='测试2' where cid=4");//处理结果System.out.println(r);} catch (Exception e) {throw new RuntimeException(e);}finally{//无论如何都要释放资源、关闭连接JdbcUtils.closeResource(conn, st, rs);}}//删除数据@Testpublic void demo03() {Connection conn=null;Statement st=null;ResultSet rs=null;//获取连接try {conn=JdbcUtils.getConnection(); st = conn.createStatement();//插入数据int r=st.executeUpdate("delete from category where cid=5");//处理结果System.out.println(r);} catch (Exception e) {throw new RuntimeException(e);}finally{//无论如何都要释放资源、关闭连接JdbcUtils.closeResource(conn, st, rs);}}//查询所有@Testpublic void demo04() {Connection conn=null;Statement st=null;ResultSet rs=null;//获取连接try {conn=JdbcUtils.getConnection(); st = conn.createStatement();//查询所有rs=st.executeQuery("select * from category");//处理结果集while(rs.next()){Integer cid = rs.getInt("cid");String cname = rs.getString("cname");System.out.println(cid+"..."+cname);}} catch (Exception e) {throw new RuntimeException(e);}finally{//无论如何都要释放资源、关闭连接JdbcUtils.closeResource(conn, st, rs);}}//通过id查询一条数据@Testpublic void demo05() {Connection conn=null;Statement st=null;ResultSet rs=null;//获取连接try {conn=JdbcUtils.getConnection(); st = conn.createStatement();//查询所有rs=st.executeQuery("select * from category where cid=30");//处理结果集if(rs.next()){Integer cid = rs.getInt("cid");String cname = rs.getString("cname");System.out.println(cid+"..."+cname);}else{System.out.println("没有数据!");}} catch (Exception e) {throw new RuntimeException(e);}finally{//无论如何都要释放资源、关闭连接JdbcUtils.closeResource(conn, st, rs);}}
}

​​​​SQL注入问题:

SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。

假设有登录案例SQL语句如下:

SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’  OR ‘a’=’a时,则真正执行的代码变为:

SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。为此,我们使用PreparedStatement来解决对应的问题。

预处理对象​​​​​​​API详解:

PreparedStatement预处理对象,处理的每条sql语句中所有的实际参数,都必须使用占位符?替换。

String sql = "select * from user where username = ? and password = ?";

PreparedStatement使用,需要通过以下3步骤完成:

  1. PreparedStatement预处理对象代码:

#获得预处理对象,需要提供已经使用占位符处理后的SQL语句

PreparedStatement psmt = conn.prepareStatement(sql)

  1. 设置实际参数

void setXxx(int index, Xxx xx) 将指定参数设置指定类型的值

参数1:index 实际参数序列号,从1开始。

参数2:xxx 实际参数值,xxx表示具体的类型。

例如:

setString(2, "1234") 把SQL语句中第2个位置的占位符?替换成实际参数 "1234"

  1. 执行SQL语句:
int executeUpdate(); --执行insert update delete语句.ResultSet executeQuery(); --执行select语句.boolean execute(); --执行select返回true 执行其他的语句返回false.
package com.jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;import org.junit.Test;
/*为了预防sql注入问题:*  SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;* PreparedStatement预处理对象,处理的每条sql语句中所有的实际参数,都必须使用占位符?替换。* String sql = "select * from user where username = ? and password = ?";* 1、PreparedStatement psmt = conn.prepareStatement(sql);* 2、setString(2, "1234") 把SQL语句中第2个位置的占位符?替换成实际参数 "1234"* 3、执行sql语句*   int executeUpdate(); --执行insert update delete语句.*   ResultSet executeQuery(); --执行select语句.*    boolean execute(); --执行select返回true 执行其他的语句返回false.*/
public class demo3 {//插入数据@Testpublic void demo01() {Connection conn=null;PreparedStatement psmt=null;ResultSet rs=null;try {//1、获取连接conn=JdbcUtils.getConnection(); //2、处理sql语句String sql="insert into category(cname) values(?)";//3、获得预处理对象psmt=conn.prepareStatement(sql);//4、设置实际参数psmt.setString(1, "预处理");//5、执行sql语句int r = psmt.executeUpdate(sql);System.out.println(r);//处理结果System.out.println(r);} catch (Exception e) {throw new RuntimeException(e);}finally{//无论如何都要释放资源、关闭连接JdbcUtils.closeResource(conn, psmt, rs);}}//修改数据@Testpublic void demo02(){//修改Connection conn = null;PreparedStatement psmt = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();//1 sql语句String sql = "update category set cname = ? where cid = ?";//2 获得预处理对象psmt = conn.prepareStatement(sql);//3设置实际参数psmt.setString(1, "测试数据");psmt.setInt(2, 4);//4执行int r = psmt.executeUpdate();System.out.println(r);} catch (Exception e) {throw new RuntimeException(e);} finally{JdbcUtils.closeResource(conn, psmt, rs);}}//删除数据@Testpublic void demo03(){//删除Connection conn = null;PreparedStatement psmt = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();//1 sql语句String sql = "delete from category where cid = ?";//2 获得预处理对象psmt = conn.prepareStatement(sql);//3设置实际参数psmt.setInt(1, 4);//4执行int r = psmt.executeUpdate();System.out.println(r);} catch (Exception e) {throw new RuntimeException(e);} finally{JdbcUtils.closeResource(conn, psmt, rs);}}//查询所有@Testpublic void demo04(){//查询所有Connection conn = null;PreparedStatement psmt = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "select * from category";psmt = conn.prepareStatement(sql);rs = psmt.executeQuery();while(rs.next()){String cname = rs.getString("cname");System.out.println(cname);}} catch (Exception e) {throw new RuntimeException(e);} finally{JdbcUtils.closeResource(conn, psmt, rs);}}//通过id查询一条数据@Testpublic void demo05(){//通过id查询Connection conn = null;PreparedStatement psmt = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();String sql = "select * from category where cid = ?";psmt = conn.prepareStatement(sql);psmt.setInt(1, 2);rs = psmt.executeQuery();if(rs.next()){System.out.println("查询到");} else {System.out.println("查询不到");}} catch (Exception e) {throw new RuntimeException(e);} finally{JdbcUtils.closeResource(conn, psmt, rs);}}
}

05:JDBC的开发步骤,及其抽取的JDBCUtils工具类相关推荐

  1. 【JDBC】JDBCUtils工具类开发

    [JDBC]JDBCUtils工具类开发 1.JDBCUtils工具类开发 2.使用JdbcUtils工具类测试DML语句 3.使用JdbcUtils工具类测试查询语句 1.JDBCUtils工具类开 ...

  2. java 弹出软键盘_Android开发之弹出软键盘工具类简单示例

    本文实例讲述了Android开发之弹出软键盘工具类.分享给大家供大家参考,具体如下: package com.maobang.imsdk.util; import android.content.Co ...

  3. 解密android日志xlog,安卓开发技巧2:自定义日志工具类XLog的实现

    安卓开发技巧二:自定义日志工具类XLog的实现 我们在开发过程中,打印日志是必不可少的一个调试环节,然而,直接使用系统自带的Log日志类,并不能满足我们实际项目的需求:假如我们现在在开发一款比较大的项 ...

  4. android 软键盘工具类,Android开发之弹出软键盘工具类简单示例

    本文实例讲述了Android开发之弹出软键盘工具类.分享给大家供大家参考,具体如下: package com.maobang.imsdk.util; import android.content.Co ...

  5. java druid jdbc例子_JDBC【使用Druid连接数据库,DBUtils工具类的使用】

    Druid连接数据库,DBUtils工具类的使用 1.在maven中添加Druid依赖 com.alibaba druid 1.2.0 2.封装Druid连接方法 import com.alibaba ...

  6. JDBC 数据库连接池(JDBCUtils工具类)

    文章目录 前言 一.JDBC作用? 二.获取数据的连接方式 三.Statement/PreStatement执行sql 四.ResultSet结果集 五.JDBC相关API 六.事务 七.批处理 八. ...

  7. JDBC批量增加批量修改增删改查工具类

    JDBC工具类 package com.belle.infrastructure.util;import java.sql.Connection; import java.sql.PreparedSt ...

  8. android开发:播放音频功能的工具类

    播放音频功能的工具类 /*** 播放声音工具类* creator: ZZF* careate date: 2018/5/25 10:36.*/public class SoundUtils {priv ...

  9. JDBC基础篇(MYSQL)——自定义JDBCUtil工具类

    package util;import java.io.File; import java.io.InputStream; import java.sql.Connection; import jav ...

最新文章

  1. Directory lookup for the file xxx.mdf failed with the operating system error 2
  2. IT人的十八般武艺-序言
  3. 通用分页存储过程(sqlserver)
  4. 剑指offer之21-25题解
  5. Qt Supported Databases
  6. Erlang实战练习(一)
  7. 理解PPAPI的设计
  8. RHEL7平台下电信拨号上网配置
  9. CoinBene 满币荣获「2020 年度最佳品牌增长」大奖 未来可期
  10. 云集网上各种解决win10锁屏壁纸不能播放幻灯片的方法
  11. 点云IO篇之stl文件读写
  12. 二维码图片在微信无法识别(iOS)
  13. html 手机ar,vr与ar技术的区别有哪些
  14. vue脚手架项目使用element-ui
  15. NTP对时服务器(NTP电子时钟)在生物制药业应用
  16. 模拟输入H.264流,输出封装格式文件(API版)
  17. 车贷需要注意的问题,车贷风控流程这几点你必须知道
  18. CSS太阳地球月亮转圈圈loading
  19. 玩转 Python 与树莓派,教你毕业了如何回学校蹭网?
  20. 敏捷管理(1)- 什么是敏捷开发?为什么要采用敏捷?

热门文章

  1. .NET界面控件DevExpress全新发布v19.1.5|改进Office 2019主题
  2. Internet Graphics Server (IGS) - SAP NETWEAVER 图片服务
  3. 【91xcz】XP下无法清空回收站怎么办
  4. sq工程师是做什么的_【SQ工程师是什么职位】光宝电子(广州)有限公司2020年SQ工程师待遇怎么样-看准网...
  5. 约瑟夫问题与魔术(八)——魔术《四重巧合之金刚》
  6. 刑侦,考古,运维,程序员
  7. Android Studio实现小车简单运动动画
  8. 寻找图像中的局部极大点
  9. ziggurat matlab,使用 RandStream 管理全局流
  10. 前端React框架基础语法