通过JDBC、DBUtil实现登陆的练习
时间:2022-07-22
本文章向大家介绍通过JDBC、DBUtil实现登陆的练习,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
项目截图1
项目建立步骤: 1、在src目录下建立dp.properties文件,存放配置信息
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.user=scott
jdbc.password=tiger
2、建立DBUtil工具类、对JDBC的相关功能进行封装
package cn.bjsxt.util;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 软编码,将配置信息生成一个配置文件,然后让程序在执行过程中,读取配置信息
* 好处:可以动态调整配置信息,有助于后续代码的维护
*
*Java中,提供了一个类,叫Properties类,用于读取properties文件
*/
public class DBUtil {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
try {
//创建Properties对象
Properties prop=new Properties();
//加载配置文件
prop.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
//读取信息并进行初始化,trim()的作用是取出字符串两端多余的字符或者是其他预定义字符
driver=prop.getProperty("jdbc.driver").trim();
url=prop.getProperty("jdbc.url").trim();
user=prop.getProperty("jdbc.user").trim();
password=prop.getProperty("jdbc.password").trim();
//注册驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
* @return
*/
public static Connection getConn() {
Connection conn=null;
try {
conn=DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
System.out.println(
"DBUtil.getConn(连接创建失败, 请检查[url]:" + url + ", [user]:" + user + ", [password]:" + password + ")");
}
return conn;
}
/**
* 获取sql发送器
* @param conn
* @return
*/
public static Statement getStmt(Connection conn) {
Statement stmt=null;
try {
stmt=conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt;
}
/**
* 获取预处理发送器
* @param conn
* @param sql
* @return
*/
public static PreparedStatement getPstmt(Connection conn,String sql) {
PreparedStatement pstmt=null;
try {
pstmt=conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return pstmt;
}
/**
* 动态绑定参数
* @param pstmt
* @param params
*/
public static void bindParam(PreparedStatement pstmt,Object...params) {
//...可变参数,可以被认为是一个数组
try {
for (int i = 1; i <= params.length; i++) {
pstmt.setObject(i, params[i-1]);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
*
* @param rs
* @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();
}
}
}
}
3、编写主类
package cn.bjsxt.login;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import cn.bjsxt.util.DBUtil;
/**
* 将预处理发送器以及动态绑定也通过DBUtil调用
* @author chy
*/
public class Login3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名");
String username=sc.nextLine();
System.out.println("请输入密码");
String password=sc.nextLine();
//定义SQL语句->不做拼接操作,改为使用占位符
String sql = "select count(*) from t_user where username=? and password=?";
System.out.println(sql);
//获取数据库连接
Connection conn=DBUtil.getConn();
//获取发送器->预处理发送器
PreparedStatement pstmt=DBUtil.getPstmt(conn, sql);
//声明结果集
ResultSet rs=null;
//通过DBUtil绑定参数
DBUtil.bindParam(pstmt, username,password);//通过可变参数的设定可以同时传多个值
try {
//发送并执行
rs=pstmt.executeQuery();
//处理结果集
if (rs.next()) {
if (rs.getInt(1)==0) {
System.out.println("登陆失败,用户名或密码错误!");
}else {
System.out.println("欢迎"+username+"登陆成功!");
}
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.close(rs, pstmt, conn);//不能在try...catch里面定义对象,不然在finally中无法解析该对象
}
sc.close();
}
}
- 数据结构之链表、栈和队列 java代码实现
- 洛谷P3209 [HNOI2010]PLANAR(2-SAT)
- javascript 面向对象(多种创建对象的方式)
- 1711: [Usaco2007 Open]Dingin吃饭
- 1574: [Usaco2009 Jan]地震损坏Damage
- HTTPS科普(转) 为什么需要https
- 1590: [Usaco2008 Dec]Secret Message 秘密信息
- 1751: [Usaco2005 qua]Lake Counting
- 算法模板——单个值欧拉函数
- webpack前言:前端模块系统的演进
- webpack学习(一):webpack 介绍&安装&常用命令
- pd_ds中的hash
- webpack学习(二):先写几个webpack基础demo
- js实现php中sleep()延时的功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 设计模式实战-建造者模式,做任何事情都需要步步为营
- 设计模式实战-单例模式,我就是天下无双
- 设计模式实战-抽象工厂模式,分而治之
- 搞定常被问的数组和排序算法,附面试题
- 玩转 Java 时间 + 面试题
- 【分布式技术】分布式系统调度架构之两层调度,解决单体调度问题
- 一致性哈希算法,在分布式开发中你必须会写,来看完整代码
- FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放
- 【Postgres扩展】pg_auto_failover支持高可用性和自动故障转移
- 「PostgreSQL」用MapReduce的方式思考,但使用SQL
- 每天百万交易的支付系统,生产环境该怎么设置JVM堆内存大小
- gb格式注释文件转换成gff3注释文件格式
- 有人问你Elasticsearch分布式架构原理,将这篇文章丢过去
- 每日两题 T1
- 每日两题 T2