为什么不使用 JDBC
其实也不是不使用 JDBC,我们大多数的 ORM 框架中,底层封装的都是 JDBC,只不过从我们开始学习 JDBC 到经历一段时间的成长后,会发现 JDBC 中的重复代码太多,我们就开始思考有没有一种方式将其中的重复内容进行封装供我们调用,而这就是 ORM 架构的前身。
ORM 框架
对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
ORM 框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。简单理解为一种框架的格式。
只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。
元数据
是描述其它数据的数据 (data about other data),或者说是用于提供某种资源的有关信息的结构数据(structured data)。元数据是描述信息资源或数据等对象的数据。
MyBatis 概述
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 体系结构
API 接口层:提供给外部使用的接口 API,开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
MyBatis 的基本搭建
1. 在 pom.xml 中引入 jar 包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2. 在 resources 下创建 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>
<settings>
<!--输出日志到控制台中-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--分别书写驱动类、网址、账号和密码 注意网址中&使用&代替-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/guanwei"/>
<property name="username" value="guanwei"/>
<property name="password" value="a123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--引入的资源文件-->
<mapper resource="EmpMapper.xml"/>
</mappers>
</configuration>
3. 创建所需的 bean 包类
package com.dailyblue.java.mybatis.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class Emp implements Serializable {
private Integer empNo;
private String ename;
private String job;
private Integer mgr;
private String hireDate1;
private Double sal;
private Double comm;
private Integer deptNo;
private Integer empState;
}
4. 创建所需的 mapper 包接口
package com.dailyblue.java.mybatis.mapper;
import com.dailyblue.java.mybatis.bean.Emp;
import java.util.List;
public interface EmpMapper {
List<Emp> findAll();
}
5. 创建 mapper 包接口对应的 Xxx.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dailyblue.java.mybatis.mapper.EmpMapper">
<select id="findAll" resultType="com.dailyblue.java.mybatis.bean.Emp">
select * from emp
</select>
</mapper>
6. 在 App 类中进行测试
InputStream in = Resources.getResourceAsStream("config.xml");
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(in);
SqlSession session = ssf.openSession();
List<Emp> list = session.selectList("findAll");
System.out.println(list);
MyBatis 基本术语
SqlSessionFactoryBuilder:这个类的主要作用就是创建 SqlSessionFactory ,一旦创建了 SqlSessionFactory,就不再需要它了,它可以被实例化、使用和丢弃。因此,它实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在,以保证所有的 XML 解析资源可以被释放给更重要的事情。
SqlSessionFactory:SqlSessionFactory 是 MyBatis 框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
SqlSession:SqlSession 是 Mybatis 最重要的构建之一,SqlSession 是数据库和 Java 服务器之间的一次通话,每一次对数据库的增删改查操作都是通过 SqlSession 来完成的。它提供了 select 、 insert 、 update 、delete 等方法,在旧版本中使用 SqlSession 接口的这些方法,但是在新版本中 Mybatis 就会建议直接使用 mapper 接口的方法。它由四个部分组成:
- Execute:调度执行StatementHandler、ParmmeterHandler、ResultHandler执行相应的SQL语句。
- StatementHandler:使用数据库中的Statement(PrepareStatement)执行操作,即底层是封装好的PrepareStatement。
- ParammeterHandler:处理SQL参数。
- ResultHandler:结果集ResultSet封装处理放回。
在下一篇博客中我们来讲解 MyBatis 的相关配置文件 --MyBatis 入门到精通(二)