资讯动态

《深入浅出MyBatis技术原理与实战》读书笔记(含源码)

发布时间:2026/8/24 1:19:44 来源:尧图企业网站定制
私信获取PDF下载地址。简介JDBC是一种桥接模式。hibernate vs mybatishibernate 提供的是一种全表映射的模式写 HQL 语言hbm.xml 文件制定映射规则有多少个实体类对应有多少个表(不算那种连接表)就需要写多少个 hbm.xml 文件hibernate.cfg.xml 文件是配置文件还提供级联、缓存、映射、一对多功能。缺点不能有效支持存储过程灵活、SQL 优化、减少数据的传递是数据库优化的基本方法。基于此mybatis 比 hibernate 要更适合互联网的需求。mybatis 的 ORM 映射模型入门mybatis 的核心组件SqlSessionSQL Mappermybatis 提供两种模式创建SqlSessionFactoryxml 和 java 代码推荐前者。SqlSession 的用途映射器(java 接口仅仅只需要接口就可以和 mapper.xml 文件或者注解组成) 的四个主要作用定义参数类型描述缓存描述 SQL 语句定义查询结果和 pojo 的映射关系。注解示例publicinterfaceRoleMapping1{Select(valueselect id,role_name as roleName,note from t_role where id #{id} )RolegetRole(Longid);}配置配置文件是 mybatis 的核心部分之一。mybatis-config.xml 配置的标签有顺序要求的是使用 IDEA 时如果顺序错误IDEA 有报错提醒。映射器resultType 和 resultMap不可同时使用前者定义类的全路径在允许自动匹配的情况下结果集将通过java bean 的规范映射后者可以自定义映射规则动态SQL元素作用备注if判断语句单条件分支判断choose(when、otherwise)相当于Java中的case when语句多条件分支判断trim(where、set)辅助元素用于处理一些SQL拼装问题foreach循环语句在in语句等列举条件常用bind通过OGNL表达式自定义上下文变量解析和运行原理MyBatis的运行分为两大部分读取配置文件缓存到Configuration对象用以创建SqlSessionFactory接口SqlSession的执行过程可通过SqlSessionFactoryBuilder去构建通过org.apache.ibatis.builder.xml.XMLConfigBuilder解析XML配置文件读出配置参数并将读取的数据存入org.apache.ibatis.session.Configuration类使用Confinguration对象建SqlSessionFactory的默认实现类org.apache.ibatis.session.defaults.DefaultSqlSessionFactoryConfiguration作用读入配置文件包括基础配置的XML文件和映射器的XML文件初始化基础配置如MyBatis别名等一些重要的类对象如插件、映射器、ObjectFactory和typeHandler对象提供单例为后续创建SessionFactory服务并提供配置的参数执行一些重要的对象方法初始化配置信息。MyBatis会读出所有XML配置的信息并保存到Configuration类的单例中properties全局参数settings设置typeAliases别名typeHandler类型处理器ObjectFactory对象plugin插件environment环境DatabaseldProvider数据库标识Mapper映射器映射器是由3个部分组成MappedStatement保存映射器的一个节点(select|insert|delete|update)。包括许多配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultType、languageDriver等重要配置内容SqlSource提供BoundSql对象的地方是MappedStatement的一个属性BoundSql建立SQL和参数的地方。有3个常用属性SQL、parameterObject、parameterMappings。BoundSql解读parameterObject为参数本身可传递简单对象POJO、Map或Param注解参数传递简单对象包括int、String、float、double等将基础类型如int包装为对应的对象类如Integer传递POJO或MapparameterObject就是传入的POJO或Map不变也可传递多个参数如果没有Param注解MyBatis会把parameterObject变为一个MapStringObject对象其键值的关系是按顺序来规划的类似于{1:p1,2:p2,3:p3,...,param1:p1,param2”:p2,param3:p3...}所以可使用#{param1}或者#{1}去引用第一个参数如果使用Param注解MyBatis就会把parameterObject也会变为一个MapString,Object对象类似于没有Param注解只是把其数字的键值对应置换为Param注解的键值。如Param(key1) String p1parameterObject 键值包含key1:p1,param1:p1}parameterMappings一个List每一个元素都是ParameterMapping的对象对象描述参数。参数包括属性、名称、表达式、javaType、jdbcType、typeHandler等重要信息一般无要改变。通过它可实现参数和SQL的结合以便PreparedStatement能够通过它找到parameterObject对象的属性并设置参数使得程序准确运行。sql就是映射器里面的一条SQL大多数情况无需修改只有在自定义插件时可根据需要进行改写。插件插件接口org.apache.ibatis.plugin.InterceptorpublicinterfaceInterceptor{Objectintercept(InvocationparamInvocation)throwsThrowable;defaultObjectplugin(Objecttarget){returnPlugin.wrap(target,this);}defaultvoidsetProperties(Propertiesproperties){}}解读intercept核心方法。将直接覆盖所拦截对象原有的方法参数Invocation对象通过它可反射调度原来对象的方法plugintarget是被拦截对象给被拦截对象生成一个代理对象并返回setProperties允许在plugin元素中配置所需参数方法在插件初始化的时候就被调用了一次然后把插件对象存入到配置中以便后面再取出。org.apache.ibatis.builder.xml.XMLConfigBuilder完成插件初始化privatevoidpluginsElement(XNodecontext)throwsException{if(context!null)for(XNodechild:context.getChildren()){Stringinterceptorchild.getStringAttribute(interceptor);Propertiespropertieschild.getChildrenAsProperties();InterceptorinterceptorInstanceresolveClass(interceptor).getDeclaredConstructor(newClass[0]).newInstance(newObject[0]);interceptorInstance.setProperties(properties);this.configuration.addInterceptor(interceptorInstance);}}解读使用反射技术生成对应的插件实例然后调用插件方法中的setProperties方法设置配置的参数然后将插件实例保存到配置对象中以便读取和使用它。插件实例对象是一开始就被初始化。插件使用责任链模式、代理模式。工具类MetaObject可用于读取或修改对象的属性// 用于包装对象publicstaticMetaObjectforObject(Objectobject,ObjectFactoryobjectFactory,ObjectWrapperFactoryobjectWrapperFactory,ReflectorFactoryreflectorFactory){if(objectnull)returnSystemMetaObject.NULL_META_OBJECT;returnnewMetaObject(object,objectFactory,objectWrapperFactory,reflectorFactory);}// 用于获取对象属性值支持OGNLpublicObjectgetValue(Stringname){PropertyTokenizerpropnewPropertyTokenizer(name);if(!prop.hasNext())returnthis.objectWrapper.get(prop);MetaObjectmetaValuemetaObjectForProperty(prop.getIndexedName());if(metaValueSystemMetaObject.NULL_META_OBJECT)returnnull;returnmetaValue.getValue(prop.getChildren());}// 用于修改对象属性值支持OGNLpublicvoidsetValue(Stringname,Objectvalue){PropertyTokenizerpropnewPropertyTokenizer(name);if(prop.hasNext()){MetaObjectmetaValuemetaObjectForProperty(prop.getIndexedName());if(metaValueSystemMetaObject.NULL_META_OBJECT){if(valuenull)return;metaValuethis.objectWrapper.instantiatePropertyValue(name,prop,this.objectFactory);}metaValue.setValue(prop.getChildren(),value);}else{this.objectWrapper.set(prop,value);}}MyBatis-SpringSpring AOPSpring MVC使用场景福利由于原文作者貌似并没有提供源码于是自己整理了一下放在GitHub上面欢迎下载。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价