JDBC工具类连接数据库,模仿登录
## 使用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
```
最新文章
- C语言-结构体struct-联合体union-枚举enum
- Html5的一些基础知识
- 一个实现了View接口的Fragment
- winows下使用ssh服务远程登录vbox中的虚拟机
- Android之ViewHolder用法
- Spring No mapping found for HTTP request with URI错误
- 互联网的寒冬来了,BAT都不社招了
- 总结Gerrit常用命令
- Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
- kettle过滤、生成随机数、改变开始复制数量
- CreateProcess error=206, The filename or extension is too long";的一个解决方案
- 使用buildbot实现持续集成(转载)
- vi 快捷键
- TreeView checkbox
- centos 安装php
- javascript 数组的部分常用属性用法
- 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?
- python3中报错:TypeError: 'range' object doesn't support item deletion
- 【大数据实战】将普通文本文件导入ElasticSearch
- 绕过CDN查找网站真实IP方法收集
热门文章
- 【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?
- sqlmap用法大全
- TestNG使用@Parameter给要测试的方法传递参数
- 【Docker】unauthorized: incorrect username or password
- 在vue中监听storage的变化
- Selenium+java - 截图操作
- Netty学习(五)-DelimiterBasedFrameDecoder
- iView 实现可编辑表格
- 用xshell链接虚拟机上的linux
- UVA - 1152 --- 4 Values whose Sum is 0(二分)