通过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();
		
	}
}
展开的类为本项目所使用的类。没有展开的都是测试类