ORM 框架是什么
ORM(Object-Relation Mapping),是一种编程技术,能够实现面向对象编程语言与关系型数据库之间的数据转换(映射),解决了面向对象与关系数据库存在的互不匹配的现象。
ORM 是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM 框架的本质是简化编程中操作数据库的编码。
MyBatis 介绍
MyBatis 就是一款标准的 ORM 框架,被广泛的应用于各企业开发中。
MyBatis 支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。
MaBatis 可以使用简单的 XML 或注解用于配置和原始映射。将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
优点:
- SQL 被统一提取出来,便于统一管理和优化
- SQL 和代码解耦,将业务逻辑和数据访问逻辑分离
- 提供映射标签,支持对象与数据库的 ORM 字段关系映射
- 提供对象关系映射标签,支持对象关系组件维护
- 支持动态 SQL
缺点:
- 编写 SQL 语句时工作量可能会大
- SQL 语句依赖于数据库,导致数据库移植性差
MyBatis 的概念
Mapper 配置: Mapper 配置可以使用基于 XML 的 Mapper 配置文件来实现,也可以使用基于 Java 注解的 MyBatis 注解来实现,甚至可以直接使用 MyBatis 提供的 API 来实现。【推荐使用XML方式,业务逻辑与数据访问逻辑相分离】
Mapper 接口: Mapper 接口是指自定义的一个数据操作接口。Mapper 接口的方法通常与 Mapper 配置文件中的 select、insert、update、delete 等 XML 结点一一对应。【可以理解为Dao,解析的时候使用了动态代理】
Executor: MyBatis 中所有的 Mapper 语句的执行都是通过 Executor 进行的,Executor 是 MyBatis 的一个核心接口。
SqlSession: SqlSession 是 MyBatis 的关键对象,是执行持久化操作的独享。SqlSession 底层封装了 JDBC 连接,可以用 SqlSession 实例来直接执行被映射的 SQL 语句。
SqlSessionFactory: SqlSessionFactory 是 MyBatis 的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象类获得,而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出。
MyBatis 的工作流程如下:
- 首先加载 Mapper 配置的 SQL 映射文件,或者是注解的相关 SQL 内容。
- 创建会话工厂,MyBatis 通过读取配置文件的信息来构造出会话工厂【SqlSessionFactory】。
- 创建会话。通过会话工厂,MyBatis 就可以创建会话对象【SqlSession】。会话对象是一个接口,该接口中包含了对数据库操作的增删改查方法。
- 创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
- 封装 SQL 对象。执行器会将待处理的 SQL 信息封装到一个对象中【MappedStatement】,该对象包括 SQL 语句、输入参数映射信息和输出结果映射信息。
- 操作数据库。拥有了执行器和 SQL 信息封装对象就可以访问数据库,最后再返回操作结果,结束流程。
在具体的使用过程中,按照上述的流程来执行。
使用
pom.xml
<!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${springboot-mybatis.version}</version> </dependency> <!--mysql连接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias alias="Integer" type="java.lang.Integer"/> <typeAlias alias="Long" type="java.lang.Long"/> <typeAlias alias="Map" type="java.util.Map"/> <typeAlias alias="HashMap" type="java.util.HashMap"/> <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/> <typeAlias alias="ArrayList" type="java.util.ArrayList"/> <typeAlias alias="LinkedList" type="java.util.LinkedList"/> </typeAliases> </configuration>
mybatis: config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml type-aliases-package: love.ning.yangxuyue.domain
application.properties
mybatis.config-location=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml mybatis.type-aliases-package=love.ning.yangxuyue.domain spring.datasource.url=jdbc:mysql://localhost:3306/xxx?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Application.java
可使用@MapperScan扫仓库包: @MapperScan("love.ning.yangxuyue.mapper")