在了解ORM之前我们先了解什么是持久化,因为所有的ORM框架所做的事情无非就是将对象映射成数据库中的数据,以及将数据库中的数据映射成对象。
所谓持久化就是把数据(内存中的对象)保存到可永久存储的存储设备中(例如:硬盘),持久化的主要应用是将内存中的数据存储在关系型数据库中。当然也可以保存在磁盘文件中,XML数据文件,JSON文件中等的。
ORM(Object-Relational Mapping),对象关系映射,它的作用是在关系型数据库和对象之间做一个映射,这样,我们在具体的操作数据库时,就不需要和复杂的SQL语句打交道,像平时操作对象操作数据即可。
在目前的企业应用系统设计中,MVC,即 Model(模型)- View(视图)- Control(控制)为主要的系统架构模式。MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)等。
将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。
而 ORM 作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。
简单来说,按通常的系统设计,使用 JDBC 操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。
一般基本都是如下几个步骤:
由上可看出代码逻辑非常复杂,这还不包括某条语句执行失败的处理逻辑。其中的业务处理逻辑和数据存取逻辑完全混杂在一块。
而一个完整的系统要包含成 千上万个这样重复的而又混杂的处理过程,假如要对其中某些业务逻辑或者一些相关联的业务流程做修改,要改动的代码量将不可想象。
另一方面,假如要换数据库产品或者运行环境也可能是个不可能完成的任务。而用户的运行环境和要求却千差万别,我们不可能为每一个用户每一种运行环境设计一套一样的系统。
所以就要将一样的处理代码即业务逻辑和可能不一样的处理即数据存取逻辑分离开来,另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序 运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。
所以为解决这一困难,就出现 ORM 这一个对象和数据之间映射技术。常用的ORM框架有Hibernate、Mybatis、Mybatis-plus等,接下来我们以Mybatis为例深入学习。
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
下面我们先了解一下Mybatis架构:
在本小节内,将使用Mybatis框架搭建开发环境,并使用Mybatis进行单表的增删改查,其中涉及到的一些概念会在后续章节中陆续讲解。
在前面的课程中,已经学习了Maven的基础知识,使用Maven可以更好的管理和构建项目,因此使用Maven构建项目。项目结构如下:
首先准数据库:
CREATE DATABASE MYBATIS_DEMO;
USE MYBATIS_DEMO;
CREATE TABLE STUDENT(
STUDENT_ID INT PRIMARY KEY AUTO_INCREMENT,
STUDENT_NAME VARCHAR(20),
STUDENT_AGE INT,
STUDENT_GENDER CHAR(2)
);
INSERT INTO STUDENT (STUDENT_NAME, STUDENT_AGE, STUDENT_GENDER) VALUES ("张无忌",18,"男");
INSERT INTO STUDENT (STUDENT_NAME, STUDENT_AGE, STUDENT_GENDER) VALUES ("张翠山",43,"男");
INSERT INTO STUDENT (STUDENT_NAME, STUDENT_AGE, STUDENT_GENDER) VALUES ("殷素素",40,"男");
INSERT INTO STUDENT (STUDENT_NAME, STUDENT_AGE, STUDENT_GENDER) VALUES ("谢逊",50,"男");
第一步:在pom.xml中导入依赖
org.mybatis
mybatis
3.5.6
第二步:在resource目录下新建mybatis-config.xml全局配置文件
<?xml version="1.0" encoding="UTF-8" ?>
第三步:创建SQL语句映射文件StudentMapper.xml
第四步:在java目录下,新建包cn.bytecollege.entity,并在包中新建实体类Student
package cn.bytecollege.entity;
import java.util.Objects;
public class Student {
private Integer studentId;
private String studentName;
private Integer studentAge;
private String studentGender;
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Integer getStudentAge() {
return studentAge;
}
public void setStudentAge(Integer studentAge) {
this.studentAge = studentAge;
}
public String getStudentGender() {
return studentGender;
}
public void setStudentGender(String studentGender) {
this.studentGender = studentGender;
}
@Override
public String toString() {
return "Student{" +
"studentId=" + studentId +
", studentName='" + studentName + ''' +
", studentAge=" + studentAge +
", studentGender='" + studentGender + ''' +
'}';
}
}
第五步:在java目录下新建cn.bytecollege.mapper包,并在包中新建接口StudentMapper
package cn.bytecollege.mapper;
import cn.bytecollege.entity.Student;
import java.util.List;
public interface StudentMapper {
List findAll();
}
第六步:新建测试类查询所有信息
package cn.bytecollege;
import cn.bytecollege.entity.Student;
import cn.bytecollege.mapper.StudentMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class App
{
public static void main( String[] args ){
//读取Mybatis配置文件
InputStream is = App.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession
SqlSession session = sqlSessionFactory.openSession();
// List list = session.selectList("cn.bytecollege.mapper.StudentMapper.findAll");
StudentMapper mapper = session.getMapper(StudentMapper.class);
List list = mapper.findAll();
list.forEach(System.out::println);
}
}
运行上面的程序结果如下图:
从上面的代码可以看出使用Mybatis的整个过程可以分为以下 步:
在上面步骤中出现了SqlSessionFactory、SqlSession等对象,下面就这些对象进行简单的介绍。
页面更新:2024-03-20
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号