Mybatis源码分析

Mybatis源码分析


第一章、回顾
1. 课程中工具的版本
1. JDK8
2. IDEA2018.3
3. Maven3.5.3
4. MySQL 5.1.48 --> MySQL 5Mybatis 3.4.6
2. Mybatis开发的简单回顾
1. Mybatis做什么?Mybatis是一个ORM类型框架,解决的数据库访问和操作的问题,对现有JDBC技术的封装。
2. Mybaits搭建开发环境 1. 准备jar<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency>2. 准备配置文件a. 基本配置文件 mybatis-config.xml1. 数据源的设置 environments2. 类型别名3. mapper文件的注册b. Mapper文件1. DAO规定方法的实现 --> SQL语句 3. 初始化配置 mybatis-config.xml配置 environment
3. 开发步骤 7步1. entity2. 类型别名3. table 4. DAO接口5. Mapper文件6. Mapper文件的注册7. API编程 
  • 核心代码分析

    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();两种方式功能等价 
    实现效果 区别 那种方式好?第一种方式好 表达概念更清晰 第一种开发,本质上就是对第二种开发的封装。(代理设计模式)UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
    List<User> users = userDAO.queryAllUsers();List<User> users = sqlSession.selectList("com.baizhiedu.dao.UserDAO.queryAllUsers");String name = "huxz";public class User{private String name = "huxz";
    }
    
第二章、Mybaits的核心对象
1. Mybatis的核心对象及其作用

在这里插入图片描述

1. 数据存储类对象概念:在Java中(JVM)对Mybatis相关的配置信息进行封装mybatis-config.xml ----> ConfigurationConfiguration 1. 封装了mybatis-config.xml2. 封装了mapper 文件  MappedStatement3. 创建Mybatis其他相关的对象 XXXDAOMapper.xml ----> MappedStatement(形象的认知,不准确)操nt对象 对应的就是 Mapper文件中的一个一个的 配置标签 <select id. -----> MappedStatement<insert id. -----> MappedStatement 注定 一个Mybatis应用中 N个MappedStament 对象 MappedStatment ---> Configuration MappedStatment 中 封装SQL语句 ---> BoundSql
2. 操作类对象 (SqlSession) ---> 门面 ExcutorExcutor 是Mybatis中处理功能的核心1. 增删改update  查query2. 事务操作 提交 回滚3. 缓存相关的操作Excutor接口 BatchExcutorJDBC中批处理的操作, BatchExcutor ReuseExcutor目的:复用 Statement insert into t_user(ID,name)values(1,‘孙帅’);insert into t_user(ID,name)values(2,‘孙帅1’);SimpleExcutor常用Excutor Mybatis推荐 默认 Configuration protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;StatmentHandlerStatementHandler是Mybatis封装了JDBC Statement,真正Mybatis进行数据库访问操作的核心功能:增删改差StatementHandler接口SimpleStatementHandlerJDBC 操作 PreparedStatementHandlerCallableStatementHandler ParameterHandler目的:Mybatis参数 ---》 JDBC 相关的参数 @Param ---> #{} --- > ?ResultSetHandler目的:对JDBC中查询结果集 ResultSet 进行封装 TypeHandlerJava程序操作 数据库Java类型   数据库类型String    varcharint       numberint       int 

在这里插入图片描述

在这里插入图片描述

2. Mybatis的核心对象 如何与SqlSession建立的联系?
Mybatis源码中的这些核心对象 在 SqlSession调用对应功能时候建立联系 SqlSession.insert()DefaultSqlSessionExctutorStatmentHandler 
SqlSession.update()
SqlSession.delete()
SqlSession.selectOne();
...底层  SqlSession.insert()SqlSession.update()SqlSession.delete()....应用层面:UserDAO userDAO =  SqlSession.getMapper(UserDAO.class);//UserDAO接口的实现类的对象 //疑问? UserDAO接口实现类 在哪里?//动态字节码技术 ---> 类 在JVM 运行时创建 ,JVM运行结束后,消失了 //动态字节码技术 1. 如何 创建 UserDAO XXXDAO接口的实现类 代理 (动态代理)a. 为原始对象(目标)增加【额外功能】 b. 远程代理 1.网络通信 2.输出传输 (RPCDubbo c. 接口实现类,我们看不见实实在在的类文件,但是运行时却能体现出来。无中生有Proxy.newProxyIntance(ClassLoader,Interface,InvocationHandler)2. 实现类 如何进行实现的             interface UserDAO{List<User> queryAllUsers();         save(User user)}UserDAOImpl implements UserDAO{queryAllUsers(){sqlSession.select("namespace.id",参数)|-Excutor|-StatementHandler|- ParameterHandler , ResultSetHandlerTypeHandler }save(){sqlSession.insert("namespace.id",参数)}}userDAO.queryUserById()userDAO.queryUsers();MyBatis 完成代理创建 核心类型 ---> DAO接口的实现类 MapperProxy implements InvocationHandler DAO接口ClassSqlSession invokeSqlSession.insert updatedeleteselectOneselectListSqlCommand:1. id = namespace.id2. type = insert|delete|select SqlSession.insert()SqlSession.delete....MapperProxyFactoryProxy.newProxyInstrace()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

OS模块配置详解 - 中 一、OS模块配置实操1.1 打开OS Configuration1.2 创建OS Cores1.3 添加系统定时器1.4 添加一个Os Application1.5 添加几个Task1.5.1 添加Init Task1.5.2 添加BSW Task1.5.3 添加APP Task二、中断分布调整与设置中断号2.1 调整中断分布2.2 正确设置中断号2…

OpenCV介绍和使用

一:简介 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,广泛应用于图像处理、计算机视觉、机器学习等领域。它包含了大量的函数和工具,可以用于图像读取、显示、处理、特征提取、目标检测等任务。 OpenCV最初是由Intel公司开发的…

Github:分享一款开源的跨平台多功能远程控制和监控工具Spark

目录 1、设备列表及操作列表 2、登录机器 Shell 执行命令 3、桌面远程访问 4、远程设备的进程管理 5、远程设备文件管理 今天要给大家推荐一个开源的跨平台多功能远程控制和监控工具&#xff1a;Spark。 目前该项目处于不维护状态&#xff0c;大家可以自己根据需要进行扩…

代码随想录 Leetcode763. 划分字母区间

题目&#xff1a; 代码(首刷看解析 2024年2月18日&#xff09;&#xff1a; class Solution { public:vector<int> partitionLabels(string s) {int hash[27] {0};for (int i 0; i < s.size(); i) {hash[s[i] - a] i;}vector<int> res;int left 0;int righ…

PyTorch使用Tricks:学习率衰减 !!

文章目录 前言 1、指数衰减 2、固定步长衰减 3、多步长衰减 4、余弦退火衰减 5、自适应学习率衰减 6、自定义函数实现学习率调整&#xff1a;不同层不同的学习率 前言 在训练神经网络时&#xff0c;如果学习率过大&#xff0c;优化算法可能会在最优解附近震荡而无法收敛&#x…

【开源】SpringBoot框架开发智能教学资源库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…

超级楼梯(动态规划)

#include <iostream> using namespace std; int main (){int n;cin >> n;int f[41];f[1] 0;f[2] 1;f[3] 2;for (int i 4;i < 42;i){f[i] f[i-1] f[i-2];}while (n--){int stair;cin>> stair;cout << f[stair]<<endl;}return 0; }

【ChatIE】论文解读:Zero-Shot Information Extraction via Chatting with ChatGPT

文章目录 介绍ChatIEEntity-Relation Triple Extration (RE)Named Entity Recognition (NER)Event Extraction (EE) 实验结果结论 论文&#xff1a;Zero-Shot Information Extraction via Chatting with ChatGPT 作者&#xff1a;Xiang Wei, Xingyu Cui, Ning Cheng, Xiaobin W…

嵌入式——EEPROM(AT24C02)

目录 一、初识AT24C02 1. 介绍 2. 引脚功能 补&#xff1a; 二、AT24C02组成 1. 存储结构 2. AT24C02通讯地址 3. AT24C02寻址方式 &#xff08;1&#xff09;芯片寻址 &#xff08;2&#xff09;片内子地址寻址 三、AT24C02读写时序 1. 写操作 &#xff08;1&…

数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八&#xff1a;栈的基本操作 Description 堆栈是一种基本的数据结构。堆栈具有两种基本操作方式&#xff0c;push 和 pop。push一个值会将其压入栈顶&#xff0c;而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。 Input 首先输入整数t&am…

Linux|centos7下的编译|ffmpeg的二进制安装

Windows版本的ffmpeg&#xff1a; ###注意&#xff0c;高版本可能必须要windows10以及以上才支持&#xff0c;win7估计是用不了的 下载地址&#xff1a;Builds - CODEX FFMPEG gyan.dev 或者这个下载地址&#xff1a;https://github.com/BtbN/FFmpeg-Builds/releases 这两个…

ClickHouse--12-可视化工具操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 可视化工具操作1 tabixhttp://ui.tabix.io/ 2 DBeaverhttps://dbeaver.io/download/ 可视化工具操作 1 tabix tabix 支持通过浏览器直接连接 ClickHouse&#xff…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱12(附带项目源码)

效果演示 文章目录 效果演示系列目录前言悬停显示物品详情源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制作、快…

11.【CPP】模版(深入理解模版的实例化,从编译链接的原理理解模版为何无法分离编译)

非类型模版参数 1.模版参数分为类型模版参数和非类型模版参数&#xff0c;非类型模版参数一般都是整形常量&#xff08;整形&#xff1a;size_t,int,char等&#xff09; 2.浮点数、类对象以及字符串是不允许作为非类型模版参数的。非类型模版的参数必须在编译的时候就能确定结…

leetcode hot100 拆分整数

在本题目中&#xff0c;我们需要拆分一个整数n&#xff0c;让其拆分的整数积最大。因为每拆分一次都和之前上一次拆分有关系&#xff0c;比如拆分6可以拆成2x4&#xff0c;还可以拆成2x2x2&#xff0c;那么我们可以采用动态规划来做。 首先确定dp数组的含义&#xff0c;这里dp…

第13章 网络 Page744~746 asio核心类 ip::tcp::endPoint

2. ip::tcp::endpoint ip::tcp::socket用于连接TCP服务端的 async_connect()方法的第一个入参是const endpoint_type& peer_endpoint. 此处的类型 endpoint_type 是 ip::tcp::endpoint 在 在 ip::tcp::socket 类内部的一个别名。 libucurl 库采用字符串URL表达目标的地…

LeetCode 100题目(python版本)待续...

一.哈希 1.两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复…

Linux系统上配置网络防火墙的工具iptables 和 ufw 区别详细介绍

iptables 和 ufw&#xff08;Uncomplicated Firewall&#xff09;都是用于在Linux系统上配置网络防火墙的工具&#xff0c;但它们在用户友好性和使用方式上有所不同。 iptables&#xff1a; iptables 是Linux内核中的一个功能强大的工具&#xff0c;用于设置、…

百倍量化之ACS和Demarker指标以及混合策略

1. ACS指标含义 1.1 ACS指标 ACS策略主要通过计算 ADX(平均方向性移动指数)相对于收盘价的比值及其标准差来分析市场趋势的强度和稳定性。它结合了市场趋势的强度和价格的变动率。如果 acs 的值较大,说明相对于当前价格,市场的趋势强度大;如果这个值较小,则表明相对于当…

Acwing---846. 树的重心

树的重心 1.题目2.基本思想3.代码实现 1.题目 给定一颗树&#xff0c;树中包含 n n n 个结点&#xff08;编号 1 ∼ n 1∼n 1∼n&#xff09;和 n − 1 n−1 n−1 条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 …