手写Mybatis框架(半自动ORM框架)-- 01: 分析实现Mybatis的三个阶段
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写Mybatis框架(半自动ORM框架)-- 01: 分析实现Mybatis的三个阶段相关的知识,希望对你有一定的参考价值。
1. 实现01: 回顾Mybatis
对于数据库的操作,在以后,用原始的JDBC肯定是比较少的(但很重要)。
大多数时候,我们都会使用框架去操作,我个人比较喜欢使用Mybatis。
既然用的比较熟练了,那我就象征性的写个框架试试吧。
Hibernate是全自动ORM框架,而Mybatis是半自动的。hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。这就是为什么Mybatis是半自动的原因。
正是因为mysql的这种特性,让它具有了底层调优的能力(对于Sql的调优)
1.1 准备工作(代码不重要,现在重要的理解流程)
实体类的数据库表是一一对应的
mapper接口是我们自定义的,其目的按照需求去操作数据,这里往往有很多CRUD(增删改查的接口)
mapper接口的每一个方法其实是对应一条SQL语句的,我们往往配套的有一个mapper.xml文件。这里面的对应关系是:namespace对应实体类的类名,id对应mapper接口的方法名,这样Myabtis就能定位到每一条Sql语句。在mybatis的源码中,会以Map的数据结构存储sql语句,其中namespace+id 为 key , sql语句为value。
这是我写的Mybatis的一个工具类
MybatisUtils.java
package com.tian.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
/**
* Description: SqlSessionFactory可以获得session
*/
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 第一步: 使用Mybatis获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* MethodName: getSqlSession
* Description: SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
* SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
}
待会的测试文件
Test.java
@org.junit.Test
public void test01() {
SqlSession sqlSession1 = MybatisUtils.getSqlSession();
BlogMapper mapper1 = sqlSession1.getMapper(BlogMapper.class);
Map map = new HashMap();
map.put("title", "微服务");
List<Blog> blogs = mapper1.queryBlogIf(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession1.close();
}
1.2 Mybatis的实现分为3个阶段(重点)
1.2.1 初始化阶段
1.2.2 代理阶段
这里最神奇的是,为什么我们没有定义Mapper接口的是实现类,但是我们可以通过一次数据库的会话,拿到它的实现类呢?
在mybatis中我们可以通过调用mapper接口去直接获取数据库中的数据,而不需要去实现
mapper接口,其实是就是使用了动态代理的方式,为mapper接口创建了代理对象,在代理
对象中实现了相应的访问数据库的逻辑。
BlogMapper是Blog类Mapper层接口,他的具体实现是写在BlogMapper.xml中的。
mybatis-config.xml
在mybatis核心配置文件中声明BlogMapper.xml的位置。
1.2.3 数据读写阶段
以上是关于手写Mybatis框架(半自动ORM框架)-- 01: 分析实现Mybatis的三个阶段的主要内容,如果未能解决你的问题,请参考以下文章
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
面试官让我现场手写MyBatis框架,我10分钟就搞定了!!(全程实战,建议收藏)