一.SQL注入
SQL注入定义:
SQL注入(SQL Injection)是一种常见的网络安全漏洞,攻击者通过在输入字段中插入恶意SQL代码,使应用程序执行非预期的SQL命令
SQL注入原因:
1.sql语句进行了拼接
String query = "SELECT * FROM users WHERE username='" + inUsername + "' AND password='" + inPassword + "'";
2.拼接后进行编译
rs = stmt.executeQuery(sql); // stmt为上下文创建的数据库连接对象
SQL注入解决办法:
- 创建SQL预编译对象
// 1.SQL 语句值的位置使用占位符 ? 代替, 防止SQL注入
String sql = "select name,age,sex from users limit ?, ?";
// 2.使用 prepareStatement 获取预编译的数据库操作对象并进行sql 预编译
ps = conn.prepareStatement(sql);
- 给预编译对象传值
ps.setInt(1, (page-1) * pageSize); // 3.给 预编译对象传值
ps.setInt(2, pageSize);
rs = ps.executeQuery(); // 4. 执行SQL 语句
完整示例代码:
package com.study.jdbc;
import java.sql.*;
/**
* SQL 注入原因: 1.sql语句进行了拼接,2拼接后进行编译
* 解决SQL 注入方法: 1. 创建SQL预编译对象 2. 给预编译对象传值
* 通过查询结果集的列名
* @return
*/
public class JDBC_search03_useDBUtil {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
PreparedStatement ps = null;
ResultSet rs = null;
int page = 1;
int pageSize = 5;
try {
conn = DBUtil.getConnection(); // 建立数据库连接
String sql = "select name,age,sex from users limit ?, ?"; // 1.SQL 语句值的位置使用占位符 ? 代替, 防止SQL注入
ps = conn.prepareStatement(sql); // 2.再使用 prepareStatement 获取预编译的数据库操作对象
ps.setInt(1, (page-1) * pageSize); // 3.给 预编译对象传值
ps.setInt(2, pageSize);
rs = ps.executeQuery(); // 4. 执行SQL 语句
while (rs.next()) {
String s1 = rs.getString("name"); // TODO 通过查询结果集的列名
String s2 = rs.getString("age");
String s3 = rs.getString("sex");
System.out.println(s1 + "\t" + s2 + "\t" + s3);
}
} catch (SQLException e) {
// 处理 SQL 异常
throw new RuntimeException(e);
} finally {
DBUtil.close(conn, ps, rs);
}
}
}
通过JDBC对数据库进行增删改 查
增删改都属于DML(DML(Data Manipulation Language,数据操纵语言)是用于操作数据库中数据的SQL语句)语句
新增、删除、修改:执行.executeUpdate()
方法
查询:执行.executeQuery()
方法
新增示例:
package com.study.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDate;
public class JDBC_actionAdd {
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtil.getConnection();
String sql = "insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(?,?,?,?,?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setInt(1, 12);
ps.setString(2, "张三");
ps.setString(3, "销售员");
ps.setInt(4, 7369);
LocalDate localDate = LocalDate.parse("2025-01-01");
ps.setDate(5, java.sql.Date.valueOf(localDate));
ps.setDouble(6, 1000.0);
ps.setDouble(7, 500.0);
ps.setInt(8, 10);
int count = ps.executeUpdate();
System.out.println("插入了" + count + "条记录");
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
DBUtil.close(conn, ps, null);
}
}
}
修改示例:
package com.study.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBC_actionMod {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
// 1. 注册驱动
// 2. 获取连接
conn = DBUtil.getConnection();
// 3.获取预编译的数据库操作对象
String sql = "update emp set ename=?, job=?,sal=? where empno=?";
ps = conn.prepareStatement(sql);
ps.setString(1, "李四修改2");
ps.setString(2, "产品经理");
ps.setDouble(3, 5000.0);
ps.setInt(4, 12);
// 4. 执行sql语句
int count = ps.executeUpdate();
// 5. 处理结果
System.out.println("修改了" + count + "条记录");
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
// 6.释放资源
DBUtil.close(conn,ps, null);
}
}
}
删除示例: 和新增修改有差别
package com.study.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBC_actionDel {
public static void main(String[] args) {
/*
// 1.正常按照 新增 修改 的逻辑写
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtil.getConnection();
String sql = "delete from emp where empno=?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 12);
int count = ps.executeUpdate();
System.out.println("删除了" + count + "条记录");
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
DBUtil.close(conn,ps, null);
}*/
// 优化方式 这样不用写 finally
String sql = "delete from emp where empno=?";
try (Connection conn = DBUtil.getConnection();PreparedStatement ps = conn.prepareStatement(sql)){
ps.setInt(1,12);
int count = ps.executeUpdate();
System.out.println("删除了" + count + "条记录");
} catch(SQLException e){
e.printStackTrace();
}
}
}
查询示例:
package com.study.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBC_actionQueryLike {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
String sql = "select ename from emp where ename like ?";
ps = conn.prepareStatement(sql);
ps.setString(1, "_o%"); // 查询第二个字母是 O 的名字的
rs = ps.executeQuery();
while (rs.next()){
String ename = rs.getNString("ename");
System.out.println(ename);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
DBUtil.close(conn,ps,rs);
}
}
}