高效掌握JDBC技术

一、JDBC概述

JDBC:Java数据库连接技术

通过Java后台代码连接数据库对数据库内容进行增删改查

1、为什么要学习JDBC?

navicat也可以连接数据库对数据进行增删改查,但是并不能定制化用户数据,所以并不完全使用实战开发

但是JDBC可以通过后台的其他代码完整用户数据的定制化

2、JDBC涉及到的API

Driver:驱动接口 定义了Java如何与数据库建立连接
DriverManager 驱动管理工具类 管理驱动,可以用来获取数据库连接
Connection 连接接口 代表了Java和数据库的联系
PreparedStatement 发送SQL的工具接口 用来像数据库发送一条执行SQL
Resultset 结果集接口 用来接受查询SQL的执行结果

3、JDBC的特点

它是一个规范,不是一个实现
JDBC中只有接口,并没有提供实现

二、JDBC的编码步骤

1、navicat操作数据库的步骤

加载和启动软件
建立连接
打开新建查询,准备书写sql
书写SQL并执行
查看执行结果
关闭软件窗口

2、JDBC操作数据库的六大步

加载驱动
获取连接
书写SQL并准备发送SQL的工具
发送SQL
处理结果集(只限查询)
释放相关资源

3、JDBC的步骤实现

搭建开发环境

导入指定jar包
右键项目,新建一个名为lib的文件夹
将mysql-connector-java-8.0.23.jar复制到文件夹中
右键jar包,点击add as library

通过代码实现JDBC六大步

public class JDBCTest { //这里的抛出的异常应该包含驱动、连接、sql异常等 public static void main(String[] args) throws Exception{ //1. 加载驱动,必须正确的在lib文件夹下导入jar包 Class.forName("com.mysql.cj.jdbc.Driver"); //2. 获取连接 //用户名 String username = "root"; //密码,是自己数据库的密码,不一定都是root String pwd = "root"; //连接的url,只要修改问号前的数据库名为自己的即可(当前为2109) String url = "jdbc:mysql://localhost:3306/2109?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url, username, pwd); //3. 准备发送SQL的工具 //往学生表中添加一条学生信息 String sql = "insert into t_student(stu_name,stu_age,stu_sex,stu_class,stu_place) VALUES('lisi',18,'男','二年级','新乡')";
        PreparedStatement ps = conn.prepareStatement(sql); //4. 发送执行SQL int n = ps.executeUpdate();//执行SQL,增删改返回受影响条数 if(n>0){ //实际上n就是navicat里插入时显示的受影响的行数 System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        } //5. 结果集 略,查询操作才会用到 //6. 释放资源 ps.close(); //先关小的资源 conn.close(); //后关大的资源 }
}

三、 结果集的处理

ResultSet:结果集

底层原理:指针操作,类似Iterator迭代器

next():判断是否存有下一元素

getXxx(int类型的列的顺序,从1开始):获取某个字段的值

getXxx(“字段名”):获取某个字段的值

Xxx:表示字段的数据类型,首字母大写
指定字段名更常用,更清晰

//前面两步的数据库的加载驱动以及连接省略 //3. 准备发送sql String sql = "select * from t_student";
        PreparedStatement ps = conn.prepareStatement(sql); //4. 发送sql并执行 ResultSet rs=ps.executeQuery(); //5. 处理结果集 while (rs.next()){//当拥有下一元素时,才进入循环 //获取字段的值 int stuId = rs.getInt(1); String stuName = rs.getString(2);
            int stuAge = rs.getInt(3); String stuSex = rs.getString("stu_sex"); String stuClass = rs.getString("stu_class"); String stuplace = rs.getString("stu_place"); //输出查看 System.out.println(stuId+" "+stuName+" "+stuAge+" "+stuSex+" "+stuClass+" "+stuplace);
        } //6. 释放资源   由于rs是在ps的基础上存在的,因此先关rs的资源 rs.close();      
        ps.close();
        conn.close();

四、数据绑定

将用户输入的数据,绑定到SQL中

1、字符串拼接

在需要使用用户数据的位置,通过对应变量替换
如果为非字符串类型:"+变量名+"
如果为字符串类型(包含日期及枚举):' "+变量名+" '

package com.bz.test; public class JDBCTest { public static void main(String[] args) throws Exception{ //1. 加载驱动 //2. 获取连接 //3. 准备发送SQL的工具,前三步省略 //往学生表中添加一条学生信息 //接收用户信息 Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name=sc.next();
        System.out.println("请输入你的年龄:"); int age=sc.nextInt();
        System.out.println("请输入你的性别(男/女):");
        String sex=sc.next();
        System.out.println("请输入你的年级:");
        String clazz=sc.next();
        System.out.println("请输入你的地区:");
        String place=sc.next(); //根据用户填写的信息,书写SQL String sql = "insert into t_student(stu_name,stu_age,stu_sex,stu_class,stu_place) VALUES('"+name+"',"+age+",'"+sex+"','"+clazz+"','"+place+"')"; //输出sql System.out.println(sql);

        PreparedStatement ps = conn.prepareStatement(sql); //4. 发送执行SQL int n = ps.executeUpdate();//执行SQL,增删改返回受影响条数 if(n>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        } //5. 结果集  略 //6. 释放资源  略 }
}

2、 ?占位符

是JDBC中的一种特殊语法,作用为进行数据绑定
使用方法:
在需要使用用户数据的位置,通过?代替(占位)
在发送SQL之前,给占位符依次赋值
setXxx(占位符的序号(从1开始),占位符对应的值)

package com.bz.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner;

public class JDBCTest {
    public static void main(String[] args) throws  Exception{ //1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2. 获取连接 //用户名 String username = "root"; //密码 String pwd = "root"; //连接的url String url = "jdbc:mysql://localhost:3306/2109?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url, username, pwd); //3. 准备发送SQL的工具 //往学生表中添加一条学生信息 //接收用户信息 Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的姓名:"); String name=sc.next();
        System.out.println("请输入你的年龄:");
        int age=sc.nextInt();
        System.out.println("请输入你的性别(男/女):"); String sex=sc.next();
        System.out.println("请输入你的年级:"); String clazz=sc.next();
        System.out.println("请输入你的地区:"); String place=sc.next(); //根据用户填写的信息,书写SQL String sql = "insert into t_student(stu_name,stu_age,stu_sex,stu_class,stu_place) VALUES(?,?,?,?,?)";
        
        PreparedStatement ps = conn.prepareStatement(sql); //给占位符赋值 ps.setString(1,name);
        ps.setInt(2,age);
        ps.setString(3,sex);
        ps.setString(4,clazz);
        ps.setString(5,place); //4. 发送执行SQL int n = ps.executeUpdate();//执行SQL,增删改返回受影响条数 if(n>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        } //5. 结果集  略 //6. 释放资源 ps.close();
        conn.close();
    }
}

两种数据绑定的区别

SQL注入攻击:利用填写数据巧妙使SQL语句中的某些判断条件失效



五、面对异常

可能出现的异常:

类加载问题:Driver的路径不对
数据库、用户名、密码不对
sql语法错误:在sql下方打印该语句,查看语法问题
数据绑定不对:字符串拼接错误、?占位符赋值有误
获取结果集字段值时有误:检查字段顺序、字段名、数据类型

解决方案1:

先查看控制台的异常日志,锁定实际抛出异常的代码位置
结合报错的详细信息,分析出错原因
复杂问题,尝试百度

解决方案2:

通过输出语句的位置,锁定实际抛出异常的代码位置
分析出错原因

实战建议:

方案1+方案2

观察异常日志,锁定出错位置
结合报错的详细信息+输出语句,确定出错的原因
复杂问题,尝试百度

#Java##程序员#
全部评论
非常感谢楼主的分享,很有用
点赞 回复 分享
发布于 2022-09-15 20:22 陕西

相关推荐

2025-12-24 08:50
已编辑
上海工程技术大学 数据分析师
9.21-28参加第一轮七牛云秋招项目比赛,三人组队做一个AI角色对话网站。我们的目标是争取拿offer和前16名的奖金(最低500元)10.11打电话通知我们准备参加终面10.14参加终面(官网上说就一次终面),面试官为技术人员。我们来回路程4小时。10.23打电话通知我们,进了前20,10.27还有一次路演面试,评出前16名10.27再次参加终面,面试官为高管。来回路程4小时,告知我们一周内出结果。10.31在群里询问是否出结果,没有回复。11.5公司人员告知第一批有一波通知结果了,另外还有一波。11.12一位队员收到offer,两位队员被拒绝,评奖没消息。12.2在群里询问公司人员是否有消息,一位公司人员退群,没有回复。12.4在群里询问公司人员是否有消息,说是会帮忙反馈。12.12我们打听到HR主动告知某位参赛选手获奖500元。12.13在群里询问是否有消息,公司人员说在最终确认中,近期会联系,或者通过官网了解情况。12.23在群里询问是否有结果,公司人员告知没有获奖。————分割线————图1图2为群里聊天记录,图3为奖项设置,可怜的学生党为了个offer和500块都被硬拖3个月。我说实话辛苦了一周做项目参加比赛,没有offer,没有获奖也是做好心理准备的,但是不能这么无视我们的消息,并且拖着我们三个月吧。所有的方案、代码、产品说明文档等等参赛资料都是公开透明提交给公司的,我在的群参赛者大群是第11个,200多人,最多三人一队,有两批比赛,所以至少上百个队伍,上百个方案吧,很难说不是白嫖这么大规模的方案和创意。中间在群里问比赛结果,每次要么是不回复,要么是说问问负责人,还在确定中等等,然后就拖着。10月23号前20都已经出来了,排个名次要整整2个月吗?一直到今天12月23号跟我们说没获奖(不知道是不是因为队员没有接受他们offer的原因,给的薪资白菜价,所以队员拒绝了offer)官网说的第一批十月中旬公布结果,结果到现在花了3个月时间,之前有别人说是不是来窃取创意的,我还说这么大公司不至于吧。现在看来就是来白嫖方案的,做项目做了一个星期,后面又花精力,又花时间的做PPT搞了两次终演,最后因为队伍不是公司招聘候选,所以这么无视我们?
程序员小白条:七牛云好几年这样的事情了,这玩意都是潜规则搞好的,没啥,能有这能力的,说实话也不去七牛云了
秋招落幕,你是He or...
点赞 评论 收藏
分享
评论
3
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务