JDBC中级实现--数据库连接四要素的抽取与动态获取

2023-11-01

1.数据库连接四要素不应该写死在代码中,扩展性不高,应该抽取到配置文件中动态读取:

扩展文件名.properties

DRIVER_CLASS_NAME = com.mysql.jdbc.Driver
URL = jdbc:mysql:///mysql_jdbc
USER = root
PASSWORD = root

2.动态读取操作,只需要执行一次,所以解析代码写在静态代码块

  Class.forName(),注册也只需要执行一次,所以也放在静态代码块

static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("jdbc.properties"));
            DRIVER_CLASS_NAME = properties.getProperty("DRIVER_CLASS_NAME");
            URL = properties.getProperty("URL");
            USER  = properties.getProperty("USER");
            PASSWORD = properties.getProperty("PASSWORD");
//            System.out.println(DRIVER_CLASS_NAME+"-"+URL+"-"+USER+"-"+PASSWORD);
            Class.forName(DRIVER_CLASS_NAME);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.为数据库的连接专门写个工具类用于获取连接和释放资源,以及公共代码


/*
    工具类封装步骤:
        1.jdbc中每次都要写注册获取连接和资源释放
        2.参数数据,不应该直接写在代码中,直接抽取到最上面,便于后期开发维护
        3.数据库连接四要素,不应该写死在代码中,扩展性不高,应该抽取到配置文件中动态读取
        4.动态读取操作,只需要执行一次,所以解析代码写在静态代码块
        5.class.forName(),注册也只需要执行一次,所以也放在静态代码块
 */
public class JdbcUtil {

    public static  String DRIVER_CLASS_NAME ;
    public static  String URL ;
    public static  String USER ;
    public static  String PASSWORD ;

    //如果要保证一部分代码仅仅动态读取一次,则使用静态代码块
    static {
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("jdbc.properties"));

             DRIVER_CLASS_NAME = properties.getProperty("DRIVER_CLASS_NAME");
             URL = properties.getProperty("URL");
             USER  = properties.getProperty("USER");
             PASSWORD = properties.getProperty("PASSWORD");
//            System.out.println(DRIVER_CLASS_NAME+"-"+URL+"-"+USER+"-"+PASSWORD);
            Class.forName(DRIVER_CLASS_NAME);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }


    //获取连接
    public static Connection getConnection()  {
        Connection connection = null;
        try {
            //ctrl+Alt+C抽取
            connection = DriverManager.getConnection(URL, USER,PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }


    //资源释放
    public static  void release(ResultSet resultSet, Statement statement,Connection connection){
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            resultSet = null;//避免内存泄漏
        }

        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            statement = null;//避免内存泄漏
        }

        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            connection = null;//避免内存泄漏
        }
    }
}

4.用户登录实例

package Login_01;

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

public class LoginDemo {
    public static void main(String[] args) throws SQLException {
        //提醒用户输入用户名
        System.out.println("请输入用户名:");
        Scanner scanner = new Scanner(System.in);
        String username = scanner.nextLine();

        System.out.println("请输入登录密码:");
        Scanner scanner1 = new Scanner(System.in);
        String password = scanner1.nextLine();
        //提醒用户输入密码


        Connection connection = JdbcUtil.getConnection();
        Statement statement = connection.createStatement();

        String sql = "SELECT count(*) FROM USER WHERE username = '"+username+"' AND password = '+password+' ;";
        ResultSet resultSet = statement.executeQuery(sql);
       
        int count = 0;
        while (resultSet.next()) {
            count = resultSet.getInt("count(*)");
        }
        System.out.println(count >0 ? "登录成功" :" 登录失败");
        JdbcUtil.release(resultSet,statement,connection);
    }
}

简单测试DemoTest: 

import util.JDBCUtils;

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

public class JdbcUtilTest {
    public static void main(String[] args) throws SQLException {
        Connection connection = JDBCUtils.getConnection();
        Statement statement = connection.createStatement();
        String sql = "Update user set password = '54321'";
        int i = statement.executeUpdate(sql);
        System.out.println(i);
        JDBCUtils.release(null,statement,connection);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC中级实现--数据库连接四要素的抽取与动态获取 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 量化投资学习-32:每一波调整的本质

    在每一轮牛市中 都会经历大致三波的上涨 每一波上涨中间都会经历1 2个月的时间调整 调整的深度在20 左右 为什么经历这种调整的 调整的目的是什么 常听到的观点就是 涨久了 就会跌 调制的目的是洗盘 洗掉浮筹 为了后期更好的上涨 所以散户最
  • gw在计算机网络里面_GW 是什么意思?

    GW是Gateway的英文缩写 即网关 又称网间连接器 协议转换器 网关在网络层以上实现网络互连 是最复杂的网络互连设备 仅用于两个高层协议不同的网络互连 网关既可以用于广域网互连 也可以用于局域网互连 是一种充当转换重任的计算机系统或设备
  • Tone Mapping中luma滤波(降噪)对噪声放大的定性分析

    Tone Mapping中luma滤波对噪声放大的定性分析 在tone mapping过程中 通常经过统计之后得到一条mapping曲线 记这条曲线为 f x f x f x mapping过程中 对于给定的点 假定其亮度为
  • Oracle GoldenGate 将 SQLServer 数据实时同步到 ORACLE

    Oracle GoldenGate 简称 OGG 使在不同关系型数据库之间能进行实时同步复制可谓非常强大 OGG 支持 oracle sql server mysql db2 Sybase 等关系数据库直接的数据复制 OGG 这种灵活特性能
  • 计算机网络基础知识总结

    计算机网络学习的核心内容就是网络协议的学习 网络协议是为计算机网络中进行数据交换而建立的规则 标准或者说是约定的集合 因为不同用户的数据终端可能采取的字符集是不同的 两者需要进行通信 必须要在一定的标准上进行 一个很形象地比喻就是我们的语言
  • Arduino学习模拟输出

    1 实现效果 通过两个按键可以控制led变亮或者变暗 boolean pushButton1 定义布尔型变量存储按键1的状态 boolean pushButton2 定义布尔型变量存储按键2的状态 int ledPin 9 LED引脚号 i
  • Python3 面向对象

    Python从设计之初就已经是一门面向对象的语言 正因为如此 在Python中创建一个类和对象是很容易的 本章节我们将详细介绍Python的面向对象编程 如果你以前没有接触过面向对象的编程语言 那你可能需要先了解一些面向对象语言的一些基本特
  • 数据库备份和恢复

    这里介绍两种方法 1 mysqldump mysqldump不需要登录到数据库中就可以备份和恢复库和表 1 备份 mysqldump uroot p 123123 mytest gt mnt mytest bak date F sql 注意
  • Django学习 day4

    今天学习了简单的用户登录界面 也是对template的简单初探 Django有个叫模板 Template 的东东 可以直接把你的Html代码写在模板里 返回给浏览器 模板初探 使用模板的两个步骤 配置存html文件的模板目录 在你的view
  • html5期末大作业课程设计仿苹果官网(源码+报告)

    页面展示 下面有下载地址 免费哦 链接 https pan baidu com s 1 5ZDXVZmM64ALY2i31Hwfg 提取码 vtrk 一 需求分析 设计目的 一 可行性分析 时代背景 根据中国互联网络信息中心 CNNIC 在
  • 【教程】电信光猫烽火HG5140A怎么改桥接模式,telecomadmin超级密码

    一 背景 坐标杭州 宽带移机 师傅给我换了个战未来的 支持万兆的光猫 以前我是依据型号网上搜索搞到超级管理员用户就行桥接的 给我换了这个新光猫后 自己死活折腾不出来 二 正文 以前大家都习惯用超级管理员进入光猫 改桥接模式 利用光猫的安全漏
  • libevent中event_base_loopbreak与BEV_OPT_DEFER_CALLBACKS

    最近用C 和libevent改写了一个多线程网络服务器应用 大体框架是前端一个tcp连接监听线程 接收到连接后将socket随机交给一个后台工作线程做进一步处理 所有的线程均使用event base loop事件循环 其中有这样一个需求 我
  • Flink实战: 窗口TopN分析与实现1

    Flink实时计算topN热榜 主要思路可以这样做 可以继续优化的地方有 1 最后的processFunction中注册定时器在processElement方法中就要将ListState存储换掉 换成ValueState 不过是List类型
  • 最小二乘法曲线拟合

    最小二乘法曲线拟合以及Matlab实现 在实际工程中 我们常会遇到这种问题 已知一组点的横纵坐标 需要绘制出一条尽可能逼近这些点的曲线 或直线 以进行进一步进行加工或者分析两个变量之间的相互关系 而获取这个曲线方程的过程就是曲线拟合 目录
  • rtplib在linux上的编译安装

    JRTPlib简介 在http www tekuba net program 10 中提到过RTP的例程 这里参考网络上的资料给出JRtpLIB的嵌入式arm环境以及桌面环境开发环境的建立 RTP 是目前解决流媒体实时传输问题的最好办法 要
  • sql注入手法详解

    sql定义 sql 结构化查询语句 sql注入 首先我们通过前端将我们的payload 恶意代码 传送到后台服务器 传送到后台以后 我们提交的payload拼接到sql语句中 作为sql语句的一部分被执行 从而导致数据库又被脱库甚至删库的风
  • std:weak_ptr 用法小结。

    http blog csdn net coolmeme article details 43266319 参考了这篇博客 感谢博主的贡献 感谢博主的翻译 不过他写的太多了 我只是记录一下使用方法 原理就不深究了 需要了解其原理的可以自行去那
  • Unity性能优化一些学习总结

    关于Unity性能优化的自我总结 1 硬件支持优化 1 平台设置优化 减少FPS 在ProjectSetting gt Quality中的 VSync Count 参数会影响你的FPS EveryVBlank相当于FPS 60 EveryS
  • 【Go语言学习之路 2】Go目录结构划分

    目录结构划分 三个环境变量的配置 GOROOT Go 安装后的根目录 例如 D Program Files Go 安装过程中会由安装程序自动写入系统环境变量中 go语言自带的类库 GOBIN Go 的二进制文件存放目录 GOPATH bin
  • JDBC中级实现--数据库连接四要素的抽取与动态获取

    1 数据库连接四要素不应该写死在代码中 扩展性不高 应该抽取到配置文件中动态读取 扩展文件名 properties DRIVER CLASS NAME com mysql jdbc Driver URL jdbc mysql mysql j