ORM框架自学整理

ORM框架

ORM简述

ORM(Object Relational Mapping:对象关系映射)框架的原理‌是通过使用描述对象和数据库之间映射的元数据,将面向对象编程语言中的对象模型与关系数据库中的数据模型进行映射。简单理解就是在实体类和SQL语句之间简历映射关系。通过ORM框架,开发者可以使用面向对象的方式操作数据库,而不需要直接编写SQL语句‌。

ORM框架通过元数据(如XML文件或特性)来描述对象和数据库之间的映射关系。这些元数据定义了对象的属性如何映射到数据库表中的列,以及对象之间的关系如何映射到表之间的关系。通过这种方式,ORM框架能够自动生成SQL语句,执行数据库操作,从而简化了数据库编程的复杂性‌

优势

提高开发效率 :框架自动生成SQL语句,减少手动编写SQL的工作量。
简化代码 :面向对象的编码方式使代码更简洁易懂。
跨数据库支持 :支持多种数据库,便于项目的迁移和扩展。
减少SQL注入风险:内置了防止SQL注入的机制,提高了安全性。

常见框架

JPA :一种ORM规范,不是框架本身,由各大ORM框架提供实现,具有良好的跨平台性和灵活性‌。
Hibernate :Java领域最著名的ORM框架之一,提供强大的对象持久化功能,支持多种数据库,性能和扩展性好‌。以前最流行。
mybatis:优秀的持久层框架,支持定制化SQL、存储过程及高级映射,避免了JDBC代码和手动设置参数‌。现在最流行。

JDBC

JDBC(Java Database Connectivity)定义了一套访问数据库的规范和接口,单它本身不参与数据库访问的实现,要么数据库制造商本身提供这些规范和接口,要么是社区提供了这些实现。

Java程序只依赖JDBC 的API,通过DriverManager来获取驱动,并针对不同的数据库选择不同的驱动,这是典型的桥接设计模式,把抽象的Abstraction与行为实现Implementaction分离开来,从而可以保持各部分的独立性以及功能扩展。

流程

  1. 加载驱动
java 复制代码
Class.forName("com.mysql.jdbc.Driver"); 
  1. 创建连接
java 复制代码
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
  1. 创建发送SQL语句的对象Statement
java 复制代码
Statement sta= con.createStatement();
  1. 发送SQL语句获取结果
java 复制代码
ResultSet rs= sta.executeQuery("SELECT * FROM `user`");
  1. 处理数据
java 复制代码
while(rs.next()){
System.out.print(rs.getObject(1)+" ");
System.out.print(rs.getObject(2)+" ");
System.out.print(rs.getObject(3)+" ");
System.out.print(rs.getObject(4)+" ");
System.out.println(rs.getObject(5)+" ");

}
  1. 释放资源
java 复制代码
rs.close();
sta.close();
con.close();

参考1 2 3

Hibernate

Ibatis

Mybatis

  • mybatis是一款优秀的开元持久化框架。
  • 在ibatis功能的基础上做了升级。
  • 半自动化的ORM实现。
  • 支持定制化SQL、存储过程和高级映射。
  • 可以使用简单的XML或注解来配置映射。

核心类

SqlSessionFactory :每个mybatis应用都是以SqlSessionFactory的实例为中心,通过SqlSessionFactoryBuilder从xml配置文件或通过Java的方式构建获得。SqlSessionFactory一旦被创建就会在应用的运行期间一直存在。每个SqlSessionFactory对应一个数据库的环境。
SqlSession :执行SQL的核心接口,有两个实现类DefaultSqlSession(默认)和SqlSessionManage。SqlSession通过内部的执行器(Executor)来对数据进行CRUD。SqlSession不是线程安全的,每次操作完数据库后都要调用close对其进行关闭,建议通过try-finally来保证总是关闭SqlSession。
Execute:是一个SQL执行的核心接口,有三个实现类SimpleExecutor、ReuseExecutor、BatchExecutor分别表示不同的策略。

BaseExecutor 类: 是 Executor 接口的一个基础实现类,提供了执行器的一些通用逻辑。它通常包含配置信息、事务对象和错误上下文等成员变量。BaseExecutor 提供了对 SQL 语句执行的基础支持,但具体的执行逻辑可能由其子类实现。
SimpleExecutor 类: 是 BaseExecutor 的一个具体实现,它可能不包含复杂的逻辑或优化,但提供了基本的 SQL 执行功能。在实际应用中,MyBatis 可能提供了更多的执行器实现类,比如 ReuseExecutor 用于重用预处理语句,BatchExecutor 用于批量执行等。

Executor 负责与 JDBC 交互,包括创建 PreparedStatement、设置参数、执行 SQL、处理结果等。

防SQL注入

mybatis从四个方面防止SQL注入:

  • 预编译SQL语句:mybatis默认使用预编译的SQL语句,即PreparedStatement。预编译语句在执行前会进行语法检查,能有效防止SQL注入。因为预编译语句中的参数是占位符,攻击者无法通过参数修改参数值来注入恶意SQL代码。

  • 参数绑定:mybatis在执行SQL语句时,会自动将参数值绑定到SQL语句中,这个过程是自动完成的,不需要手动编写SQL和参数值,从而避免了手动拼接导致的SQL注入风险。

  • 避免字符串拼接 :mybatis提供了动态SQL功能,在SQL语句中结合下面一些标签来构建复杂的SQL语句,如:

    java 复制代码
    <if></if>:判断标签
    <where></where>条件标签
    <set></set>:赋值标签
    <foreach></foreach>:循环标签
    <sql></sql>:抽取公共部分再使用<include/>标签引用
    <include/>:来构建复杂的SQL语句。

参考来源:1

  • 使用#{}占位符:在MyBatis的映射文件中,可以使用#{}来引用参数值。MyBatis会自动将#{}中的参数值进行预编译处理,从而防止SQL注入。与${}不同,#{}更加安全,因为它不会直接将参数值拼接到SQL语句中。

参考来源:2
参考来源:3

相关推荐
Wyz201210242 小时前
优化 PySpark 中嵌套数组爆炸(explode)性能的关键策略
jvm·数据库·python
2301_773553622 小时前
Navicat模型工具高级应用:怎样自定义模型节点颜色样式_机制解析
jvm·数据库·python
2301_816660212 小时前
mysql在生产环境执行DDL的风险_如何使用GH-OST在线修改
jvm·数据库·python
DARLING Zero two♡2 小时前
【MySQL数据库】数据库基础
数据库·mysql
m0_743623922 小时前
mysql如何限制用户连接数_使用MAX_USER_CONNECTIONS优化并发
jvm·数据库·python
解救女汉子2 小时前
如何防止SQL注入式非法删除_使用预处理语句绑定参数
jvm·数据库·python
2301_782659182 小时前
C#怎么将集合分块处理_C#如何使用Chunk方法【实战】
jvm·数据库·python
codeejun2 小时前
每日一Go-55、分布式 ID 生成(雪花算法 / Segment / Redis / DB)
数据库·分布式·golang
qq_424098562 小时前
如何分析enq- TM - contention_外键未建索引导致的表级锁阻塞
jvm·数据库·python