JDBC(四) SQL注入与增删改查

一.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注入解决办法:
  1. 创建SQL预编译对象
// 1.SQL 语句值的位置使用占位符 ? 代替, 防止SQL注入
String sql = "select name,age,sex from users limit ?, ?";
// 2.使用 prepareStatement 获取预编译的数据库操作对象并进行sql 预编译
ps = conn.prepareStatement(sql); 
  1. 给预编译对象传值
  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);
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容