如何深度理解mybatis?

深度自定义MyBatis

回顾mybatis的操作的核心步骤 编写核心类SqlSessionFacotryBuild进行解析配置文件 深度分析解析SqlSessionFacotryBuild干的核心工作 编写核心类SqlSessionFacotry 深度分析解析SqlSessionFacotry干的核心工作 编写核心类SqlSession 深度分析解析SqlSession干的核心工作 总结自定义mybatis用的技术点
一. 回顾mybatis的操作的核心步骤 
声明一点我们本篇主要探讨的是mybatis的注解方式的操作, 完全从头开始都是小编从头开搞的, 如果与其他大神的代码思维有出入请多指教
我们首先需要准备mybatis的核心配置文件(当然导入相关的坐标这里不在啰嗦)
准备好结果的实体类以及在mApper接口上编写需要执行的sql语句
public class User { private Integer uid; private String username; private String password; private String nickname; } package cn.itcast.mapper; import cn.itcast.pojo.User; import org.Apache.ibatis.annotations.Select; import JAVA.util.List; public interface UserMapper { @Select("select * from users") List findAll(); }
使用mybatis的api来帮助我们完成sql语句的执行以及结果集的封装
//1.关联主配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //2.解析配置文件 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = builder.build(in); //3.创建会话对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.可以采用接口代理的方式 UserMapper mapper = sqlSession.getMapper(UserMapper.class); List all = mapper.findAll(); System.out.println(all); //5.释放资源 sqlSession.close();
思考: mybatis大致是如何帮我们完成相关操作的 ?
我们通过Resources的getResourceAsStream告诉了mybatis我们编写的核心配置文件的位置, mybatis就可以找到我们数据库的连接信息, 也同时找到我们编写的sql语句的地方, 然后可以将其解析按照某种规则存放起来, 我们通过调用接口代理的方式执行方法时, 可以找到对应方法上的sql语句然后执行将结果封装返回给我们
二. 编写核心类SqlSessionFacotryBuild进行解析配置文件
那么我们废话不多说开始我们自定义mybatis的旅程,
1.首先我们需要用户编写配置文件, 然后通过我们自己的Resources来告诉我们配置文件所在位置 package com.itheima.ibatis.configuration; import java.io.InputStream; public class Resources { public static InputStream getResourceAsStream(String path) { return ClassLoader.getSystemClassLoader().getResourceAsStream(path); } } 2. 然后需要定义SqlSessionFacotryBuild来对配置文件进行解析分发 package com.itheima.ibatis.configuration; import com.itheima.ibatis.core.session.SqlSessionFactory; import com.itheima.ibatis.core.session.impl.DefaultSqlSessionFactory; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import javax.sql.DataSource; import java.io.File; import java.io.InputStream; import java.lang.reflect.Method; import java.util.List; import java.util.Properties; public class SqlSessionFactoryBuilder { private Configuration configuration = new Configuration(); public SqlSessionFactory build(InputStream in) { SAXReader saxReader = new SAXReader(); Document document = null; try { document = saxReader.read(in); } catch (DocumentException e) { e.printStackTrace(); } Element rootElement = document.getRootElement(); parseEnvironment(rootElement.element("environments")); parseMapper(rootElement.element("mappers")); return new DefaultSqlSessionFactory(configuration); } private void parseMapper(Element mapper) { String pack = mapper.element("package").attributeValue("name"); String directory = pack.replace(".", "/"); String path = ClassLoader.getSystemClassLoader().getResource("").getPath(); File mapperDir = new File(path, directory); if (!mapperDir.exists()) { throw new RuntimeException("找不到mapper映射"); } findMapper(mapperDir, pack); // System.out.println(configuration.getSql()); } private void findMapper(File mapperDir, String base) { File[] files = mapperDir.listFiles(); if (files != null) { for (File file : files) { if (file.isFile()) { if (file.getName().endsWith(".class")) { String name = file.getName(); name = name.substring(0, name.lastIndexOf(".")); String className = base + "." + name; initMapper(className); } } else { findMapper(file, base + "." + file.getName()); } } } } private void initMapper(String className) { try { Class clazz = Class.forName(className); Method[] methods = clazz.getMethods(); for (Method method : methods) { if(method.getAnnotations().length>0){ Mapper mapper = ParseMapper.parse(method); this.configuration.getMappers().put(className + "." + method.getName(), mapper); } } } catch (Exception e) { e.printStackTrace(); } } private void parseEnvironment(Element environments) { String defEnv = environments.attributeValue("default"); Node node = environments.selectSingleNode("//environment[@id='" + defEnv + "']"); List list = node.selectNodes("//property"); Properties properties = new Properties(); for (Element element : list) { String name = element.attributeValue("name"); String value = https://www.isolves.com/it/cxkf/kj/2022-11-14/element.attributeValue("value"); properties.put(name, value); } DataSource dataSource = new DefaultDataSource().getDataSource(properties); configuration.setDataSource(dataSource); } }


推荐阅读