- 目的:简化书写
- 分析:
- 注册驱动也抽取
- 抽取一个方法获取连接对象
- 需求:不想传递参数(麻烦),还得保证工具类的通用性。
- 解决:配置文件
jdbc.properties
url=
user=
password=
- 分析:
* 练习:
* 需求:
1. 通过键盘录入用户名和密码
2. 判断用户是否登录成功
* select * from user where username = "" and password = "";
* 如果这个sql有查询结果,则成功,反之,则失败
* 首先在mysql中:
1. 创建数据库(bd)表 user
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
PASSWORD VARCHAR(32)
);
INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','234');
2.代码实现
(1)在src同级目录下创建jdbc.properties文件
内容为:url=jdbc:mysql:///db(数据库)
user=root
password=root
driver=com.mysql.jdbc.Driver
(2)在utils中创建JdbcUtils工具类
package cn.itcast.util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
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 {
//1.创建properties集合类对象
Properties pro = new Properties();
//获取src路径下的文件方式—》ClassLoader 类加载器
ClassLoader classLoader = JdbcUtils.class.getClassLoader();
URL res = classLoader.getResource(“jdbc.properties”);
String path = res.getPath();
//2.加载文件
pro.load(new FileReader(path));
//3.获取数据,赋值
url = pro.getProperty(“url”);
user = pro.getProperty(“user”);
password = pro.getProperty(“password”);
driver = pro.getProperty(“driver”);
//4.注册驱动
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(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();
}
}
}
/**
-
释放资源(重载)
-
@param stmt
-
@param conn
-
@param rs
*/
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)在所在项目的目录下创建JdbcDemo来使用JdbcUtils工具类
package cn.itcast.jdbc;
import cn.itcast.util.JdbcUtils;
import java.sql.*;
import java.util.Scanner;
public class JdbcDemo {
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(“用户名或者密码错误!”);
}
}
/* //*
* 登陆方法使用Statement实现(但是容易发生SQL注入)
不建议使用。
/
/
public boolean login(String username, String password){
if (username == null || password == null){
return false;
}
//连接数据库判断是否登录成功
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//1.获取连接
try {
conn = JdbcUtils.getConnection();
//2.定义sql
String sql = “SELECT * FROM user WHERE username = '”+username+"’ AND password = ‘"+password+"’";
//3.获取执行sql的对象
stmt = conn.createStatement();
//4.执行sql
rs = stmt.executeQuery(sql);
//5.判断
return rs.next();//如果有下一行,返回true
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.close(rs,stmt,conn);
}
return false;
}/
/**
* 登陆方法使用PreparedStatement实现
*推荐使用
*/
public boolean login2(String username, String password){
if (username == null || password == null){
return false;
}
//连接数据库判断是否登录成功
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//1.获取连接
try {
conn = JdbcUtils.getConnection();
//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.执行sql
rs = pstmt.executeQuery();
//5.判断
return rs.next();//如果有下一行,返回true
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.close(rs,pstmt,conn);
}
return false;
}
}
注意:运行过程共若出现 db.properties (系统找不到指定的路径。)
解决方法:查看子的IEDA所在的项目目录下是【否包含空格】的文件夹,并修改一下就可以了。
备注:此代码及部分参考黑马程序员培训教程。