自定义简易版mybatis

项目:简易Mybatis Resources类的作用是获取一个类加载器,根据配置文件的路径,将配置文件加载成字节输入流存储在内存中。创建Resources类@Data/*** 根据路径将配置文件加载为字节流的形式,存储在内存中* @param path 配置文件的位置* @return 返回的字节流*///加载类路径下的配置文件,以字节流的形式返回对sql语句进行封装/*** 对sql语句进行封装*/@Data/*** 数据源*//** 阅读详情

自定义简易版mybatis

说明:在自定义的mybatis框架中,使用了spring中的一些内容,例如spring-jdbc、spring-tx等等,除此之外,连接池使用了阿里巴巴的druid,由于某些帮助类是使用之前用到的,导致配置文件的读取位置与原始mybatis中配置文件的读取位置和方式不同。在自定义的mybatis中,只提供了原始mybatis的简单功能实现。

核心代码

package com.yc.mavenstudy.core;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;

import com.yc.mavenstudy.domain.MapperInfo;

/**
* 解析配置文件的类
* @author : 外哥
* 邮箱 : liwai2012220663@163.com
* 创建时间:2021年1月8日 下午8:25:10
*/
@SuppressWarnings("all")
public class MyBatisConfig {
	private Map<String , String> dataSourceMap = new HashMap<>() ;
	private List<String> mappers = new ArrayList<>() ;
	private static Map<String, MapperInfo> mapperInfos = new HashMap<>() ;
	
	public MyBatisConfig( String config) {
		// 解析主配置文件
		parseXML( config ) ;
		
		// 解析映射文件
		parseMapper() ; 
	}

	/**
	 * 解析映射文件
	 */
	private void parseMapper() {
		if ( mappers == null || mappers.isEmpty() ) {
			// 如果没有映射文件
			return ;
		}
		try {
			SAXReader reader = null ;
			Document doc = null ;
			String namespace = "" ;
			MapperInfo mapperInfo = null ;
			String sql = null ;
			String nodeName = null ;
			List<Element> nodes = null ;
			Pattern pattern = null ;
			Matcher matcher = null ;
			List<String> paramNames = null ;
			
			for (String mapper : mappers) {
				InputStream is = this.getClass().getClassLoader().getResourceAsStream(mapper);
				reader = new SAXReader() ;
				doc = reader.read(is) ;
				
				// 获取命名空间
				namespace = doc.getRootElement().attributeValue("namespace") ;
				
				if ( namespace != null && !"".equals(namespace)) {
					// 命名空间不为空
					namespace += "." ;
				}
				
				// 获取mappers节点下的所有子节点
				nodes = doc.selectNodes("/mapper/*") ;
				
				// 遍历所有节点
				for (Element el : nodes) {
					mapperInfo = new MapperInfo() ;
					// 获取节点名 select/insert等
					nodeName = el.getName() ;
					
					if ( "select".equalsIgnoreCase(nodeName)) {
						// 表示这是一个查询语句
						mapperInfo.setUpdate(false);
					}
					
					// 设置参数类型
					mapperInfo.setParameterType( el.attributeValue("parameterType") );
					// 设置返回值类型
					mapperInfo.setResultType( el.attributeValue("resultType"));
					// 获取sql语句
					sql = el.getTextTrim() ;
					// 创建一个正则表达式
					pattern = Pattern.compile("[#][{]\\w+}") ;
					// 匹配sql语句
					matcher = pattern.matcher(sql) ;
					
					paramNames = new ArrayList<>() ;
					// 迭代所有匹配到的结果
					while ( matcher.find() ) {
						// 将匹配到的结果中的#{}符号全部替换成空
						paramNames.add( matcher.group().replaceAll("[#{}]*", "")) ;
					}
					
					// 设置参数列表
					mapperInfo.setParamNames(paramNames);
					// 将sql语句中匹配成功的地方全部替换成?
					sql = matcher.replaceAll("?") ;
					// 设置sql语句
					mapperInfo.setSql(sql); 
					
					// 将这个节点的信息添加到集合中
					mapperInfos.put( namespace + el.attributeValue("id"), mapperInfo) ;
				}
				
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		
		
	}

	/**
	 * 解析xml文件
	 * @param config
	 */
	private void parseXML(String config) {
		SAXReader reader = new SAXReader() ;
		
		InputStream is = this.getClass().getClassLoader().getResourceAsStream(config);
		Document doc = null ;
		
		try {
			doc = reader.read(is) ;
			
			List<Element> list = doc.selectNodes("//dataSource/property");
			 
			for (Element el : list) {
				dataSourceMap.put(el.attributeValue("name"), el.attributeValue("value")) ;
			}
			
			list = doc.selectNodes("//mappers/mapper") ;
			for (Element el : list) {
				mappers.add(el.attributeValue("resource")) ;
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		} 
	}

	public Map<String, String> getDataSourceMap() {
		return dataSourceMap;
	}

	public  List<String> getMappers() {
		return mappers;
	}

	public static MapperInfo getMapperInfo( String sqlId) {
		return mapperInfos.get(sqlId);
	}
	
	
	
	
}

源代码下载https://download.youkuaiyun.com/download/Simple__Code/14090580

手写简易版ORM框架(仿mybatis) 自己手写的一个半自动框架,里面有运行例子,部分代码从mybatis中抽出 立即下载

相关推荐

MIKE21桥墩模拟实战:抠网格与构筑物法对比与选型指南

本文详细对比了MIKE21软件中抠网格法与构筑物法在桥墩模拟中的应用,包括操作步骤、适用场景及优缺点分析。通过实际案例数据展示两种方法的精度与效率差异,并提供选型决策树和常见问题解决方案,帮助工程师根据项目需求选择最优模拟方法。

weixin_42656416的博客 324

史上最简单的 MyBatis 教程(一)

1 简介MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架,其几乎消除了所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。MyBatis 应用程序大都使用 SqlSessionFac

安正勋的博客 7万+

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(中)

介绍了三相电机控制中的SVPWM算法实现及保护机制设计。SVPWM部分详细解析了电压矢量扇区判断、占空比计算和过调制保护,通过限制占空比范围(0-100%)防止电机失控,并提供了完整的代码实现。保护模块则重点分析了过流、过压/欠压、过温三种保护机制,采用分级处理策略(硬保护停机/软保护降功率)确保系统安全。此外,文章还介绍了参数管理模块在STM32 Flash中的存储方案,包括参数定义、数据结构和读写操作,为电机控制系统提供了完整的解决方案。

bother3000的博客 1389

简易Mybatis

MyBatis 作为持久层框架,主要解决了传统 JDBC 操作中的繁琐和重复性工作,提高了开发效率,同时也提供了灵活的 SQL 编写和结果映射功能,使得开发人员可以更加专注于业务逻辑的实现。简化数据库操作灵活的SQL编写参数映射结果集处理。

qq_49469637的博客 436

英飞凌TC3xx的GTM模块到底有多强?从PWM生成到电机驱动,一篇讲透车载定时器核心

本文深入解析英飞凌TC3xx系列中的GTM模块在汽车电子领域的强大功能,从PWM生成到电机驱动的全链路设计。通过模块化架构和硬件级解决方案,GTM显著提升系统精度和响应速度,适用于电机控制、电源管理等复杂场景。文章结合实战经验,详细拆解GTM的技术实现和性能优势。

weixin_27741699的博客 204

从病毒分析到安全研究:手把手教你用OD破解加壳程序的反调试机制

本文深入探讨了如何识别并绕过加壳程序的反调试机制,特别是针对使用IsDebuggerPresent等API检测的防护手段。通过实战案例和工具链配置,详细介绍了逆向工程中的关键技巧,包括内存补丁、硬件断点定位OEP等,帮助安全研究人员有效突破软件保护技术。

tgb345678的博客 825

手写一个简化版Mybatis

1、引包 引入dom4j包以及数据库连接包,我用的是mysql数据库,因此引入mysql-connector包 2、数据库创建 数据库比较简单,创建sql如下 CREATE DATABASE db_test; use db_test; CREATE TABLE `tb_user` ( `id` int(11) NOT NULL, `name` varchar(20) NOT ...

YotWei 1221

ABB机器人与西门子PLC、工业相机联合实现无序抓取的完整调试方案

将此方案导入系统后,逐步执行调试,确保各环节信号正常触发,即可实现高效无序抓取!

CHUXUEZHE8210的博客 1995

简单的mybatis搭建

1、创建一个javase项目;2、新建一个source folder命名为config,专门用来存放配置文件;3、新建一个folder命名为lib,用来存放jar包,本次搭建只存放了最基础了3个包,分别是mybatis-3.2.7.jar、ojdbc6.jar、log4j-1.2.17.jar。其中,只需要有mybatis.jar和ojdbc.jar就可以让mybatis跑起来。不要忘记build...

zaoanmiao的博客 720

药物对接仿真软件:HADDOCK_(16).实践项目:抗体-抗原对接案例

定义分子结构文件。

kkchenjj的博客 581

【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册

【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册

AI人人懂 1074

深入理解Mybatis(第一讲)——手写ORM框架(简易版Mybatis)

我们来自定义一个持久层框架,也就是Mybatis的简易版。 使用端的搭建 idea中新建maven工程IPersistence_test: 在resources目录下新建sqlMapConfig.xml文件, <Configuration> <dataSource> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <pr

程序员资料站 594

YOLOv11模型改进全攻略:利用轻量化模块实现精度与速度双跃升

如果你在实操中遇到模块替换导致的精度骤降或部署报错,不妨尝试调整轻量化模块的替换比例,或针对性地保留关键层的原始结构。记住,轻量化的核心是“在精度损失可接受的范围内最大化提升效率”,只要结合业务场景灵活取舍,你也能让YOLOv11在资源受限的环境中大放异彩。接下来,我们从模块选型到代码集成,一步步带你打造“轻量且能打”的YOLOv11,真正帮你解决工业落地中的效率与精度痛点。训练过程中关注模型的mAP和推理速度,若精度下降过多,可调整模块替换的比例(如仅替换Backbone的部分卷积层)。

m0_64661770的博客 502

(1)Mybatis————如何自定义一个Mybatis框架

1,MyBatis简介 1.1,MyBatis历史 1.2,为什么要使用MyBatis? 1.3,MyBatis入门案例 1.4,基于注解的 mybatis 2,自定义一个Mybatis框架 2.1,流程分析图 2.2,环境搭建步骤 2.3,示例代码 MyBatis简介 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis可以使用简单的XML或注解用于配置和原始映射,

qq_2533491534的博客 587

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

自定义MyBatis

基于XML文件方式自定义简单的MyBoptis 这里用到的技术 代理模式(JDK动态代理) 工厂模式 C3P0连接池 DOM4J XPATH 竟然要自定义MyBatis,那就要把pom.xml里MyBatis的做标干掉,添加C3P0,DOM4J,XPATH坐标 <!-- C3P0 --> <dependency> <groupId>...

lan_fa_cai的博客 304

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

自定义实现mybatis框架的简单实现-搭建XML开发

mybatis框架作为一个流行的和数据库打交道的持久层框架,在我们实际开发中运用广泛,其框架的设计思想值得我们这些新手学习。笔者近几天开始学习mybatis框架,便自己参照mybatis框架的源码以及其它一些相关文献,自定义实现一个简单的mybatis框架。下面便开始进入正题: 1.我们在使用mybatis框架的时候,一般使用以下几个步骤: //读取配置文件 InputStream inputStream = Resources.getResourceAsSt

陌意随影的博客 381

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Mybatis全方位深入源码剖析

#MyBatis源码剖析 1 MyBatis 框架概述 mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis 通过 xml或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 ja

黑马程序员官方博客 430

MyBatis入门

文章目录1. MyBatis 框架概述2. ORM 思想3. MyBatis 入门3.1 MyBatis 的入门案例(基于 XML 配置文件)3.2 MyBatis 的入门案例(基于注解)3.3 MyBatis 入门案例的设计模式分析4. 自定义 MyBatis 框架4.1 自定义 MyBatis 框架分析4.2 自定义 MyBatis 框架的实现4.2.1 前期准备4.2.2 补齐测试类中缺少的...

bm1998 275

从零手写实现 mybatis 系列(零)mybatis 核心特性

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(这是官网解释)

550

用了好几年的MyBatis还不知道其原理?来,带你手写MyBatis!

MyBatis是一款优秀的持久层框架,相信很多Java开发者都使用过它来操作数据库。 如下代码是一个最简单的例子: 编写一个接口,定义一个保存方法,写好需要执行的sql语句,MyBatis就能帮我们把数据保存到数据库。 使用非常的简单,但是大家有没有想过这样一个问题: 我们只写了接口,并没有实现类,MyBatis如何实现其中的逻辑呢? 理解一个框架原理最好的方法,就是自己去实现一下。 实现思路基本如下: 执行sql?使用JDBC。 只有接口没有实现类?JDK动态代理生成代理对象。 依赖注入?扫描Mapp

程序员小潘 1万+

自定义 Mybatis 框架的分析

我们将使用前面所学的基础知识来构建一个属于自己的持久层框架,将会涉及到的一些知识点:工厂模式(Factory 工厂模式)、构造者模式(Builder 模式)、代理模式,反射,自定义注解,注解的反射,xml 解析,数据库元数据,元数据的反射等。 流程步骤示意图 : 前期准备 建立 Maven 项目工程 引入相关坐标 引入工具类到项目中 目录层级说明 代码稍后上传至 gitHub ...

羽扬 -- YYDCYY 195

手写MyBatis ORM框架

手写MyBatis ORM框架目标:实现:思路:一、前期准备1、加入依赖2、自定义插入注解3、自定义删除注解4、自定义更新注解5、自定义查询注解6、自定义参数注解7、定义和数据库对应的实体类8、定义对数据库的操作接口9、自定义动态代理方法10、自定义动态代理11、自定义测试类二、自定义代理完善1、JDBC工具类2、SQL语句处理类3、完成拦截类总结概括流程图重点及易错点1、返回值2、res.nex...

珍惜 1万+

自定义设计一个Mybatis框架

1.创建数据库、表、实体类、持久层接口、配置文件 create database study_mybaits CREATE table `USER`(id int(10),username varchar(20),birthday date,sex varchar(20), address varchar(20)) insert into user VALUES (1,'张三',DATE('1994-08-29'),'男','安徽省芜湖市') package com.mrhan.domain; impo

qq_43621789的博客 238

mybatis select 返回值long null_mybatis第01天--编写一个mini mybatis框架

基于 XML 的自定义 mybatis 框架 定义一个接口:public interface IUserDao { /** * 查询所有用户 * @return */ List<User> findAll(); }定义接口的mapper.xml<?xml version="1.0" encoding="UTF-8"?> <mapper names...

weixin_39919165的博客 132

手写Mybatis

MyBatis 一个是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。其封装了JDBC,使用XML 或注解(Annotation)来配置,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 本文实现一个mini版的访MyBatis ORM框架,以熟悉Mybatis的处理流程~主要实现@insert @sele...

鸟哥哥的专栏 1650

myBatis框架之入门(一)

什么是框架   框架就是一个架子,表演节目,舞台已经搭建好,表演什么节目,看自己的需求了。   框架是一个半成品,对于Java语言来说,框架就是封装了别人的代码。在框架的基础上我们在进一步开发,拿来主义。 框架解决什么问题 解决的是技术整合问题。软件开发环境和规模都很大,不可能任何一个项目的代码都从零开始,此时就需要一个非常优秀的框架把基础技术整合完毕,我们在他的基础上进一步开发。提...

weixin_30569001的博客 81
上一篇: 自定义简易版tomcat--基于网络编程
下一篇: 消费者与生产者--线程java
夕卜
博客等级 码龄6年 18粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值