02 JDBC

文章目录

  • JDBC
    • 1、JDBC概述
    • 2、JDBC快速入门
    • 3、JDBC API详解
    • 4、数据库连接池
    • 5、案例代码

JDBC

1、JDBC概述

  1. JDBC概念
    (1)JDBC 就是使用Java语言操作关系型数据库的一套API
    (2)全称:( Java DataBase Connectivity ) Java 数据库连接

  2. JDBC本质

    • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
    • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
    • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
  3. JDBC好处

    • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
    • 可随时替换底层数据库,访问数据库的Java代码基本不变

2、JDBC快速入门

  1. 导入驱动包

    • 将驱动包放入lib目录(自己创建)

    • 添加为库文件,设置有效范围

      • Global Library : 全局有效
      • Project Library : 项目有效
      • Module Library : 模块有效
  2. 编写代码步骤

-- 创建工程,导入驱动jar包-- 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");-- 2. 获取连接
Connection conn = DriverManager.getConnection(url, username, password);-- 3. 定义SQL语句String sql =update…” ;-- 4. 获取执行SQL对象
Statement stmt = conn.createStatement();-- 5. 执行SQL
int count = stmt.executeUpdate(sql); -- 返回影响行数-- 6. 处理返回结果
System.out.print(count);-- 7. 释放资源
stmt.close();
conn.close();
public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName("com.mysql.jdbc.Driver");//2. 获取连接String url = "jdbc:mysql://127.0.0.1:3306/db1";String username = "root";String password = "1234";Connection conn = DriverManager.getConnection(url, username, password);//3. 定义sqlString sql = "update account set money = 2000 where id = 1";//4. 获取执行sql的对象 StatementStatement stmt = conn.createStatement();//5. 执行sqlint count = stmt.executeUpdate(sql);//受影响的行数//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();}

第一版JDBC使用操作,共七个步骤

3、JDBC API详解

  1. DriverManager
    • 1.作用:
      (1) 注册驱动
      (2)获取数据库连接

    • 2.注册驱动:registerDriver(Driver driver)
      (1)DriverManager类中的静态代码块中已经执行了 DriverManagern对象的 registerDriver()n方法进行驱动的注册,只需要加载 Driver 类,该静态代码块就会执行
      (2)MySQL 5之后的驱动包,可以省略注册驱动的步骤,自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

    • 3.获取数据库连接:getConnection(string url,string user, string password)
      (1)url : 连接路径
      (2)user :用户名
      (3)poassword :密码

      语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
      示例:jdbc:mysql://127.0.0.1:3306/db1
      细节:

      • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
      • 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示

第二版JDBC使用操作,省略注册驱动步骤,剩六个步骤

  1. Connection

    • 作用
      (1)获取执行 SQL 的对象
      (2)管理事务
    • 获取执行对象
    // 三个方法
    // (1)普通执行SQL对象
    Statement createStatement()
    // (2)预编译SQL的执行SQL对象:防止SQL注入
    PreparedStatement  prepareStatement(sql)
    // (3)执行存储过程的对象
    CallableStatement prepareCall(sql) //存储过程在MySQL中不常用
    
    • 管理事务
    // (1)开启事务
    setAutoCommit(boolean autoCommit) 
    //true为自动提交事务;false为手动提交事务,即为开启事务
    // (2)提交事务
    commit()
    // (3)回滚事务
    rollback()
    
     try {// ============开启事务==========conn.setAutoCommit(false);//5. 执行sqlint count1 = stmt.executeUpdate(sql1);//受影响的行数//6. 处理结果System.out.println(count1);//5. 执行sqlint count2 = stmt.executeUpdate(sql2);//受影响的行数//6. 处理结果System.out.println(count2);// ============提交事务==========//程序运行到此处,说明没有出现任何问题,则需求提交事务conn.commit();} catch (Exception e) {// ============回滚事务==========//程序在出现异常时会执行到这个地方,此时就需要回滚事务conn.rollback();e.printStackTrace();}
    
  2. Statement

    • 作用:执行SQL语句
    • 执行DDL、DML语句:int executeUpdate(string sql)
    • 执行DQL语句:ResultSet executeQuery(string sql)
  3. ResultSet

    • ResultSet(结果集对象)作用:封装了SQL查询语句的结果
    • boolean next()
      (1)将光标从当前位置向前移动一行 ,然后判断当前行是否为有效行
      (2)true : 有效航,当前行有数据;false : 无效行,当前行没有数据
    • xxx getXxx(参数)
      (1)获取数据
      (2)xxx : 数据类型;如: int getInt(参数) ;String getString(参数)
      (3)int类型的参数:列的编号,从1开始
      (4)String类型的参数: 列的名称
// 3. 定义sql
String sql = "select * from account";
// 4. 获取statement对象
Statement stmt = conn.createStatement();
// 5. 执行sql
ResultSet rs = stmt.executeQuery(sql);
// 6. 处理结果, 遍历rs中的所有数据
// 6.1 光标向下移动一行,并且判断当前行是否有数据while (rs.next()){
// 6.2 获取数据  getXxx()//数据格式:id[int] name[String] money[double]//int id = rs.getInt(1);//String name = rs.getString(2);//double money = rs.getDouble(3);int id = rs.getInt("id");String name = rs.getString("name");double money = rs.getDouble("money");System.out.println(id);System.out.println(name);System.out.println(money);System.out.println("--------------");
}
  1. PreparedStatement
    • PreparedStatement作用:预编译SQL语句并执行——预防SQL注入问题

    • SQL注入
      (1)SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
      (2)例如:可以通过输入一些特殊的字符登陆到首页,用户名随意写,将密码写成' or '1' ='1,这就是SQL注入漏洞

    • PreparedStatement的使用

      // 1.获取 PreparedStatement 对象
      // SQL语句中的参数值,使用?占位符替代
      String sql = "select * from user where username = ? and password = ?";
      // 通过Connection对象获取,并传入对应的sql语句
      PreparedStatement pstmt = conn.prepareStatement(sql);// 2.设置参数值
      setXxx(参数1,参数2)
      //Xxx:数据类型,如 setInt (参数1,参数2)
      //参数1: ?的位置编号,从1 开始 | 参数2: ?的值// 3.执行SQL语句
      executeUpdate(); // 执行DDL语句和DML语句
      executeQuery(); // 执行DQL语句
      //不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。
      
       @Test
      public void testPreparedStatement() throws  Exception {//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url = "jdbc:mysql:///db1?useSSL=false";String username = "root";String password = "1234";Connection conn = DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name = "zhangsan";String pwd = "' or '1' = '1";// 定义sqlString sql = "select * from tb_user where username = ? and password = ?";// 获取pstmt对象PreparedStatement pstmt = conn.prepareStatement(sql);// 设置?的值pstmt.setString(1,name);pstmt.setString(2,pwd);// 执行sqlResultSet rs = pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println("登录成功~");}else{System.out.println("登录失败~");}//7. 释放资源rs.close();pstmt.close();conn.close();
      }
      
    • Java代码操作数据库流程
      在这里插入图片描述

      • 将sql语句发送到MySQL服务器端
      • MySQL服务端会对sql语句进行如下操作
        (1)检查SQL语句
        (2)编译SQL语句。将SQL语句编译成可执行的函数
        (3)执行SQL语句
    • PreparedStatement 好处

      • 预编译SQL,性能更高
        (1)检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如果我们只是重新设置参数,那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能
        (2)预编译功能默认关闭,需要主动开启
        (3)开启预编译功能:编写url时加上useServerPrepStmts=true
      • 防止SQL注入:将敏感字符进行转义
    • 配置MySQL执行日志(重启mysql服务后生效)
      在mysql配置文件(my.ini)中添加如下配置
      日志文件的存放位置可自行更改(第三、五句)

      log-output=FILE
      general-log=1
      general_log_file="D:\mysql.log"
      slow-query-log=1
      slow_query_log_file="D:\mysql_slow.log"
      long_query_time=2
      

第三版JDBC使用操作,用PreparedStatement替换Statement,多了一个参数设置步骤,共七个步骤

4、数据库连接池

  1. 数据库连接池简介

    • 介绍
      (1)数据库连接池是个容器,负责分配、管理数据库连接(Connection)
      (2)它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
      (3)释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
    • 好处
      (1)资源重用
      (2)提升系统响应速度
      (3)避免数据库连接遗漏
  2. 数据库连接池实现

    • 标准接口:DataSource
      (1)官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口
      (2)该接口提供了获取连接的功能:Connection getConnection()
      (3)以后就不需要通过 DriverManager 对象获取 Connection 对象,而是通过连接池(DataSource)获取 Connection 对象
    • 常见的数据库连接池
      (1)DBCP
      (2)C3P0
      (3)Druid
    • Druid(德鲁伊)
      (1)Druid连接池是阿里巴巴开源的数据库连接池项目
      (2)功能强大,性能优秀,是Java语言最好的数据库连接池之一
  3. Driud使用

    • 使用步骤

      • 导入jar包 druid-1.1.12.jar
      • 定义配置文件
      • 加载配置文件
      • 获取数据库连接池对象
      • 获取连接
    • 导入jar包

    • 定义配置文件

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

//1.导入jar包
//2.定义配置文件//3. 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));//4. 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 Connection
Connection connection = dataSource.getConnection();
System.out.println(connection); //获取到了连接后就可以继续做其他操作了

第四版JDBC使用操作,用连接池取代直接创建连接,还是七个步骤

5、案例代码

/*** 查询所有* 1. SQL: select * from tb_brand;* 2. 参数:不需要* 3. 结果:List<Brand>*/
@Test
public void testSelectAll() throws Exception {//1. 获取Connection//加载配置文件Properties prop = new Properties();prop.load(new FileInputStream("druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接ConnectionConnection conn = dataSource.getConnection();//2. 定义SQLString sql = "select * from tb_brand;";//3. 获取pstmt对象PreparedStatement pstm = conn.prepareStatement(sql);//4. 设置参数//5. 执行SQLResultSet rs = pstm.executeQuery();//6. 处理结果 List<Brand> 封装Brand对象,装载List集合Brand brand = null;List<Brand> brands = new ArrayList<>();while (rs.next()){//获取数据int id = rs.getInt("id");String brandName = rs.getString("brand_name");String companyName = rs.getString("company_name");int ordered = rs.getInt("ordered");String description = rs.getString("description");int status = rs.getInt("status");//封装Brand对象brand = new Brand();brand.setId(id);brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(ordered);brand.setDescription(description);brand.setStatus(status);//装载集合brands.add(brand);}System.out.println(brands);//7. 释放资源rs.close();pstm.close();conn.close();}

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

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

相关文章

docer笔记3

docker笔记3 容器基本命令 容器基本命令 下载镜像 docker pull cento新建容器并启动 docker run [可选参数] image# 参数说明 --name“Name” 容器名字 tomcat01 tomcat02 用来区分容器 -d 后台方式运行 -it 使用交互方式运行&#xff0c;进入容器查…

R-CNN 中的区域建议网络

区域建议网络&#xff08;Region Proposal Network&#xff0c;RPN&#xff09;是R-CNN&#xff08;Regions with Convolutional Neural Networks&#xff09;架构中的一个关键组件&#xff0c;特别是在Faster R-CNN中。RPN的主要任务是生成可能包含物体的区域提议&#xff0c;…

什么是机器学习以及机器学习如今的社会现状!!

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

用太空办公桌spacedesk把废旧平板利用起来

正文共&#xff1a;1500 字 15 图&#xff0c;预估阅读时间&#xff1a;2 分钟 这些年积攒了不少电子设备&#xff0c;比如我现在手头上还有6部手机、4台电脑、2个平板。手机的话&#xff0c;之前研究过作为Linux服务器来使用&#xff08;使用UserLAnd给华为平板装个Linux系统&…

Web 3.0革新:社交金融与边玩边赚开启用户数据主权时代

目录 Web 3.0与社交商业模式 传统社交平台的问题 去中心化社交创新 Mirror&#xff1a;去中心化内容发布平台 Lens Protocol&#xff1a;去中心化社交图谱 Maskbook&#xff1a;隐私保护的社交方式 Web 3.0与与边玩边赚模式 经济模型解析 新商业模式的探索 Axie Infi…

自然语言处理之RNN实现情感分类

前言 IMDB数据集经过分词处理后需要进行额外的预处理&#xff0c;包括将Token转换为index id&#xff0c;并统一文本序列长度。使用MindSpore.dataset接口进行预处理操作&#xff0c;包括text.Lookup和PadEnd接口。此外&#xff0c;还需要将label数据转换为float32格式。 模型…

Android中Activity生命周期详解

目录 一 典型情况二 异常情况2.1 系统配置改变2.2 系统资源不足kill掉低优先级activity Activity是四大组件之一&#xff0c;也是接触的最多的&#xff0c;一般来说Activity经常是与用户交互的界面。 一 典型情况 先看下google官网&#xff0c;其实已经很清楚了 再来个总结 …

mac docker no space left on device

mac 上 docker 拉取镜像报错 Error response from daemon: write /var/lib/docker/tmp/docker-export-3995807640/b8464f52498789c4ebbc063d508f04e8d2586567fbffa475e3cd9afd3c5a7cf2/layer.tar: no space left on device解决&#xff1a; 增加 docker 虚拟磁盘大小。如下图

(C语言) 文件读写基础

文章目录 &#x1f5c2;️前言&#x1f4c4;ref&#x1f4c4;访问标记&#x1f5c3;️文件访问标记 &#x1f5c2;️Code&#x1f4c4;demo&#x1f4c4;分点讲解&#x1f5c3;️打开/关闭&#x1f5c3;️写&#x1f5c3;️读 &#x1f5c2;️END&#x1f31f;关注我 &#x1f…

自学Java第11Day

学习目标&#xff1a;面向对象进阶 学习内容&#xff1a;包、final、权限修饰符、代码块、抽象类、接口 学习时间&#xff1a; 下午 3 点-下午 6 点 学习产出&#xff1a; 什么的包&#xff1f; 包就是文件夹。用来管理各种不同功能的Java类&#xff0c;方便后期代码维护。 包…

pycharm关闭项目时,页面卡住了,怎么办?

问题 在关闭pycharm时&#xff0c;有时会遇到卡在退出进度条的界面&#xff0c;很讨厌&#xff0c;那我们要怎么办才能退出呢&#xff1f; 说明&#xff1a;本篇文章不是从根源上解决这个问题&#xff0c;无法避免这种情况。 解决方法 方法一&#xff1a; 在卡住时&#xf…

python实现图像特征提取算法1

python实现Marr-Hildreth算法、Canny边缘检测器算法 1.Marr-Hildreth算法详解算法步骤公式Python 实现详细解释优缺点 2.Canny边缘检测器算法详解算法步骤公式Python 实现详细解释优缺点 1.Marr-Hildreth算法详解 Marr-Hildreth算法是一个用于图像边缘检测的经典算法&#xff…

思维+01背包,LeetCode LCP 47. 入场安检

一、题目 1、题目描述 「力扣挑战赛」 的入场仪式马上就要开始了&#xff0c;由于安保工作的需要&#xff0c;设置了可容纳人数总和为 M 的 N 个安检室&#xff0c;capacities[i] 记录第 i 个安检室可容纳人数。安检室拥有两种类型&#xff1a; 先进先出&#xff1a;在安检室中…

Git笔记:(上传Git、Git获取文件版本、删除、统计)

目录 一、上传文件到github 1.1 配置用户名和邮箱 1.2 初始化本地仓库 1.3 添加项目目录下所有文件至本地仓库 1.4 使用如下命令加入注释提交 1.5 将本地仓库与远程仓库相连接 1.6 将本地仓库中的文件推送至指定的远程仓库中 二、git获取不同版本 2.1 git下载特定历史…

【SpringBoot3】全局异常处理

【SpringBoot3】全局异常处理 一、全局异常处理器step1&#xff1a;创建收入数字的页面step2:创建控制器&#xff0c;计算两个整数相除step3:创建自定义异常处理器step5&#xff1a;创建给用提示的页面step6&#xff1a;测试输入&#xff08;10/0&#xff09; 二、BeanValidato…

【Python正则表达式】:文本解析与模式匹配

文章目录 1.正则表达式2. re模块3.修饰符3.元字符3-1 字符匹配元字符3-2 重复次数限定元字符3-3 字符集合匹配元字符3-4 分组元字符3-5 边界匹配元字符3-6 字符类别匹配元字符 4.技巧4-1 贪婪与非贪婪 5.案例 1.正则表达式 正则表达式面向什么样的问题&#xff1f; 1、判断一个…

【Linux】线程——线程互斥的概念、锁的概念、互斥锁的使用、死锁、可重入和线程安全、线程同步、条件变量的概念和使用

文章目录 Linux线程4. 线程互斥4.1 线程互斥的概念4.2 锁的概念4.2.1 互斥锁的概念4.2.2 互斥锁的使用4.2.3 死锁4.2.4 可重入和线程安全 5. 线程同步5.1 条件变量的概念5.2 条件变量的使用 Linux线程 4. 线程互斥 我们之前使用了线程函数实现了多线程的简单计算模拟器。 可以…

如何在 Android 中删除和恢复照片

对于智能手机用户来说&#xff0c;相机几乎已经成为一种条件反射&#xff1a;你看到值得注意的东西&#xff0c;就拍下来&#xff0c;然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办&#xff1f;众所周知&#xff0c;纸质快照拿在手里很难舍弃&#xff0c;而 Andro…

php通用防伪溯源查询系统可自定义字段

性能描述&#xff1a; 1. 适合中小规模查询&#xff0c;建议100万条以内(具体视服务器配置)。 2. 自定义前台是否使用验证码&#xff0c;即可以自行开启/关闭验证码。 3. 灵活支持N列内容&#xff0c;只要前几列按照规则;其余列均自定义内容。 4. 可单个新加&#xff0c;也…

【测开能力提升-fastapi框架】fastapi能力提升 - ORM增删改查操作

1 ORM操作 注释&#xff1a; fastapi缺少合适的ORM&#xff0c;官方推荐&#xff1a;sqlalchemy&#xff0c;但我们就不听官方的话&#xff0c;我们选择使用Tortoise ORM&#xff0c;因为他是支持异步的 1.1 tortoise ORM支持的数据库 PostgreSQL&#xff08;使用asyncpg&am…