定义四个变量
数据库的驱动,让程序可以使用数据库
com.mysql.jdbc.Driver
具体的数据库的位置
jdbc:mysql://localhost:3306/data
static { // 在类加载的时候,只需要执行一次即可
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
driver = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
}
public static Connection getConnection() throws SQLException {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn, Statement ps, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 关闭资源方法需要传递的三个参数,conn,Statement,ResultSet
/**
* @author Doraemon
* @date 2021/12/12 12:08 下午
* @version 1.0
*/
import java.sql.*;
import java.util.ResourceBundle;
/**
* JDBC 工具类,用来简化 JDBC 编程
*/
public class DBUtil {
/**
* 工具类中的属性、方法都是私有的,
* 因为工具类中的方法都是静态的,不需要直接的new 对象,直接使用类名字进行调用即可;
*/
//私有变量
private static String driver;
private static String url;
private static String username;
private static String password;
static { // 在类加载的时候,只需要执行一次即可
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
driver = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
}
public static Connection getConnection() throws SQLException {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭资源
* @param conn 连接对象
* @param ps 数据库操作对象
* @param rs 结果集
*/
public static void close(Connection conn, Statement ps, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
PrepareStatement是SQL语句预编译对象,当我们执行:preparedStatement = connection.prepareStatement(sql);这一行代码获取PrepareStatement对象的时候就会把传进去的sql语句进行编译并且加载进如内存中,在接下来的操作中我们只需要对sql语句中的占位符:?进行赋值,这样sql语句就不需要再次重新编译,这是与statement对象的最主要的差别
while (rs.next()) {
String deptno = rs.getString("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
}
/**
* @author Doraemon
* @date 2021/12/12 2:19 下午
* @version 1.0
*/
import com.luobin.utils.DBUtil;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DeptListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 获取连接
conn = DBUtil.getConnection(); // 加载驱动,获取连接,完成 1 2 步 getConnection方法里面有两步
String sql = "select deptno,dname,loc from dept";
ps = conn.prepareStatement(sql); // 获取预编译数据库操作对象,完成第 3 步
rs = ps.executeQuery(); // 执行 sql 完成 4 步
int i = 0;
// 处理查询结果集合 完成第 5 步
while (rs.next()) { // rs 里面的东西就是查询到的表格里面的东西,没有表头的一个表的部分数据
String deptno = rs.getString("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
// 下面的界面进行动态的展示
}
} catch (SQLException e) {
e.printStackTrace();
} finally { // 资源释放完成第 6 步
DBUtil.close(conn, ps, rs);
}
}
}
String sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";
–当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username='’or 1 = 1 -- and password='’
--分析SQL语句:
--条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;
--然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都--能正确执行,用户轻易骗过系统,获取合法身份。
--这还是比较温柔的,如果是执行
SELECT * FROM user_table WHERE
username='' ;DROP DATABASE (DB Name) --' and password=''
--其后果可想而知…
1、通过了工具类在进行连接的时候,进行资源释放的时候,会简化代码
2、在工具类里面是没有写 sql 语句和解析的,因为在工具类里面不执行语句