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