高效掌握JDBC技术(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 高效掌握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语句中的某些判断条件失效

方式 特点 使用场景 实战建议

字符串拼接 可能被SQL注入攻击攻击 可以拼接表名、字段名、关键字 需要拼接关键字时使用,如:排序

?占位符 可以防止SQL注入攻击 不能对表名、字段名、关键字占位 通常使用都是占位符


五、面对异常


可能出现的异常:


类加载问题:Driver的路径不对

数据库、用户名、密码不对

sql语法错误:在sql下方打印该语句,查看语法问题

数据绑定不对:字符串拼接错误、?占位符赋值有误

获取结果集字段值时有误:检查字段顺序、字段名、数据类型

解决方案1:


先查看控制台的异常日志,锁定实际抛出异常的代码位置

结合报错的详细信息,分析出错原因

复杂问题,尝试百度

解决方案2:


通过输出语句的位置,锁定实际抛出异常的代码位置

分析出错原因

实战建议:


方案1+方案2


观察异常日志,锁定出错位置

结合报错的详细信息+输出语句,确定出错的原因

复杂问题,尝试百度

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
探索Java数据库连接的奥秘:JDBC技术全攻略
52 8
|
4月前
|
Java 数据库连接 API
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
59 3
|
4月前
|
存储 设计模式 搜索推荐
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
30 1
|
4月前
|
XML 前端开发 Java
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
27 0
|
4月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
【6月更文挑战第24天】Java的JDBC是连接数据库的标准,提供统一API访问多种数据库。本文涵盖JDBC的基本概念、核心组件(如DriverManager、Connection、Statement、PreparedStatement和ResultSet)和最佳实践。示例展示了如何用JDBC连接MySQL,执行查询并处理结果。最佳实践包括使用PreparedStatement防SQL注入,妥善管理资源,处理异常,使用事务以及优化性能。了解和掌握JDBC能提升数据库操作的效率和安全性。
36 0
|
4月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
【6月更文挑战第24天】Java的JDBC是连接Java和数据库的标准,提供统一的API访问各种数据库。核心组件包括DriverManager(加载驱动和创建连接)、Connection(表示数据库连接)、Statement(执行SQL)和PreparedStatement(参数化查询,防止SQL注入)。
30 0
|
4月前
|
SQL Java 关系型数据库
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
38 0
|
4月前
|
缓存 监控 druid
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
64 0
|
5月前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
5月前
|
SQL Java 关系型数据库
JDBC技术文章
JDBC技术文章