JDBC之ORM思想及SQL注入

目录

[一. ORM编程思想](#一. ORM编程思想)

[1. 简介](#1. 简介)

[2. 实操ORM思想](#2. 实操ORM思想)

[a. Students实体类](#a. Students实体类)

[b. ORM映射](#b. ORM映射)

[二. SQL注入](#二. SQL注入)

[1. 简介](#1. 简介)

[2. 解决SQL注入](#2. 解决SQL注入)

[三. 总结](#三. 总结)


前言

本文来讲解ORM编程思想和SQL注入,旨在帮助大家更容易的理解和掌握

个人主页:艺杯羹

系列专栏:JDBC

一. ORM编程思想

1. 简介

这是一种思想,对象关系映射(英语:Object Relational Mapping,简称ORM,或O/R mapping)是一种为了解决面向对象语言与关系数据库存在的互不匹配的现象

这个思想就是要求:

  1. 表与所创建的类要对应
  2. 表的一个字段和类中一个属性一一对应
  3. 表的一行数据和类的一个对象对应

实体类

实体类就是一个定义了属性,拥有getter、setter、无参构造方法(基本必备)的一个类。实体类可以在数据传输过程中对数据进行封装,相当于一个"工具"、"容器"、"载体",能存储、传输数据,能管理数据

特点分类 具体描述
类名 实体类名尽量和数据库中的表名一一对应
属性与字段 实体类中的属性对应数据库表中的字段,相关的命名最好也一一对应
方法 实体类内方法主要有 getter、setter 方法,用于设置、获取数据
访问修饰符 实体类属性一般为 private 类型,方法为 public 类型
构造方法 实体类应该有无参、有参构造方法

关系图如下:

2. 实操ORM思想

a. Students实体类

java 复制代码
// 实体类,存放Users表中的数据
public class Students {
    private int studentid;
    private String studentname;
    private int studentage;

    public int getStudentid() {
        return studentid;
    }

    public void setStudentid(int studentid) {
        this.studentid = studentid;
    }

    public String getStudentname() {
        return studentname;
    }

    public void setStudentname(String studentname) {
        this.studentname = studentname;
    }

    public int getStudentage() {
        return studentage;
    }

    public void setStudentage(int studentage) {
        this.studentage = studentage;
    }
}

b. ORM映射

java 复制代码
public List<Students> selectAllStu(){
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Students> list = new ArrayList<>();
        try{
            // 获取数据库连接
            connection = JdbcUtils.getConnection();
            // 创建PreparedStatement对象
            ps = connection.prepareStatement("select * from students");
            // 执行查询
            rs = ps.executeQuery();
            // 操作ResultSet对象获取查询的结果集
            while(rs.next()){
                // 获取列中的数据
                int studentid = rs.getInt("studentid");
                String studentname = rs.getString("studentname");
                int studentage = rs.getInt("studentage");
                // ORM映射处理
                Students student = new Students();
                student.setStudentid(studentid);
                student.setStudentname(studentname);
                student.setStudentage(studentage);
                list.add(student);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

测试

java 复制代码
ResultSetTest tst = new ResultSetTest();
List<Students> students = tst.selectAllStu();
for(Students student : students){
System.out.println(student.getStudentid()+" "+student.getStudentname()+" "+student.getStudentage());
}

二. SQL注入

1. 简介

所谓 SQL 注入,就是通过把含有 SQL 语句片段的参数插入到需要执行的 SQL 语句中,
最终达到欺骗数据库服务器执行恶意操作的 SQL 命令

这种情况会导致数据泄露的风险,如果是登录账号,被使用sql注入攻击,那么就会导致数据泄露

这里我那statement来举个例子

这是一个用户登录查询的sql语句

java 复制代码
// 在Statement里
String sql = 
"SELECT * FROM users WHERE username = '"+username+"' AND password = '"+password+"'"

如果攻击者,输入如下内容
' OR '1'='1' --

那么就会有数据泄露的风险,为什么?现在我们看看源代码

java 复制代码
// 这里的意思就变成名字是一直都是为真的
// 并且后面使用 -- 这个符号将密码注释掉了
// 这样就出现了SQL注入
SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = '任意值';

2. 解决SQL注入

就像之前的文章提到的,为什么使用Statement会出现SQL注入,就是这个原因

如何去解决呢,就是用PrepareStatement

因为prepareStatement会先用**?**来占位,就能够防止SQL注入

三. 总结

到此,就讲解完了ORM编程思想和SQL注入,相信你能够很好的理解了

希望本文能够帮助到你😊

相关推荐
TDengine (老段)几秒前
TDengine 替换 Hadoop,彻底解决数据丢失问题 !
大数据·数据库·hadoop·物联网·时序数据库·tdengine·涛思数据
南棱笑笑生3 分钟前
20250605使用boot-repair来恢复WIN10和ubuntu22.04.6双系统的启动
数据库·postgresql
初次见面我叫泰隆13 分钟前
Redis——1、服务端高并发分布式结构演进之路
数据库·redis·分布式
朝九晚五ฺ1 小时前
【MySQL基础】数据库的备份与还原
数据库·mysql·oracle
时序数据说1 小时前
时序数据库IoTDB的UDF Sample算法在数据监控、故障预防的应用
大数据·数据库·开源·时序数据库·iotdb
emo了小猫4 小时前
Mybatis #{} 和 ${}区别,使用场景,LIKE模糊查询避免SQL注入
数据库·sql·mysql·mybatis
潘yi.9 小时前
NoSQL之Redis配置与优化
数据库·redis·nosql
zdkdchao9 小时前
hbase资源和数据权限控制
大数据·数据库·hbase
伤不起bb9 小时前
NoSQL 之 Redis 配置与优化
linux·运维·数据库·redis·nosql
leo__5209 小时前
PostgreSQL配置文件修改及启用方法
数据库·postgresql