JDBC API详解

news2024/11/16 23:32:00

文章目录

  • 入门案例
  • DriverManager
  • Connection
  • Statement
  • ResultSet
  • PreparedStatement
  • 数据库连接池
  • 完整代码

入门案例

package jdbc;

import java.sql.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //3.定义sql
        String sql ="update sc set Grade=95 where Sno=15202101";
        //4.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //5.执行sql
        int cout=stmt.executeUpdate(sql);//受影响行数
        //6.处理结果
        System.out.println(cout);
        //7.释放资源
        stmt.close();
        conn.close();

    }
}

DriverManager

驱动管理类,作用:1. 注册驱动 2. 获取数据库连接

  1. 注册驱动:MySql 5之后的注册驱动可以不写,所以上面的代码注册驱动部分可以省略。
  2. 获取连接
Connection conn=DriverManager.getConnection(url,username,password);

url:连接路径,语法 jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/test2
在这里插入图片描述
user:数据库用户名 password:数据库密码

Connection

数据库连接对象,作用:
1.获取执行SQL的对象 2.管理事物
在这里插入图片描述

//获取连接conn
Connection conn=DriverManager.getConnection(url,username,password);
//用conn获取sql的执行对象stmt 
Statement stmt=conn.createStatement();

在这里插入图片描述

import java.sql.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql1 ="update sc set Grade=95 where Sno=15202101";
        String sql2 ="update sc set Grade=75 where Sno=15202102";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();

        try {
            //开启事物
            conn.setAutoCommit(false);//改为手动提交
            //4.执行sql
            int cout1=stmt.executeUpdate(sql1);
            int i=3/0;
            int cout2=stmt.executeUpdate(sql2);
            //5.处理结果
            System.out.println(cout1);
            System.out.println(cout2);
            //提交事物
            conn.commit();
        }catch (Exception throwables){
            conn.rollback();//回滚到开启事物那里
            throwables.printStackTrace();
        }
        //6.释放资源
        stmt.close();
        conn.close();
    }
}

Statement

作用:执行SQL语句。
在这里插入图片描述
DML:对数据的增删改 DDL:对表和数据库的增删改 DQL:对数据的查询

//对数据的增删改
public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="update sc set Grade=95 where Sno=15202101";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        int cout=stmt.executeUpdate(sql);
        //5.处理结果
        if(cout>0){
            System.out.println("修改成功");
        }else{
            System.out.println("修改失败");
        }
        //6.释放资源
        stmt.close();
        conn.close();
    }
}

//对数据库和表的增删改
public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="create database db2";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        int cout=stmt.executeUpdate(sql);
        //5.处理结果
        //执行DDL语句时,就算执行成功,cout返回可能也是0
        //所以不能按之前的方法判断执行成功与否
        //6.释放资源
        stmt.close();
        conn.close();
    }
}

ResultSet

结果集对象,作用:封装了DQL查询语句的结果
ResultSet result=stmt.executeQuery(sql);
在这里插入图片描述

使用步骤:
1.游标向下移动一行并判断该行是否有数据。
2.获取数据:getXxx(参数)
在这里插入图片描述

import java.sql.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="select * from sc";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        ResultSet rs=stmt.executeQuery(sql);
        //5.处理结果(遍历rs中的所有数据)
        //5.1光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()){
            //5.2获取数据
            String Sno=rs.getString(1);
            String Cno=rs.getString(2);
            int Grade=rs.getInt(3);
            System.out.println("Sno:"+Sno+"  "+"Cno:"+Cno+"  "+"Grade:"+Grade);
        }
        //6.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

关于上面rs获取表中数据部分,还有另外一种写法:

        //5.处理结果(遍历rs中的所有数据)
        //5.1光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()){
            //5.2获取数据
            String Sno=rs.getString("Sno");
            String Cno=rs.getString("Cno");
            int Grade=rs.getInt("Grade");
            System.out.println("Sno:"+Sno+"  "+"Cno:"+Cno+"  "+"Grade:"+Grade);
        }

案例
在这里插入图片描述

import java.sql.*;
import java.util.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="select * from sc";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        ResultSet rs=stmt.executeQuery(sql);
        //创建集合
        List<Accout> list=new ArrayList<>();
        //5.处理结果(遍历rs中的所有数据)
        while (rs.next()){
            Accout accout=new Accout();
            String Sno=rs.getString(1);
            String Cno=rs.getString(2);
            int Grade=rs.getInt(3);

            //赋值
            accout.setSno(Sno);
            accout.setCno(Cno);
            accout.setGrade(Grade);

            list.add(accout);
        }
        //查看集合中数据
        Iterator<Accout> it=list.iterator();
        while (it.hasNext()){
            Accout s=it.next();
            System.out.println(s);
        }
        //6.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

PreparedStatement

作用:预编译SQL语句并执行,预防SQL注入问题
SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

简单的用户登录环节,连接数据库

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //接收用户输入的用户名和密码
        String name="";
        String pwd="";

        String sql ="select * from tb_user where username='"+name+"' and password='"+pwd+"'";
        ResultSet rs=stmt.executeQuery(sql);

        //判断是否登录成功
        if(rs.next()){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

        //释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

而SQL注入说的是,例如当密码输入的是’or ‘1’='1时,会将那条SQL语句改成了恒为1,则一直登录成功。
在这里插入图片描述
在这里插入图片描述
如何解决SQL注入?
出现SQL注入的根本原因是拼字符串环节存在bug。
所以实际生产中要避免拼接字符串,用?来代替。
在这里插入图片描述
通过setXxx()的方法来给?设置数值。
所以将Statement类改用PreparedStatement类。

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //接收用户输入的用户名和密码
        String name="";
        String pwd="";

        String sql ="select * from tb_user where username=? and password=?";
        PreparedStatement pstmt=conn.prepareStatement(sql);
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);
        ResultSet rs=pstmt.executeQuery();

        //判断是否登录成功
        if(rs.next()){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

        //释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }
}

数据库连接池

简介:是一个容器,负责分配、管理数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲数据超过最大空间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
好处:1. 资源重复利用。 2. 提示系统响应速度。 3. 避免数据库连接遗漏。
在这里插入图片描述

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;

public class connectionTest {
    public static void main(String[] args) throws Exception {
        //导入jar包 druid-1.1.12.jar
        //定义配置文件 druid.properties
        //加载配置文件
        Properties prop=new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        //获取连接池对象
        DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接
        Connection connection=dataSource.getConnection();
        System.out.println(connection);
    }
}

完整代码

druid.properties文件信息:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test2?useSSL=false&useServerPrepStmts=true
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

查询

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;

public class connectionTest {
    public static void main(String[] args) throws Exception {
        //导入jar包 druid-1.1.12.jar
        //定义配置文件 druid.properties
        //加载配置文件
        Properties prop=new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        //获取连接池对象
        DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接
        Connection connection=dataSource.getConnection();

        String sql1="select * from sc where Sno=?";
        System.out.println("请输入要查询的学号:");
        Scanner sc=new Scanner(System.in);
        String uSno=sc.next();

        //获取PreparedStatement对象
        PreparedStatement pstmt=connection.prepareStatement(sql1);
        pstmt.setString(1,uSno);

        //执行sql
        ResultSet rs=pstmt.executeQuery();

        Accout accout=new Accout();
        List<Accout> list=new ArrayList<>();
        //处理结果
        while (rs.next()){
            String Sno=rs.getString(1);
            String Cno=rs.getString(2);
            int Grade=rs.getInt(3);

            accout.setSno(Sno);
            accout.setCno(Cno);
            accout.setGrade(Grade);
            list.add(accout);
        }
        Iterator<Accout> it=list.iterator();
        while (it.hasNext()){
            Accout a=it.next();
            System.out.println(a);
        }
        //释放资源
        rs.close();
        pstmt.close();
        connection.close();
    }
}

插入数据

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;

public class connectionTest {
    public static void main(String[] args) throws Exception {
        //导入jar包 druid-1.1.12.jar
        //定义配置文件 druid.properties
        //加载配置文件
        Properties prop=new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        //获取连接池对象
        DataSource dataSource=DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接
        Connection connection=dataSource.getConnection();

        String sql1="insert into sc values (?,?,?)";
        System.out.println("请输入要插入的数据:");
        Scanner sc=new Scanner(System.in);
        String uSno=sc.next();
        String uCno=sc.next();
        int uGrade=sc.nextInt();

        //获取PreparedStatement对象
        PreparedStatement pstmt=connection.prepareStatement(sql1);
        pstmt.setString(1,uSno);
        pstmt.setString(2,uCno);
        pstmt.setInt(3,uGrade);

        //执行sql
        int cout=pstmt.executeUpdate();
        //处理结果
        if(cout>0){
            System.out.println("更新成功");
        }else{
            System.out.println("更新失败");
        }
        //释放资源
        pstmt.close();
        connection.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Revit二次开发小技巧(十六)寻找最短路径

最近遇到一个需求&#xff0c;指定两个配电箱&#xff0c;然后找到两个配电箱之间最短的桥架路径。运用了Dijkstra算法去计算最短路径&#xff0c;以配电箱实体、三通、四通为节点&#xff0c;简化中间弯头计算的方式。 背景 选择起点和终点的配电箱&#xff0c;找到最短的桥架…

RingUI + JCEF开发IDEA插件

文章目录RingUI知识储备示例插件实现逻辑开发环境开发流程新建一个IDEA插件项目新建一个前端项目验证前端项目丰富前端项目丰富插件内容RingUI This collection of UI components aims to provide all the necessary building blocks for web-based products built inside JetB…

向 Windows 高级用户进阶,这 5 款效率工具帮你开路

工欲善其事&#xff0c;必先利其器。作为全球最多人使用的桌面操作系统&#xff0c;Windows 的使用效率与我们的工作学习息息相关。今天&#xff0c;小编就为大家整理了 10 款提高效率的利器&#xff0c;让你的 Windows 更具生产力。 1.文件预览——Seer MacOS 有一个非常方便…

优雅草YYC松鼠短视频2022年12月28日更新v5.1.6版本更新·修复因为消息提醒二开导致菜单栏无法显示·进一步完善推送

优雅草YYC松鼠短视频2022年12月28日更新v5.1.6版本更新修复因为消息提醒二开导致菜单栏无法显示进一步完善推送 更新日志 修复因为消息提醒二开导致菜单栏无法显示 继续进一步开发消息推送 目前消息推送登录以及推送判断返回刷新仍存在问题在开发中 目前goeasy官方也在更新关…

数据劫持基础

数据劫持数据劫持原理。属性描述符Object.defineProperty官网响应式原理![在这里插入图片描述](https://img-blog.csdnimg.cn/b9f900484f314334a0dc6139428b397c.png)getter和setterObject.defineProperty的不足proxy工作原理总结数据劫持原理。 数据劫持&#xff0c;指的是在…

Find My资讯|苹果 Find My 找到因交通事故坠崖的一名女子

美国加州圣贝纳迪诺县消防局在其官方 Facebook 更新动态&#xff0c;表示在接到家属报警&#xff0c;通过苹果 Find My 功能追踪家人的 iPhone&#xff0c;成功营救出在圣贝纳迪诺山区的 18 号高速公路上坠崖的一名妇女。 圣贝纳迪诺县消防局在帖子中表示这名妇女在圣诞节那天…

多线程与高并发(三)

【 day3课前复习 】&#xff1a; 【AtomicInteger】&#xff1a; 原子性——都是用CAS机制来实现。 【 expected , update 】: //有时候也会写三个值——你要修改的那个对象。 expected——期望值。&#xff08;旧值&#xff09; update——更新值。&#xff08;新值&#…

LeetCode刷题复盘笔记—一文搞懂动态规划之剑指 Offer 46. 把数字翻译成字符串问题(动态规划系列第三十四篇)

今日主要总结一下动态规划的一道题目&#xff0c;剑指 Offer 46. 把数字翻译成字符串 题目&#xff1a;剑指 Offer 46. 把数字翻译成字符串 Leetcode题目地址 题目描述&#xff1a; 给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &am…

小型云台机械手的制作

1. 运动功能说明 小型云台机械手&#xff0c;下方的云台可以提供左右旋转和上下摆动的动作&#xff0c;与舵机夹爪配合可以完成简单的抓取和搬运。 2.结构说明 该样机由一个 R207小型舵机云台 上串联了一个 舵机夹爪模组 构成。 3. 运动功能实现 3.1 电子硬件 在这个示例中&a…

Redis集群系列五 —— 分区/片概念

什么是分区 分区就是将所存储的数据按照一定的规则存储在不同的存储服务或介质上&#xff0c;通过降低单服务或介质的数据量级来提升数据处理能力&#xff0c;从而达到拥有数据处理横向扩容的能力的目的。 还可简单的理解为分区就是将数据拆分到多个 Redis 实例的过程&#xf…

21. 合并两个有序链表播报文章

题目描述 这是一道难度为简单的题目&#xff0c;同时&#xff0c;这道题也是Leetcode148题中&#xff0c;链表归并排序中重要的组成部分。 题目描述 题目分析 本题的题目简单易懂&#xff0c;输入为两个有序链表&#xff0c;要求将链表合并为一个有序的链表。在此不在再赘述…

【消息中间件】RocketMQ如何实现Producer的负载均衡

目录 一、前言 二、实现Producer的负载均衡 1、负载均衡选取一条消息队列并且高可用 1.1、模拟随机递增取模消息队列数为5 1.2、模拟随机递增取模消息队列数为6 1.3、判断Broker代理是否可用 2、更新故障项维护startTimestamp字段 2.1、退避运算 2.2、更新故障项维护st…

干货 | 数字经济创新创业——数字经济下的商业模式与解决方案

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

卷积、转置卷积、膨胀卷积学习记录

Conv计算&#xff1a; 计算公示 1、pytorch中默认参数&#xff0c;以conv1d为例 torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_mode‘zeros’, deviceNone, dtypeNone&#xff09; 2、输出卷积尺寸&am…

MySQL常见内置函数及其使用

目录 1、聚合函数 2、日期函数 3、字符串函数 4、数学函数 5、其它函数 1、聚合函数 函数说明 COUNT([DISTINCT] expr) 返回查询到的数据的 数量SUM([DISTINCT] expr)返回查询到的数据的 总和&#xff0c;不是数字没有意义AVG([DISTINCT] expr)返回查询到的数据的 平均值…

数据蛙恢复软件替代产品有哪些?15款顶尖数据恢复软件清单

数据蛙恢复软件是一款国内数据恢复软件&#xff0c;可以在很多品牌的电脑上使用。但是你可能会遇到数据蛙恢复软件扫描不到需要恢复文件的情况。那么有没有更专业的数据恢复软件可以找到更多误删数据&#xff1f;本文将为你介绍最值的推荐的15个数据蛙恢复软件替代产品。 丢失…

Web兼容性测试的要点

对于网页的兼容性我们主要考虑的是各种浏览器对前台页面的兼容性&#xff0c;因为浏览器对页面的影响是最大的。 现在浏览器的种类越来越多&#xff0c;网页中展现出来的内容也越来越丰富&#xff0c;这些内容包括网页中的字体、图片、动画等&#xff0c;而且有些内容需要网页…

AlexNet学习笔记(2)

里面 有些东西 对于现在来说都是错误的 而且由大量的细节对于现在来说没有必要 而且是过度的enginnering 一篇论文的第一段通常是讲一则故事 我们在做什么研究 哪个方向 有什么东西然后为什么很重要 正则化 regularization好像没有那么重要&#xff0c;并不是最关键的 最关键…

前端监控系统的搭建

UI自动化测试库 puppeteer&#xff1a;https://zhuanlan.zhihu.com/p/524254998 - google出品 cypress - 据说比puppeteer好用 前端监控体系 性能监控 异常监控 行为监控&#xff1a;埋点体系 主动监控 被动监控 前端性能数据捕获&#xff1a; 打点方式&#xff0c;结…

pyqt5 QPainter绘制图形,并旋转

PyQt5 的绘图系统使用户可以在屏幕或打印设备上用相同的 API 绘图&#xff0c;QPainter 是用来进行 绘图操作的类&#xff0c;一般的绘图设备包括 QWidget、QPixmap、QImage 等&#xff0c;这些绘图设备为 QPainter 提供了一个“画布” QWidget 类是所有界面组件的基类&#xf…