jdbc的学习

2023-11-05

操作数据库的基本步骤

  •  1.引入依赖  注册驱动
     2.获取连接对象    如何获取数据库的连接?
     3.获取发送sql语句的对象  发送sql语句
     4.处理结果集
     5.释放资源
    

1.0 原始版本

  •     public static void main(String[] args) throws SQLException {
      		 // 创建驱动对象
              Driver driver = new Driver();
    // 注册驱动
              DriverManager.registerDriver(driver);
              
              /**
               *  获取连接  url   user  password    http://www.baidu.com/login.html
               *  url:  数据库的通信地址  jdbc:mysql://localhost:3306/java2216
               *  user:  数据的用户名  root
               *  password:  用户密码  root
               */
              String url = "jdbc:mysql://localhost:3306/java2216?useSSL=false";
              String username = "root";
              String password = "root";
    //获取数据库的连接
              Connection connection = DriverManager.getConnection(url, username, password);
              System.out.println("connection = " + connection);
      
    // 通过连接获取发送sql语句的对象  Statement
              Statement statement = connection.createStatement();
              //编写sql
              //String sql = "SELECT  *  FROM  user   WHERE id = 1";
              String sql = "SELECT  *  FROM  user ";
              // 发送sql语句到mysql数据库
              ResultSet resultSet = statement.executeQuery(sql);
    // 处理结果集  resultSet  resultSet.next()  查询数据结果集中是否还有下一条数据
              // 创建集合 存储查询结果中封装的数据
              ArrayList<User> users = new ArrayList<>();
              while (resultSet.next()){
                  //获取当前记录中字段值  根据字段值的数据类型获取
                  int id = resultSet.getInt("id");  //  通过字段名获取
                  String uname = resultSet.getString(2);  //  通过字段的列索引
                  String pwd = resultSet.getString("password");
                  User user = new User().setId(id).setPassword(pwd).setUsername(uname);
                  users.add(user);
                  //System.out.println("user = " + user);
              }
      
              // 遍历集合
              //users.forEach(user-> System.out.println("user = " + user));
      
              for (User user : users) {
                  System.out.println(user);
              }
    // 释放资源
              resultSet.close();
              statement.close();
              connection.close();
          }
      }
    

2.0 封装JDBCUtil工具类(快速的获取连接 和释放资源)

  •    public class JDBCUtil {
    
      	    private JDBCUtil(){}   //防止被外部类new一个JDBCUtil
      	
      	    private static String username;
          	private static String driverClassName;
      	    private static String password;
      	    private static String url;
      	
      	    static {  //  执行一次 类加载时
      	        ResourceBundle file = ResourceBundle.getBundle("jdbc");
      	        driverClassName = file.getString("driverClassName");
      	        url = file.getString("url");
      	        username = file.getString("username");
      	        password = file.getString("password");
      	    }
      	
      	
      	    //获取数据库连接的方法
      	    public  static Connection  getConnection(){
      	        //通过反射注册驱动
      	        Connection connection = null;
      	        try {
      	            Class.forName(driverClassName);
      	            connection = DriverManager.getConnection(url, username, password);
      	        } catch (Exception e) {
      	            e.printStackTrace();
      	        }
      	        return connection;
      	    }
      	
      	    //释放资源
      	    public static  void  closeAll(Connection connection, Statement statement, ResultSet resultSet){
      	
      	        if(resultSet!=null){
      	            try {
      	                resultSet.close();
      	            } catch (SQLException throwables) {
      	                throwables.printStackTrace();
      	            }
      	        }
      	
      	        if(statement!=null){
      	
      	            try {
      	                statement.close();
      	            } catch (SQLException throwables) {
      	                throwables.printStackTrace();
      	            }
      	        }
      	
      	        if(connection!=null){
      	
      	            try {
      	                connection.close();
      	            } catch (SQLException throwables) {
      	                throwables.printStackTrace();
      	            }
      	        }
      	    }
      	}
    
  • 模拟用户登录和注册
      		public class UserService {
      		
      		    // 用户登录
      		    public  Boolean login(User user){
      		        //根据用户信息 查询数据库  1.数据库中存在用户信息 登录成功    jdbc查询数据库
      		        // 获取连接
      		        Connection connection = JDBCUtil.getConnection();
      		        Statement statement = null;
      		        ResultSet resultSet = null;
      		        try {
      		             statement = connection.createStatement();
      		            String sql = "select *  from user where username= '"+user.getUsername()+"' and password = '"+user.getPassword()+"'";
      		            System.out.println("sql = " + sql);
      		            resultSet = statement.executeQuery(sql);
      		            return  resultSet.next();
      		        } catch (SQLException throwables) {
      		            throwables.printStackTrace();
      		        }finally {
      		            JDBCUtil.closeAll(connection, statement, resultSet);
      		        }
      		        return  false;
      		    }
      		
      		    // 用户注册
      		    public  Boolean register(User user){
      		
      		        Connection connection = JDBCUtil.getConnection();
      		        try {
      		            Statement statement = connection.createStatement();
      		            String sql = "insert into user(username,password)values('"+user.getUsername()+"','"+user.getPassword()+"')";
      		            System.out.println("sql = " + sql);
      		            int i = statement.executeUpdate(sql);
      		            return  i>0;
      		        } catch (SQLException throwables) {
      		            throwables.printStackTrace();
      		        }
      		        return  false;
      		    }
    

3.0 解决sql注入

  • 创建PreparedStatement 对象发送sql语句解决sql注入问题
    
    	@Test
    	public void test(){
          Connection connection = JDBCUtil.getConnection();
          PreparedStatement preparedStatement = null;
          ResultSet resultSet = null;
          // 使用 ? 进行参数的占位
          String sql = "select *  from user  where username = ? and password = ? " ;
          //创建PreparedStatement 对象时 需要传递sql语句 因为该对象会将sql语句进行预编译
          try {
               preparedStatement = connection.prepareStatement(sql);
              // 在preparedStatement 执行sql语句之前 需要将sql语句中的参数设置好
              preparedStatement.setString(1, "zhangsan");
              preparedStatement.setString(2, "8888");
    
              //通过 preparedStatement对象 执行sql语句
              resultSet = preparedStatement.executeQuery();
              User user = null;
              while(resultSet.next()){
    
                  String username = resultSet.getString(2);
                  String password = resultSet.getString(3);
                  user = new User().setPassword(password).setUsername(username);
              }
              System.out.println("user = " + user);
          } catch (SQLException throwables) {
              throwables.printStackTrace();
          }finally {
              JDBCUtil.closeAll(connection,preparedStatement,resultSet);
          }
      }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdbc的学习 的相关文章

  • T-sql、刻度、时间戳

    是否有可能在 t sql 中获得像 DateTime Ticks 这样的 C 内容 感谢帮助 您不太可能从 SQL 中获得与 DateTime Ticks 相同的精度 因为 SQL 不能以那么高的精度表达时间 SQL Server 只存储大
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • INNER JOIN 可用作 SELECT,但不能用作 DELETE [重复]

    这个问题在这里已经有答案了 为什么这个有语法错误 DELETE FROM print mailing request pmr INNER JOIN person p ON p id pmr person AND p email LIKE T
  • 部署 dacpac 所需的权限

    我正在尝试使用 sqlpackage exe 在租户上部署 dacpac 目前 我正在向将部署此功能的帐户授予 SysAdmin 或 db owner 权限 并且它工作正常 但在生产中 如果目标租户数据库属于其他应用程序 我可能无法获得这些
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • SQLite 条件 ORDER BY 中的 DESC

    我需要选择按以下逻辑排序的记录 但是当 DESC 处于条件中时 SQLite 会引发错误 ORDER BY CASE WHEN parentGUID IS NULL THEN datePosted DESC ELSE datePosted
  • oracle中的区间函数

    Query SELECT INTERVAL 300 month INTERVAL 54 2 year to month INTERVAL 11 12 10 1234567 hour to second FROM DUAL 上述查询的输出是
  • 使用 LIMIT/OFFSET 运行查询并获取总行数

    出于分页目的 我需要使用以下命令运行查询LIMIT and OFFSET条款 但我还需要计算该查询将返回的行数 而不需要LIMIT and OFFSET条款 我想运行 SELECT FROM table WHERE whatever ORD
  • 在 Sql Server 中启用 DTD 支持

    我有各种 xml 文档需要存储在数据库列中 这些文档包含对 DTD 的引用 并且 SQL Server 不会导入 xml 因为它存在安全风险 如何在数据库上启用 DTD 支持 以便它可以让我插入 xml 内容 你必须CONVERT首先 MS
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • PLSQL 中的时区转换

    我需要将系统日期和时间转换为特定时区 例如东部时间 我无法假设我当前的时区 如何在plsql中转换它 请帮我 假设你有一个TIMESTAMP WITH TIME ZONE 例如systimestamp 您可以使用AT TIME ZONE句法
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 如何使用 SQL - INSERT...ON DUPLICATE KEY UPDATE?

    我有一个脚本可以捕获推文并将其放入数据库中 我将在 cronjob 上运行脚本 然后在我的网站上显示数据库中的推文 以防止达到 Twitter API 的限制 所以我不想在我的数据库中有重复的推文 我知道我可以使用 INSERT ON DU
  • 当您执行“SELECT *”时,SQL Server 如何确定列的顺序?

    当您执行以下操作时 SQL Server 如何确定列的顺序SELECT 我知道 订购依据 对于订购至关重要data 但我预计列名保持一致 注意 我的代码是not取决于返回列的实际顺序 我只想知道 SQL Server 如何决定对列名进行排序
  • Access 2013 SQL 中的转换和透视

    如何使用 TRANSFORM 和 PIVOT 函数从第一个表获取第二个表 TABLE 01 Config ID ConfigField ConfigValue 11 Name Basic 11 Version 1 01 11 Owner J
  • 使用输出在合并语句中设置变量

    我有一个合并语句应该始终更新或插入一条记录 我想记住变量中该语句的 ID 它看起来像这样 DECLARE int int MERGE dbo table AS A USING SELECT stringtomatch AS string A
  • 表被指定两次作为 INSERT 的目标和单独的数据源

    我做了这个查询 但它给了我错误 就像标题中一样 INSERT INTO data waktu vaksinasi id binatang id vaksin tanggal vaksin status vaksin VALUES 1 1 S
  • sql连接一个表中的两个字段

    我有一个预订表 其中有两个人 我想将 person 1 作为一行返回 将 person 2 作为新行返回 但该人的 id 与人员表相关 这是我所得到的 但没有提取预订信息 SELECT people FROM select booking
  • SQL 用随机数据填充表

    我有一个包含两个字段的表 id UUID 是主键并且 描述 var255 我想用SQL语句插入随机数据 我希望这个描述是随机的 PS 我正在使用 PostgreSQL 我不确定这是否符合 随机描述 的要求 也不清楚您是否想要生成完整的数据
  • SQL Server 为什么索引不与 OR 一起使用

    我一直在研究索引并试图了解它们是如何工作的以及如何使用它们来提高性能 但我错过了一些东西 我有下表 Person Id Name Email Phone 1 John E1 P1 2 Max E2 P2 我正在尝试找到对列进行索引的最佳方法

随机推荐

  • SQL注入自动化python脚本

    写了一个python3注入sql的脚本 临近毕业 尝试写一些自动注入和自动扫描的脚本 发现还是不够自动 后面我再改改 现在脖子疼 实现效果 代码如下 import requests from bs4 import BeautifulSoup
  • 2022 最新版本 Docker 学习_4.Docker 阿里云镜像配置 & 基本命令介绍

    一 Docker 阿里云镜像配置 上一篇博客中我们提到了 Docker Hub 镜像地址 这个也是 Docker 默认的镜像地址 但是因为服务器在国外 我们在国内访问速度比较慢 有时候甚至都打不开 Docker Hub 地址 Docker
  • mybatis 一对多映射问题

    问题描述 Could not set property roleList of class com ck mybatis model SysUser with value 当使用mybatis进行一对多查询使用collection 标签时出
  • nginx源码层面探究request_time、upstream_response_time、upstream_connect_time与upstream_header_time指标具体含义

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Android Studio: 模拟器启动失败解决(Emulator: Process finished with exit code 139)

    Android Studio 版本 3 4 2 CPU AMD Ryzen 7 3700x 8 core processor 16 OS ubuntu 18 04 错误log 下午6 05 Emulator statvfs home duq
  • 常见的排序算法——插入排序

    3 插入排序 1 基本思想 插入排序是将n个待排元素的序列看成两个表 分别为有序表和无序表 起初 有序表中只有一个元素 即下标为0的元素 无序表中含有 n 1个元素 即下标从1到n 1的元素 排序过程就是每次将无序表中的第一个元素拿出 然后
  • Visualgo -- 数据结构和算法动态可视化网站

    网址为 https visualgo net zh 这个网站涉及的算法十分全面 不仅支持多种算法可视化动态演示 还支持搜索 是学习算法的好帮手 推荐给大家
  • STL(四) std::string /std::wstring 查找、删除、替换(find erase replace)

    std string std wstring 类 在C 中是一个非常重要的存在 不管程序规模大小 很难避免不用到 功能很强大 但是总感觉距离 好用 还差了那么一点点 首先 需要明白一点 std string是STL中的一员 所以 有关stl
  • 盘点慢查询原因及优化方法

    目录 一 前言 二 准备 type重点看 三 慢查询原因和解决 1 sql未加索引 2 索引失效 3 limit深分页问题 1 limit深分页为什么会慢 2 深分页优化 4 in元素过多 5 join 或者子查询过多 6 order by
  • YARN与MapReduce1的区别

    YARN与MapReduce1的区别 1 组成对比 MapReduce1中 两类守护进程控制着作业执行过程 一个JobTracker和一个或多个TaskTracker JobTracker通过调度TaskTracker上运行的任务来协调所有
  • 【Linux】浅谈eloop机制

    目录 1 eloop 机制 2 eloop结构体 2 1 eloop data结构体 2 2 Socket事件结构体 2 3 Timeout事件结构体 2 4 Signal事件结构体 3 eloop init 4 eloop run 4 1
  • CGAL-5.6的安装与编译(Win10+vs2022+CGAL-5.6+Boost1.82.0)

    文章目录 前言 一 安装Boost 1 下载 2 环境变量 二 安装CGAL和GMP and MPFR libraries 1 下载 2 解压 3 环境变量 其他 参考 前言 CGAL是Computational Geometry Algo
  • 2023年副业赚钱最快的方法,最后一个时代红利,你一定要抓住!

    你有没有发现 生活中大部分的烦恼 归根结底只有一个原因 没钱 守着几千块的死工资 升职加薪难上加难 平时要为了省十几块钱不舍得打车 跟老公三天两头吵架 原因不过就是家里没钱给孩子报学费高昂的兴趣班 平时想买瓶香水都要费心思让老公送 出个远门
  • Java定时任务调度工具详解之Timer篇(初级)

    一 Timer简介 定时任务的基本概念 Timer的函数 综合运用和缺陷 基于给定的时间点 给定的时间间隔或者给定的执行次数自动执行的任务 Timer 和Quartz Timer 出身 由jdk提供 调用方式简单粗暴 能力 Timer能完成
  • 计算机内存只认4,为什么电脑的8GB内存只有7.45GB可用?

    今天偶遇到这样一个问题 本来8GB内存的笔记本系统却只有7 45GB可用 具体什么现象请看下图 丢失了0 55GB内存 为此我还特意百度了一下 得到这样的结果 电脑少的内存被核心显卡占用 核心显卡和系统共享内存是不错 但是我的这款i7 77
  • dac0832产生梯形波程序C语言,DAc0832产生三角波,正旋波,梯形波

    DAc0832产生三角波 正旋波 梯形波 换电路接成同相电压输出形式 其输出电压Vout IR 1 R2 R1 8 1 利用dac0832产生三角波 程序介绍 单片机通过DAC0832转换在LM358的7脚输 出三角波 实际应用如 函数波形
  • 2021年你一定要了解的概念——元宇宙

    2021年是元宇宙元年 随着VR AR 3D和脑机接口技术的不断进步 元宇宙的广阔市场被逐渐打开 除了最接近元宇宙形态的沙盒游戏外 你还了解多少元宇宙的知识 Part 1 什么是元宇宙 元宇宙的概念一提出来 所有人都在说元宇宙 那么元宇宙到
  • 使用SimHash进行海量文本去重

    阅读目录 1 SimHash与传统hash函数的区别 2 SimHash算法思想 3 SimHash流程实现 4 SimHash签名距离计算 5 SimHash存储和索引 6 SimHash存储和索引 7 参考内容 本文介绍的SimHash
  • 错误:app Transport Security has blocked a cleartext HTTP......

    在Xcode7中 苹果将 http 协议改成了 https 协议 使用 TLS1 2 SSL加密请求数据 因此在模拟器上运行程序时 要是程序还是使用的 http 协议就会报下图中的错误 解决办法 打开info plist 添加键值 App
  • jdbc的学习

    操作数据库的基本步骤 1 引入依赖 注册驱动 2 获取连接对象 如何获取数据库的连接 3 获取发送sql语句的对象 发送sql语句 4 处理结果集 5 释放资源 1 0 原始版本 public static void main String