Java_Jdbc

news2024/11/14 21:40:07

目录

一.JDBC概述

二.JDBC API

三.ResultSet[结果集]

四.Statement 

 五.PreparedStatement

六. JDBC API 总结


一.JDBC概述

  1. JDBC 为访问不同的数据库提供了同一的接口,为使用着屏蔽了细节问题
  2. Java程序员使用JDBC 可以连接任何提供了  JDBC驱动的数据库系统,从而完成对数据库的各种操作
  3. JDKC的原理图
  4. 模拟JDBC  com.hspedy.jdbc.myjdbc

JDBC是java操作提供的一套用于数据库操作的接口API,java程序员只需要面向这套接口编程计科。不同的数据库厂商,需要针对这套接口,提供不同实现。

二.JDBC API

JDBC API 是一系列接口,她同一和规范了应用程序于数据的连接,执行SQL语句,并得到返回结果等各种操作,相关类和接口在java.sql与 javax.sql 包中 

 JDBC程序编写步骤

  1. 注册驱动   加载Driver类
  2. 获取连接  得到 connection
  3. 执行增删改查 发送相关的sql命令给mysql执行
  4. 释放资源    关闭相关的连接等

package com.tianedu.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author tian
 * 这是第一个JDBC程序 完成简单的操作
 */
public class Jdbc01 {
    public static void main(String[] args) throws SQLException {
        // 前置工作在项目下创建一个文件夹 libs
        // 将 mysql.jar 拷贝到该目录下,点击 add to project 加入到项目中才可以使用

        //1.注册驱动
        Driver driver = new Driver();  // 创建driver 对象
        //2.得到连接
        //(1)  jdbc: // 规定好的协议,通过jdbc的方式连接mysql
        //(2)  localhost 主机,也可以是ip地址
        //(3) 3306 表示MySQL 监听的端口
        //(4) hsp_db03 表示连接到呢个数据库
        // (5) MySQL的连接本质就是前面学习过sql 的连接
        String url = "jdbc:mysql://localhost:3306/hsp_db03";
        // 将用户名和密码 放到Properties 对象中
        Properties properties = new Properties();
        // 说明: user 和 password 是规定好的,后面的值根据实际情况写
        properties.setProperty("user","root"); // 用户
        properties.setProperty("password","tian"); //密码

        Connection connect = driver.connect(url, properties);
        //3.执行sql语句
        //String sql = "insert into actor values(null,'刘德华','男','1970-11-11',110)";
        // String sql = "update actor set name = '周星驰'where id = 1";
        String sql = "delete from actor where id = 1";
        // 下面的statement 用于执行静态的sql 语句并返回其生成的结果的对象
        Statement statement = connect.createStatement();
        int rows =  statement.executeUpdate(sql);  // 如果是dml语句,返回的就是影响行数 如果是1 添加成功 如果是0 添加失败
        System.out.println(rows > 0 ? "成功":"失败");
        //4.关闭资源
        statement.close();
        connect.close();
    }
}

获取数据库连接5种方式

package com.tianedu.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author tian
 * 分析java 连接MySQL的物种方式
 */
public class JdbcConn {
    @Test
    public void connect01() throws SQLException {
        Driver driver = new Driver();
        String url = "jdbc:mysql://localhost:3306/hsp_db03";
        // 将用户名和密码放入到Properties 对象
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "tian");
        Connection connect = driver.connect(url, properties);
        System.out.println(connect);
    }
    //方式2
    @Test
    public void connect02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        //使用反射加载Driver 动态加载,更加灵活,减少依赖性
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver)aClass.newInstance();
        String url = "jdbc:mysql://localhost:3306/hsp_db03";
        // 将用户名和密码放入到Properties 对象
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "tian");

        Connection connect = driver.connect(url, properties);
        System.out.println("方式2=" + connect);
    }
    // 方式3 使用DriverManager 替代 Driver 进行统一管理
    @Test
    public void connect03() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
        // 使用反射 加载Driver
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver  = (Driver) aClass.newInstance();
        //创建 url 和 user 和 password
        String url = "jdbc:mysql://localhost:3306/hsp_db03";
        String user = "root";
        String password = "tian";
        DriverManager.registerDriver(driver);  //注册Driver 驱动
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第三种方式" + connection);
    }
    // 方式4   使用Class.forName 自动完成注册,简化代码
    // 使用最多
    @Test
    public void  connect04() throws ClassNotFoundException, SQLException {
       // 使用反射加载 Driver 类
        // 在加载Driver类时,完成注册
        /*
            源码: 1.静态代码块,在类加载时,会执行一次
            2.DriverManager.registerDriver(new Driver());
            3.因此 加载和注册Driver 的工作已经完成
            static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
         */

        Class.forName("com.mysql.jdbc.Driver") ;  //如果没有这句也可以执行,建议写上更加明确
        // MySQL 驱动 5.1.6 可以无需Class.forName("com.mysql.jdbc.Driver");
        // 从 jdk1.5 以后使用Jdbc4 不在需要显示调用class.forName() 注册驱动而已自动调用驱动
        // jar包下META-INF\services\java.sql.Driver文本种的类 名称去注册
        String url = "jdbc:mysql://localhost:3306/hsp_db03";
        String user = "root";
        String password = "tian";
        Connection connection = DriverManager.getConnection(url,user,password);
        System.out.println("第四种方式" + connection);
    }
    @Test
    // 方式5,在方式4的基础上改进,增加配置文件,让信息连接MySQL更加灵活
    public void connect05() throws IOException, ClassNotFoundException, SQLException {
        //通过Properties 对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        // 获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver); //建议写上 更加明确
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("方式5" + connection);
    }
}

三.ResultSet[结果集]

  1. 表示数据库结果的数据表,通常通过执行查询数据库的语言生成
  2. ResultSet对象保持一个光标指向其当中的数据行,最初,给光标位于第一行之间
  3. next方法将光标移动到下一行,并且由于在ResultSet对象种没有更多行时返回false,因此可以在while 循环中使用循环来遍历结果集
package com.tianedu.jdbc.resultest_;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * @author tian
 *
 * 演示select 语句返回一个resultset 并取出结果
 */
@SuppressWarnings({"all"})
public class ResultSet_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        //通过Properties 对象获取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        // 获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver); //建议写上 更加明确
        Connection connection = DriverManager.getConnection(url, user, password);
        //得到Statement
        Statement statement = connection.createStatement();
        //组织sql 语句
        String sql = "select id,name,sex,borndate from actor";
        //执行给定的sql语句,该语句返回单个 ResultSet对象
        ResultSet resultSet = statement.executeQuery(sql);
        // 使用where 循环取出数据
        while (resultSet.next()) {
            // 让光标向后移动 如果没有更多的记录则返回false
       int id =  resultSet.getInt(1);
            String name = resultSet.getString(2);// 获取该行第二列
            String sex = resultSet.getString(3);
            Date date = resultSet.getDate(4);
            System.out.println(id + "\t" + name + "\t" + sex + "\t" + date);
            // 获取该行的对第一列
        }
        // 关闭连接
        resultSet.close();
        connection.close();
        statement.close();

    }
}

四.Statement 

  1. statement 对象 用于执行静态SQL语句返回生成的结果的对象
  2. 在连接建立后,需要对数据库进行访问,执行命令或是sql 语句,可以通过 Statement【存在sql注入】,PerparedStatement【预处理】,CallableStatement【存储过程】
  3. Statement对象执行sql语句,存在sql 注入风险
  4. sql 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的sql 语句或命令,恶意攻击数据库。sql_injection.sql
  5. 要防范sql注入,只要用PerparedStatement(从Statement 扩展而来)取代Statement 就可以了
package com.tianedu.jdbc.statement_;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import java.util.Scanner;

/**
 * @author tian
 * 演示statement 的注入问题
 */
@SuppressWarnings({"all"})
public class Statement_ {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        //让用户输入管理员姓名和密码
        System.out.print("请输入管理员的名字:");
        String admin_name = scanner.nextLine(); //next当接受到空格或者 ' 表示结束
        System.out.print("请输入管理员的密码:");
        String admin_pwd = scanner.nextLine();
        // 通过Properties 对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        // 获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        //1.注册驱动
        Class.forName(driver);

        //2.得到连接
        Connection connection = DriverManager.getConnection(url,user,password);
        //3.得到Statement
        Statement statement = connection.createStatement();
        //4.组织sql
        String sql = "select name,pwd from admin where name = '"
                +admin_name+"' and pwd= '"+admin_pwd+"'" ;
        ResultSet resultSet = statement.executeQuery(sql);
        if(resultSet.next()){
            //如果查询到一条记录,则说明该管理员存在
            System.out.println("登录成功");
        } else  {
            System.out.println("对不起,登录失败");
        }
        // 关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }

}

 五.PreparedStatement

  1. PreparedStatement 执行的sql语句中的参数用问号(?)来表示,调用PerparedStatement 对象的setXxxx() 方法来设置这些参数。setXxx() 方法有两个参数,第一个参数是要设置的sql语句中的索引(从1开始),第二个是设置的sql 语句中的参数值
  2. 调用 executeQuery() 返回ResultSet 对象
  3. 调用 executeUpdate(): 执行更新,包括增,删,修改

 预处理好处

  1. 不在使用 + 拼接sql语句,减少语法错误
  2. 有效的解决了sql注入问题
  3. 大大减少了编译次数,效率较高
package com.tianedu.jdbc.preparedstatement_;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Properties;
import java.util.Scanner;

/**
 * @author tian
 *
 * 演示 preparedStatement使用
 */
@SuppressWarnings({"all"})
public class PreparedStatementDML_ {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        //让用户输入管理员姓名和密码
        System.out.print("请输入添加的名字:");
        String admin_name = scanner.nextLine(); //next当接受到空格或者 ' 表示结束
       // System.out.print("请输入管理员的密码:");
        //String admin_pwd = scanner.nextLine();
        //通过Properties
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));

        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");

        // 注册驱动
        Class.forName(driver);
        //得到连接
        Connection connection = DriverManager.getConnection(url,user,password);
        // 组织sql sql语句的 ? 相当于占位符
       // 添加一个记录
        //String sql = "insert into admin values(?,?)";
        //String sql = "update admin set pwd = ? where name = ?";
        String sql = "delete from admin where name = ?";
        //3.2 preparedStatement 对象实现了 preparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3 给?赋值
        preparedStatement.setString(1,admin_name);
        //preparedStatement.setString(1,admin_pwd);
        //4.执行DML 语句使用 executeUpdate
        int rows = preparedStatement.executeUpdate();
        System.out.println(rows > 0 ? "执行成功":"执行失败");
        //关闭连接
        preparedStatement.close();
        connection.close();
    }
}

六. JDBC API 总结

  • Driver Manager 驱动管理类  getConnection(url,user,pwd) 获取连接
  • Connection 接口  creatStatement 创建Statement 对象(使用较少,存在注入问题)                 preparedStatement(sql) 生成一个预处理对象
  • Statement 接口   executeUpdate(sql) 执行dml语句 返回影响得到行数                                       executeQuery(sql) 执行查询,返回ResultSet对象                                                                      execute(sql) 执行任意的sql 返回的是布尔值
    • PreparedStatement 接口  excuteUpdate() 执行Dml语句                                                    excuteQuery() 执行查询   返回ResultSet                                                                    excute() 执行任意的sql 返回一个布尔值                                                                              setXxx(站位符索引,占位符的值) 可以解决sql 注入                                                        setObject(站位符的索引,站位符的值)                                                                                  ResultSet(结果集)  next() 方法向下移动一行     同时如果没有下一行,返回false              previous() 向上移动一行                                                                                                      getXX(列的索引 | 列名)         返回对应类的值 接受类型是Xxx                                            getObject(列的索引 | 列名)  返回对应列的值,接受类型为object                                       

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

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

相关文章

(缺省参数)(函数重载)(引用)(内敛)(C++中的nullptr)

&#xff08;缺省参数&#xff09;&&#xff08;函数重载&#xff09;&&#xff08;引用&#xff09;&&#xff08;内敛&#xff09;&&#xff08;atuo用法&#xff09;&&#xff08;C中的NULL&#xff09; 1.缺省参数1.1缺省参数的概念1.2缺省参数的分类1…

谈谈电商App的压测

背景 最近恰逢双十一&#xff0c;大大小小的电商app在双十一之前都会做一次压测&#xff0c;曾经在小公司工作的时候很想知道大公司是如何压测的&#xff0c;有什么高深的压测工具没&#xff0c;本文就来揭露一下 压测真相 在确认使用什么压测工具进行压测之前&#xff0c;我…

(※)力扣刷题-栈和队列-用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。 说明: 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empt…

R6G alkyne, 6-isomer可在反应中作为底物或催化剂发挥作用

试剂 | 基础知识概述&#xff08;部分&#xff09;: 英文名&#xff1a;R6G alkyne, 6-isomer 分子式&#xff1a;C30H29N3O4 分子量&#xff1a;495.57 Ex &#xff1a;518nm Em&#xff1a;542nm 规格标准&#xff1a;10mg、25mg、50mg&#xff0c;可提供mg级以及kg级的…

系统架构师备考倒计时16天(每日知识点)

1.信息化战略与实施 2.UML图&#xff08;12个&#xff09; 3.结构化设计&#xff08;耦合&#xff09; 4.SMP与AMP的区别&#xff08;多核处理器的工作方式&#xff09; 多核处理器一般有SMP和AMP两种不同的工作方式: SMP(对称多处理技术)&#xff1a;将2颗完全一样的处理器封…

24---WPF缓存

一、什么是缓存&#xff1a; 1.缓存指的是将需要频繁访问的网络内容存放在离用户较近、访问速度更快的系统中&#xff0c;以提高内容访问速度的一种技术。缓存服务器就是存放频繁访问内容的服务器。 2.缓存就是一个临时存放区域--离用户比较近 二、作用--意义---如果系统出现故…

郭明錤修正预测:苹果第二代AirTag推迟2025年量产

10月19日&#xff0c;知名分析师郭明錤调整今年8月关于苹果第2代AirTag的预测&#xff0c;表示该产品量产时间从先前预测的2024年Q4延迟至2025年&#xff0c;并进一步推迟新款上市日期。 AirTag是苹果公司推出的一款蓝牙设备&#xff0c;配合苹果设备的“查找”APP&#xff0c…

【综述】Diffusion Models: A Comprehensive Survey of Methods and Applications

Diffusion Models: A Comprehensive Survey of Methods and Applications 论文&#xff1a;https://arxiv.org/abs/2209.00796 github&#xff1a;https://github.com/YangLing0818/Diffusion-Models-Papers-Survey-Taxonomy 目录 Diffusion Models: A Comprehensive Survey…

双指针——复写零

一&#xff0c;题目要求 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不要从函数返回任何东…

【Java基础面试三十一】、String a = “abc“; ,说一下这个过程会创建什么,放在哪里?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;String a “abc”; &am…

web:[极客大挑战 2019]HardSQL

题目 打开页面显示为 查看源代码没有发现其他的提示信息&#xff0c;随便尝试一下 错误 题目名为hardsql&#xff0c;先来尝试有无sql注入存在 尝试输入单引号输入 显示页面存在注入 这里按照常规思路继续使用order by函数和union select函数进行查询&#xff0c;但是页面没有…

019-第三代软件开发-Git提交规范

第三代软件开发-Git提交规范 文章目录 第三代软件开发-Git提交规范项目介绍Git提交规范分支规范Commit Message FormatHeaderBodyFooterRevert 总结一下 关键字&#xff1a; Qt、 Qml、 git、 Commit、 release 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个…

【三维重建】DreamGaussian:高斯splatting的单视图3D内容生成(原理+代码)

文章目录 摘要一、前言二、相关工作2.1 3D表示2.2 Text-to-3D2.3 Image-to-3D 三、本文方法3.1生成式 高斯 splitting3.2 高效的 mesh 提取3.3 UV空间的纹理优化 四. 实验4.1实施细节4.2 定性比较4.3 定量比较4.4 消融实验 总结&#xff08;特点、局限性&#xff09; 五、安装与…

【MySQL系列】- Select查询SQL执行过程详解

【MySQL系列】- Select查询SQL执行过程详解 文章目录 【MySQL系列】- Select查询SQL执行过程详解一、SQL查询语句的执行过程二、SQL执行过程详解2.1. 连接器2.2. 查询缓存2.3. 分析器2.4. 优化器2.5. 执行器 三、undo log 和 redo log作⽤3.1. redo log &#xff08;重做日志&a…

面试算法31:最近最少使用缓存

题目 请设计实现一个最近最少使用&#xff08;Least Recently Used&#xff0c;LRU&#xff09;缓存&#xff0c;要求如下两个操作的时间复杂度都是O&#xff08;1&#xff09;。 get&#xff08;key&#xff09;&#xff1a;如果缓存中存在键key&#xff0c;则返回它对应的值…

lunux查找占用内存前10的进程

1、使用Top命令查询进程 输入 top 命令&#xff0c;然后按下大写M按照内存MEM排序&#xff0c;按下大写P按照CPU排序。 2、查询占用CPU最高的前10个进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 3|head 3、查询占用内存最大的前10个进程 ps aux|head -1;ps aux|grep …

Visual Studio Code官网下载、vscode下载很慢、vscode下载不了 解决方案

前言 开发界的小伙伴们对于Visual Studio Code开发环境来可以说非常熟悉了&#xff0c;但由于在Visual Studio Code官网的下载速度非常的慢&#xff0c;即便开了代理也是一样的很慢、甚至下载被中断&#xff0c;几乎不能下载。 解决方案 1、在Web浏览器上打开vscode官网&#…

日常中msvcp71.dll丢失怎样修复?分享5个修复方法

在 Windows 系统中&#xff0c;msvcp71.dll 是一个非常重要的动态链接库文件&#xff0c;它承载了许多应用程序和游戏的运行。如果您的系统中丢失了这个文件&#xff0c;那么您可能会遇到无法打开程序、程序崩溃或出现错误提示等问题。本文将介绍 5 个快速修复 msvcp71.dll 丢失…

最新视频/图集去水印小程序源码/步数小程序源码/王者战力小程序源码/红包封面小程序源码

自带多平台解析接口 短视频去水印图集水印小程序源码 &#xff0c;这是一款支持多种平台去水印的一款微信小程序源码 支持短视频去水印&#xff0c;还有图集去水印等。内含多平台去水印接口&#xff0c;响应的速度也是非常的快&#xff0c;这是一款非常值得推荐的一款小程序源…

2008-2021年上市公司实体企业金融化程度测算数据(原始数据+stata代码)

2008-2021年上市公司实体企业金融化程度测算&#xff08;原始数据stata代码&#xff09; 1、时间&#xff1a;2008-2021年 2、指标&#xff1a;股票代码、年份、交易性金融资产、衍生金融资产、发放贷款及垫款净额、可供出售金融资产净额、持有至到期投资净额、长期债权投资净…