## 使用JDBC工具类的原因
在使用JDBC连接数据库的时候,加载驱动、获取连接、释放资源等代码是重复的,所有为了提高代码的复用性,我们可以写一个工具类,将数据库驱动加载、获取连接、资源释放的代码封装起来。同时,为了使工具类的灵活性,可以将数据库的驱动、url、用户名、密码等信息以键值对的形式存放在properties文件中,工具类初始化时从配置文件中读取所要连接数据库的信息。当需要更改连接的数据库时,只需要更改配置文件即可,而不必改写工具类的代码。

## 工具类实现
```
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
* JDBC工具类
*/

//工具类的方法应该都是静态的,这样方便我们去调用
public class JDBCUtils {
private static String url;
private static String user ;
private static String password;
private static String driver;

/**
* 文件的读取,只需要读取一次就可以拿到值:使用静态代码块
*/
static {
//获取资源文件,获取值
try {

/*
//获取src路径下的文件的方式:ClassLoader 类加载器 ,要获取Classloader,要获取他对应的字节码文件
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL resource = classLoader.getResource("jdbc.properties");
String path = resource.getPath(); //返回字符串路径
//System.out.println(path);
*/

InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
//2加载文件
pro.load(is);
//3获取属性,赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

/**
* 获取连接
* @return 连接对象释放资源
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}

/**
* 释放资源
* @param stmt
* @param conn
*/
public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

public static void close(Statement stmt, Connection conn){

if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

}

```
下面我们来写一个测试类:
## 测试类

```
import util.JDBCUtils;

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

/**
* 通过键盘录入用户和密码
* 判断用户是否登录成功
*/

public class jdbcDemo9 {

public static void main(String[] args) {
//1.键盘录入,接受用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine();
//2.调用方法
boolean flag = new jdbcDemo9().login2(username,password);

//3.判断结果输出不同语句
if (flag){
System.out.println("登录成功");
}else {
System.out.println("用户名或密码错误");
}

}

/**
* 登录方法使用PreparedStatement实现
*/

public boolean login2(String username,String password){
if (username==null || password==null){
return false;
}
Connection conn =null;
PreparedStatement pstmt = null;
ResultSet rs =null;

//连接数据库判断是否登录成功
try {
conn = JDBCUtils.getConnection();//在这里debug的时候显示conn=null,以及下面的变量都显示错误
//2定义sql
String sql = "select * from user where username = ? and password = ?";
//3获取执行sql的对象
pstmt = conn.prepareStatement(sql);
//给?赋值
pstmt.setString(1,username);
pstmt.setString(2,password);
//4执行查询 不需要传递参数
rs = pstmt.executeQuery(sql);
//5.判断
return rs.next(); //如果有下一行,返回true

} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs,pstmt,conn);
}

return false;
}
}

```
## 配置文件

```
url=jdbc:mysql://localhost:3306/db4?useSSL=false&serverTimezone=UTC
user=root
password=nana980801
driver=com.mysql.cj.jdbc.Driver
```
**注意:这里我使用的是MySQL8.0,所有配置文件与之前的版本有些不同。如果你使用的是MySQL8.0而配置文件是8.0对应版本之前的,就会报错。**

## 运行结果

```
请输入用户名
zhangsan
请输入密码
123
登录成功

Process finished with exit code 0

```

JDBC工具类连接数据库,模仿登录的更多相关文章

  1. 利用JDBC工具类 模拟用户登录!

    一.建库 设置 id为主键并自增! 二.定义登录接口 package com.aaa.dao; public interface IDengDao { /* 1.定义一个登陆的接口,参数是name 和 ...

  2. JDBC-select练习&jdbc工具类&数据库登录案例

    一.select练习 1.说明 练习: * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回. 1. 定义Emp类 2. 定义方法 public List<Emp> fi ...

  3. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

  4. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. MySQL JDBC事务处理、封装JDBC工具类

    MySQL数据库学习笔记(十)----JDBC事务处理.封装JDBC工具类 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit. ...

  7. DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类) 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据 ...

  8. JDBC第三篇--【事务、元数据、改造JDBC工具类】

    这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 这是我JDBC的第二篇 http://blog.csdn.net/ho ...

  9. JDBC【事务、元数据、改造JDBC工具类】

    1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样[A账户的钱没变,B账户的钱也没变]. 事例说 ...

随机推荐

  1. Java核心技术(卷一)读书笔记——第一章(概述)

    1.Java不提供多重继承,通过接口来实现.一个类只能继承一个父类,但是可以同时实现多个接口. 2.Java中的int类型的大小是固定的32位,以避免代码移植时候的不兼容问题.唯一的限制是int类型的 ...

  2. Linux学习笔记06之DNS

    一.DNS概念:Domain Name System(域名系统) 是互联网上作为域名和IP地址相互映射的一个分布式数据库 二.DNS功能: 完成IP地址和域名之间的一个映射 三.DNS分类: 1.静态 ...

  3. Linux系统命令。

      help:命令用于显示shell内部命令的帮助信息.help命令只能显示shell内部的命令              帮助信息.而对于外部命令的帮助信息只能使用man或者info命令查看   m ...

  4. angularjs的input防抖

    在开发中,遇到一个这样的需求,使用$scope.$watch()方法监听input值的改变,然后去$resource请求,但是请求过于频繁,需要做逻辑调整.代码如下: var timeout; $sc ...

  5. win10+Anaconda3+CUDA9.0+CUDNN7.1+TensorFlow-gpu1.9+Pycharm

    想在win10上运行下YOLO的例子,要先配置环境,折腾了两天,终于好了,整理下自己觉得有用且正确的流程. win10+Anaconda3+CUDA9.0+CUDNN7.1+TensorFlow1.9 ...

  6. Linux - 查看端口的占用情况、找出并杀死占用进程的方法

    目录 1 lsof查看端口的占用情况 1.1 命令使用示例 1.2 查看某一端口的占用情况 1.3 杀死某个端口的所有进程 2 netstat查看端口占用情况 2.1 命令使用示例 2.2 查看占用某 ...

  7. 夯实Java基础(五)——==与equals()

    1.前言 我们在学习Java的时候,看到==.equals()就认为比较简单,随便看了一眼就过了,其实你并没有深入去了解二者的区别.这个问题在面试的时候出现的频率比较高,而且据统计有85%的人理直气壮 ...

  8. Fragment 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  9. Android--SharedPreferences数据存储方案

            SharedPreferences是使用键值对的形式存储的,并且支持多种不同的数据类型,存的是String,取得值也是String.         使用SharedPreferenc ...

  10. .net core web api部署到Linux系统CentOS 7

    一.创建一个.net core web api 的Demo 完成后的项目结构如图 修改下监听端口 发布代码 二.发布到CentOS 7上并运行 下一步需要一定的虚拟机知识了,我这里使用了windows ...