96SEO 2026-02-20 01:35 11
通过sqlSession中提供的API方法来操作数据库1.2.2

一级缓存和二级缓存一级缓存session级别默认开启开启二级缓存2.2.3
Executor.query()先走一级缓存查询一级缓存也没有的话则进行DB查询3、如何扩展MyBatis中的缓存3.1
基础模块cache缓存模块装饰器模式logging日志模块适配器模式、策略模式、代理模式reflection反射模块工程模式、装饰器模式datasource数据源工程模式transaction事务模块工厂模式SqlSessionFactorySqlSessionFactoryBuilder建造者模式5、谈谈你对SqlSessionFactory的理解6、谈谈你读SqlSession的理解6.1
Spring中是如何解决DefaultSqlSession的数据安全问题7、谈谈你对MyBatis的理解8、谈谈MyBatis中分页的理解8.1
物理分页拦截器实现执行分页语句的组装9、谈谈MyBatis中的插件原理9.1
创建自定义Java类通过Interceptor注解来定义相关的方法签名9.2.2
在对应的配置文件中通过plugin来注册自定义的拦截器9.2.3
拦截器的作用10、不同Mapper中的id是否可以相同11、谈谈对MyBatis架构设计的理解11.1
基础模块12、谈谈对传统JDBC开发的不足13、MyBatis中数据源模块的设计连接池工作原理14、MyBatis中事务模块的设计14.1
在MyBatis中执行DML操作事务的处理逻辑15、谈谈你对Mapper接口的设计理解15.1
代理对象执行的逻辑的本质还是会执行SqlSession中相关的DML操作的方法15.4
为何要多包一层代理对象16、谈谈你对Reflector模块的理解17、MyBatis的类型转换模块18、整合MyBatis18.1
Resources.getResourceAsStream(mybatis-config.xml);全局配置文件mybatis-config.xml
SqlSessionFactoryBuilder().build(in);加载解析的相关信息存储在SqlSessionFactory对象的Configuration属性里
sqlSession.selectList(com.boge.mapper.UserMapper.selectUserList);1.2.2
sqlSession.getMapper(UserMapper.class);1.2.3
映射文件的加载解析Configuration.mappedStatements
KEY${namespace}.${id}*/protected
collection);生产了DefaultSqlsession实例对象完成了Executor对象的创建以及二级缓存CachingExecutor的装饰同时完成了插件逻辑的植入。
读取配置文件读成字节输入流注意现在还没解析InputStream
Resources.getResourceAsStream(sqlMapConfig.xml);//
创建DefaultSqlSessionFactory对象SqlSessionFactory
SqlSessionFactoryBuilder().build(resourceAsStream);//
sqlSessionFactory.openSession();//
4.(1)根据statementid来从Configuration中map集合中获取到了指定的MappedStatement对象//(2)将查询任务委派了executor执行器User
sqlSession.selectOne(com.lagou.mapper.IUserMapper.findById,1);System.out.println(user);User
sqlSession.selectOne(com.lagou.mapper.IUserMapper.findById,1);System.out.println(user2);//
降低数据源的访问频率从而提高数据源的处理能力提高服务器的响应速度。
实现类SoftCache软引用缓存装饰器SynchronizedCache同步的
STATEMENT级别的缓存使一级缓存只针对当前执行的这一statement有效
valueSTATEMENT/二级缓存SqlSessionFactory级别工厂/进程级别
在mybatis配置文件中配置cacheEnabled为true
延迟加载的全局开关。
开启时所有关联对象都会延迟加载。
默认false
valuetrue/在映射文件中添加cache标签可以在cache标签中更细致的增加配置
获取mapper映射文件中cache标签里的配置MappedStatement.getCache()如果cache配置不为空从二级缓存中查找(List)
TransactionalCacheManager.getObject(cache,
Executor.query()这个查询实际也是先走一级缓存查询一级缓存也没有的话则进行DB查询先将查询到的结果放入缓存TransactionalCacheManager.putObject(cache,
一级缓存二级缓存作用域SqlSession级别SqlSessionFactory级别找到概率5%90%Overridepublic
也就是我们上面解析Mapper中cache/标签中创建的它保存在Configration中//
我们在初始化解析xml时分析过每一个MappedStatement都有一个Cache对象就是这里Cache
{//如果需要刷新缓存的话就刷新flushCachetrueflushCacheIfRequired(ms);if
暂时忽略存储过程相关ensureNoOutParams(ms,
boundSql);SuppressWarnings(unchecked)//
如果没有值则执行查询这个查询实际也是先走一级缓存查询一级缓存也没有的话则进行DB查询list
Executor.query()先走一级缓存查询一级缓存也没有的话则进行DB查询
localCache;SuppressWarnings(unchecked)Overridepublic
{ErrorContext.instance().resource(ms.getResource()).activity(executing
{handleLocallyCachedOutputParameters(ms,
deferredLoadsdeferredLoads.clear();//
(configuration.getLocalCacheScope()
创建Cache接口的实现重写putObject和getObject方法
在mapper映射文件中的cache标签里增加type属性关联自定义的Cache接口的实现
typeorg.mybatis.caches.ehcache.EhcacheCache
PerpetualCache基于Cache实现针对于缓存的功能
1.缓存数据淘汰2.缓存数据的存放机制3.缓存数据添加是否同步【阻塞】4.缓存对象是否同步处理…做了增强处理–代理模式
SqlSessionFactorySqlSessionFactoryBuilder建造者模式
目的创建SqlSession对象单例在应用程序服务中只保存唯一的一份SqlSessionFactory对象的创建是通过SqlSessionFactoryBuilder同时也完成了全局配置文件Configuration和相关映射文件Mapper的加载和解析操作。
涉及到了工厂模式和建造者模式
对象*/SuppressWarnings(Duplicates)public
ExceptionFactory.wrapException(Error
{ErrorContext.instance().reset();try
映射配置文件》http://www.mybatis.org/mybatis-3/zh/configuration.html**
标签propertiesElement(root.evalNode(properties));//
settingsAsProperties(root.evalNode(settings));//
标签typeAliasesElement(root.evalNode(typeAliases));//
标签pluginElement(root.evalNode(plugins));//
标签objectFactoryElement(root.evalNode(objectFactory));//
标签objectWrapperFactoryElement(root.evalNode(objectWrapperFactory));//
标签reflectorFactoryElement(root.evalNode(reflectorFactory));//
标签environmentsElement(root.evalNode(environments));//
标签databaseIdProviderElement(root.evalNode(databaseIdProvider));//
标签typeHandlerElement(root.evalNode(typeHandlers));//
标签mapperElement(root.evalNode(mappers));}
SqlSession对象的获取需要通SqlSessionFactory来实现
作用域是会话级别当一个新的会话到来的时候需要新建一个SqlSession对象当一个会话结束后需要关闭相关会话资源
2.通过getMapperxx.xml来获取相关mapper接口的代理对象来处理
Spring中是如何解决DefaultSqlSession的数据安全问题
DefaultSqlSession是非线程安全的也就意味着我们不能把DefaultSqlSession声明在成员变量中。
每个线程都应该有自己的SqlSession实例。
最佳作用域是请求或方法作用域决不能将SqlSession实例引用放在一个类的静态域甚至一个类的实例变量也不行。
应该将SqlSession放在一个和HTTP请求相似的作用域中每次请求打开一个SqlSession返回一个响应后就关闭他关闭操作放在finally块中。
Spring中提供了SqlSessionTemplate来实现SqlSession的相关定义。
其中每一个方法都通过SqlSessionProxy来操作这是一个动态代理对象。
在动态代理对象中通过方法级别的DefaultSqlSession来实现相关的数据库操作。
使用频率最高的ORM框架、持久层框架提供了非常方便的API实现CRUD支持灵活的缓存处理方案一级缓存、二级缓存、三级缓存支持相关的延迟数据加载处理还提供了非常多的灵活标签来实现复杂的业务处理if
设计中MyBatis允许映射语句执行过程中的某一点进行拦截调用允许使用插件拦截的方法包括
创建自定义Java类通过Interceptor注解来定义相关的方法签名
interceptorcom.github.pagehelper.PageHelperproperty
valuemysql//plugin/plugins9.2.3
检查执行的SQL对执行SQL的参数做处理对查询的结果做装饰处理对查询SQL做分表处理
可以相同每一个映射文件的namespace都会设置为对应的mapper接口的全类路径名称
JDBCMyBatis资源频繁的创建和释放数据库的连接对象造成系统资源的浪费通过全局配置文件设置相关的数据连接池sql维护sql语句直接写在了代码中维护成本高动态性要求较高sql语句写在Mapper映射文件中的标签里参数向SQL中传递参数麻烦where条件不一定占位符和参数需要一一对应自动完成Java对象和SQL中参数的映射结果集映射麻烦需要循环封装SQL本身的变化会导致解析的难度通过ResultHandler自动将结果集映射到Java对象拓展不支持事务、缓存、延迟加载等功能提供了相关实现性能运行性能更高开发效率更高
context.getStringAttribute(default);}//
child.getStringAttribute(id);if
transactionManagerElement(child.evalNode(transactionManager));//
dataSourceElement(child.evalNode(dataSource));DataSource
Environment.Builder(id).transactionFactory(txFactory).dataSource(dataSource);//
中configuration.setEnvironment(environmentBuilder.build());}}}}UnpooledDataSource非数据库连接池的实现PooledDataSource数据库连接池的实现从连接池中获取连接对象如果有空闲连接直接返回活跃连接数是否超过了最大连接数是否有连接超时的连接数据库连接池关闭连接如果空闲连接没有超过最大连接数那么就返回空闲队列中。
否则关闭真实的连接。
Managed在MyBatis中没有处理任何的事务操作这种情况下事务的处理会交给Spring容器来管理
代理对象执行的逻辑的本质还是会执行SqlSession中相关的DML操作的方法
Reflector是MyBatis中提供的一个针对反射封装简化的模块简化反射的相关操作。
表结构的数据和Java对象中数据的映射不可避免的会存在非常多的反射操作。
Reflector是一个独立的模块可以把这个模块单独抽取出来直接使用的。
反射器每个
MyBatis是如何解决Java中的类型和数据库中的字段类型的映射
--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.2.2/version/dependency在spring配置文件spring-context.xml中添加数据源信息和sqlSessionFactory将sqlSessionFactory注入容器
classcom.alibaba.druid.pool.DruidDataSource
数据源驱动类可不写Druid默认会自动根据URL识别DriverClass
nametimeBetweenEvictionRunsMillis
classorg.mybatis.spring.SqlSessionFactoryBean!--关联数据源--property
refdataSource/!--添加别名设置--property
valuecom.hlframe.common.persistence.BaseEntity/!--映射文件和接口文件不在同一个目录下的时候配置映射文件位置--property
valueclasspath:/mappings/**/*.xml/!--关联MyBatis的配置文件--property
valueclasspath:/mybatis-config.xml/property/bean18.2
!--mybatis-plus--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion${mybatis-plus.version}/versionscopeprovided
/scope/dependency将sqlSessionFactory注入容器
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback