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分离开来,从而可以保持各部分的独立性以及功能扩展。

流程
- 加载驱动
java
Class.forName("com.mysql.jdbc.Driver");
- 创建连接
java
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
- 创建发送SQL语句的对象Statement
java
Statement sta= con.createStatement();
- 发送SQL语句获取结果
java
ResultSet rs= sta.executeQuery("SELECT * FROM `user`");
- 处理数据
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)+" ");
}
- 释放资源
java
rs.close();
sta.close();
con.close();
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语句中。