SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

如何为贡井区建设局创建一个专业且高效的建站系统?

96SEO 2026-02-20 01:35 11


始化1.1.1

通过sqlSession中提供的API方法来操作数据库1.2.2

如何为贡井区建设局创建一个专业且高效的建站系统?

底层1.3.1

一级缓存和二级缓存一级缓存session级别默认开启开启二级缓存2.2.3

先在二级缓存中查找2.2.3.2

Executor.query()先走一级缓存查询一级缓存也没有的话则进行DB查询3、如何扩展MyBatis中的缓存3.1

架构理解3.2

基础模块cache缓存模块装饰器模式logging日志模块适配器模式、策略模式、代理模式reflection反射模块工程模式、装饰器模式datasource数据源工程模式transaction事务模块工厂模式SqlSessionFactorySqlSessionFactoryBuilder建造者模式5、谈谈你对SqlSessionFactory的理解6、谈谈你读SqlSession的理解6.1

SqlSession6.2

Spring中是如何解决DefaultSqlSession的数据安全问题7、谈谈你对MyBatis的理解8、谈谈MyBatis中分页的理解8.1

逻辑分页RowBounds8.2.2

物理分页拦截器实现执行分页语句的组装9、谈谈MyBatis中的插件原理9.1

实现原理9.2.1

创建自定义Java类通过Interceptor注解来定义相关的方法签名9.2.2

在对应的配置文件中通过plugin来注册自定义的拦截器9.2.3

拦截器的作用10、不同Mapper中的id是否可以相同11、谈谈对MyBatis架构设计的理解11.1

接口层11.2

基础模块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

1.1

Resources.getResourceAsStream(mybatis-config.xml);全局配置文件mybatis-config.xml

映射文件mapper/*.xml

SqlSessionFactoryBuilder().build(in);加载解析的相关信息存储在SqlSessionFactory对象的Configuration属性里

1.1.2

sqlSession.selectList(com.boge.mapper.UserMapper.selectUserList);1.2.2

UserMapper

sqlSession.getMapper(UserMapper.class);1.2.3

//5.关闭会话

映射文件的加载解析Configuration.mappedStatements

/***

KEY${namespace}.${id}*/protected

final

collection);生产了DefaultSqlsession实例对象完成了Executor对象的创建以及二级缓存CachingExecutor的装饰同时完成了插件逻辑的植入。

读取配置文件读成字节输入流注意现在还没解析InputStream

resourceAsStream

Resources.getResourceAsStream(sqlMapConfig.xml);//

创建DefaultSqlSessionFactory对象SqlSessionFactory

sqlSessionFactory

SqlSessionFactoryBuilder().build(resourceAsStream);//

sqlSession

sqlSessionFactory.openSession();//

4.(1)根据statementid来从Configuration中map集合中获取到了指定的MappedStatement对象//(2)将查询任务委派了executor执行器User

user

sqlSession.selectOne(com.lagou.mapper.IUserMapper.findById,1);System.out.println(user);User

user2

sqlSession.selectOne(com.lagou.mapper.IUserMapper.findById,1);System.out.println(user2);//

原理图

降低数据源的访问频率从而提高数据源的处理能力提高服务器的响应速度。

2.2

实现类SoftCache软引用缓存装饰器SynchronizedCache同步的

Cache

STATEMENT级别的缓存使一级缓存只针对当前执行的这一statement有效

setting

valueSTATEMENT/二级缓存SqlSessionFactory级别工厂/进程级别

开启二级缓存

在mybatis配置文件中配置cacheEnabled为true

!--

延迟加载的全局开关。

开启时所有关联对象都会延迟加载。

默认false

setting

valuetrue/在映射文件中添加cache标签可以在cache标签中更细致的增加配置

!--二级缓存开启--

获取mapper映射文件中cache标签里的配置MappedStatement.getCache()如果cache配置不为空从二级缓存中查找(List)

TransactionalCacheManager.getObject(cache,

key);如果没有值则执行查询

Executor.query()这个查询实际也是先走一级缓存查询一级缓存也没有的话则进行DB查询先将查询到的结果放入缓存TransactionalCacheManager.putObject(cache,

key,

一级缓存二级缓存作用域SqlSession级别SqlSessionFactory级别找到概率5%90%Overridepublic

ListE

也就是我们上面解析Mapper中cache/标签中创建的它保存在Configration中//

我们在初始化解析xml时分析过每一个MappedStatement都有一个Cache对象就是这里Cache

cache

{//如果需要刷新缓存的话就刷新flushCachetrueflushCacheIfRequired(ms);if

(ms.isUseCache()

暂时忽略存储过程相关ensureNoOutParams(ms,

boundSql);SuppressWarnings(unchecked)//

从二级缓存中获取结果ListE

如果没有值则执行查询这个查询实际也是先走一级缓存查询一级缓存也没有的话则进行DB查询list

delegate.query(ms,

Executor.query()先走一级缓存查询一级缓存也没有的话则进行DB查询

/***

localCache;SuppressWarnings(unchecked)Overridepublic

ListE

{ErrorContext.instance().resource(ms.getResource()).activity(executing

已经关闭则抛出

{handleLocallyCachedOutputParameters(ms,

key,

deferredLoadsdeferredLoads.clear();//

则进行清理if

(configuration.getLocalCacheScope()

{//

创建Cache接口的实现重写putObject和getObject方法

在mapper映射文件中的cache标签里增加type属性关联自定义的Cache接口的实现

cache

typeorg.mybatis.caches.ehcache.EhcacheCache

/如果未添加type会默认读取

PerpetualCache基于Cache实现针对于缓存的功能

1.缓存数据淘汰2.缓存数据的存放机制3.缓存数据添加是否同步【阻塞】4.缓存对象是否同步处理…做了增强处理–代理模式

datasource数据源工程模式

SqlSessionFactorySqlSessionFactoryBuilder建造者模式

目的创建SqlSession对象单例在应用程序服务中只保存唯一的一份SqlSessionFactory对象的创建是通过SqlSessionFactoryBuilder同时也完成了全局配置文件Configuration和相关映射文件Mapper的加载和解析操作。

涉及到了工厂模式和建造者模式

/***

对象*/SuppressWarnings(Duplicates)public

SqlSessionFactory

ExceptionFactory.wrapException(Error

building

{ErrorContext.instance().reset();try

{reader.close();}

映射配置文件》http://www.mybatis.org/mybatis-3/zh/configuration.html**

param

标签propertiesElement(root.evalNode(properties));//

settings

settingsAsProperties(root.evalNode(settings));//

VFS

标签typeAliasesElement(root.evalNode(typeAliases));//

plugins

标签pluginElement(root.evalNode(plugins));//

objectFactory

标签objectFactoryElement(root.evalNode(objectFactory));//

objectWrapperFactory

标签objectWrapperFactoryElement(root.evalNode(objectWrapperFactory));//

reflectorFactory

标签reflectorFactoryElement(root.evalNode(reflectorFactory));//

settings

标签environmentsElement(root.evalNode(environments));//

databaseIdProvider

标签databaseIdProviderElement(root.evalNode(databaseIdProvider));//

typeHandlers

标签typeHandlerElement(root.evalNode(typeHandlers));//

mappers

标签mapperElement(root.evalNode(mappers));}

catch

SqlSession对象的获取需要通SqlSessionFactory来实现

作用域是会话级别当一个新的会话到来的时候需要新建一个SqlSession对象当一个会话结束后需要关闭相关会话资源

2.通过getMapperxx.xml来获取相关mapper接口的代理对象来处理

6.2

Spring中是如何解决DefaultSqlSession的数据安全问题

DefaultSqlSession是非线程安全的也就意味着我们不能把DefaultSqlSession声明在成员变量中。

每个线程都应该有自己的SqlSession实例。

最佳作用域是请求或方法作用域决不能将SqlSession实例引用放在一个类的静态域甚至一个类的实例变量也不行。

应该将SqlSession放在一个和HTTP请求相似的作用域中每次请求打开一个SqlSession返回一个响应后就关闭他关闭操作放在finally块中。

Spring中提供了SqlSessionTemplate来实现SqlSession的相关定义。

其中每一个方法都通过SqlSessionProxy来操作这是一个动态代理对象。

在动态代理对象中通过方法级别的DefaultSqlSession来实现相关的数据库操作。

使用频率最高的ORM框架、持久层框架提供了非常方便的API实现CRUD支持灵活的缓存处理方案一级缓存、二级缓存、三级缓存支持相关的延迟数据加载处理还提供了非常多的灵活标签来实现复杂的业务处理if

forech

设计中MyBatis允许映射语句执行过程中的某一点进行拦截调用允许使用插件拦截的方法包括

9.2

创建自定义Java类通过Interceptor注解来定义相关的方法签名

9.2.2

interceptorcom.github.pagehelper.PageHelperproperty

namedialect

valuemysql//plugin/plugins9.2.3

检查执行的SQL对执行SQL的参数做处理对查询的结果做装饰处理对查询SQL做分表处理

可以相同每一个映射文件的namespace都会设置为对应的mapper接口的全类路径名称

11.1

JDBCMyBatis资源频繁的创建和释放数据库的连接对象造成系统资源的浪费通过全局配置文件设置相关的数据连接池sql维护sql语句直接写在了代码中维护成本高动态性要求较高sql语句写在Mapper映射文件中的标签里参数向SQL中传递参数麻烦where条件不一定占位符和参数需要一一对应自动完成Java对象和SQL中参数的映射结果集映射麻烦需要循环封装SQL本身的变化会导致解析的难度通过ResultHandler自动将结果集映射到Java对象拓展不支持事务、缓存、延迟加载等功能提供了相关实现性能运行性能更高开发效率更高

private

context.getStringAttribute(default);}//

XNode

child.getStringAttribute(id);if

{//

transactionManagerElement(child.evalNode(transactionManager));//

dataSource

dataSourceElement(child.evalNode(dataSource));DataSource

dataSource

Environment.Builder(id).transactionFactory(txFactory).dataSource(dataSource);//

Environment

中configuration.setEnvironment(environmentBuilder.build());}}}}UnpooledDataSource非数据库连接池的实现PooledDataSource数据库连接池的实现从连接池中获取连接对象如果有空闲连接直接返回活跃连接数是否超过了最大连接数是否有连接超时的连接数据库连接池关闭连接如果空闲连接没有超过最大连接数那么就返回空闲队列中。

否则关闭真实的连接。

连接池工作原理

Managed在MyBatis中没有处理任何的事务操作这种情况下事务的处理会交给Spring容器来管理

14.2.4

代理对象执行的逻辑的本质还是会执行SqlSession中相关的DML操作的方法

15.4

Reflector是MyBatis中提供的一个针对反射封装简化的模块简化反射的相关操作。

表结构的数据和Java对象中数据的映射不可避免的会存在非常多的反射操作。

Reflector是一个独立的模块可以把这个模块单独抽取出来直接使用的。

反射器每个

Reflector

MyBatis是如何解决Java中的类型和数据库中的字段类型的映射

类型处理器

--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.2.2/version/dependency在spring配置文件spring-context.xml中添加数据源信息和sqlSessionFactory将sqlSessionFactory注入容器

!--

classcom.alibaba.druid.pool.DruidDataSource

init-methodinit

数据源驱动类可不写Druid默认会自动根据URL识别DriverClass

--property

nametimeBetweenEvictionRunsMillis

value60000

classorg.mybatis.spring.SqlSessionFactoryBean!--关联数据源--property

namedataSource

refdataSource/!--添加别名设置--property

valuecom.hlframe.common.persistence.BaseEntity/!--映射文件和接口文件不在同一个目录下的时候配置映射文件位置--property

namemapperLocations

valueclasspath:/mappings/**/*.xml/!--关联MyBatis的配置文件--property

nameconfigLocation

valueclasspath:/mybatis-config.xml/property/bean18.2

SpringBoot整合MyBatis

!--mybatis-plus--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion${mybatis-plus.version}/versionscopeprovided

/scope/dependency将sqlSessionFactory注入容器



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback