96SEO 2026-02-20 02:48 42
Connection,java数据库连接)是一种用于执行SQL语句的Java

API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
DBUtils是Java编程中的数据库操作实用工具小巧简单实用。
DBUtils封装了对JDBC的操作简化了JDBC操作可以少写代码。
ResultSetHandler接口用于定义select操作后怎样封装结果集
DBUtils类它就是一个工具类定义了关闭资源与事务处理的方法
年创建的开放源代码的对象关系框架。
它强大且高效的构建具有关系对象持久性和查询服
类别到数据库表格中并且不用编写任何代码为在数据库中直接储存和检索
APIs。
如果在数据库中或任何其它表格中出现变化那么仅需要改变
不需要应用程序服务器来操作。
操控你数据库中对象复杂的关联。
最小化与访问数据库的智能提取策略。
提供简单的数据询问。
hibernate的完全封装导致无法使用数据的一些功能。
Hibernate的缓存问题。
Hibernate对于代码的耦合度太高。
Hibernate寻找bug困难。
Hibernate批量数据操作需要大量的内存空间而且执行过程中需要的对象太多
JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法.如果你的查询很简单仅仅是传入相应SQL或者相关参数然后取得一个单一的结果那么你可以选择如下一组便利的模板方法。
优点运行期高效、内嵌Spring框架中、支持基于AOP的声明式事务
缺点必须于Spring框架结合在一起使用、不支持数据库跨平台、默认没有缓存
1、Mybatis是一个半ORM对象关系映射框架底层封装了JDBC是程序员在开发时只需要关注SQL语句本身不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
使得程序员可以花更多的精力放到业务开发中。
另外程序员直接编写原生态sql严格控制sql执行性能灵活度高。
statement中sql的动态参数进行映射生成最终执行的sql语句最后由mybatis框架执行sql并将结果映射为java对象并返回。
从执行sql到返回result的过程。
1、基于SQL语句编程相当灵活不会对应用程序或者数据库的现有设计造成任何影响SQL写在XML里解除sql与程序代码的耦合便于统一管理提供XML标签支持编写动态SQL语句并可重用。
2、与JDBC相比减少了50%以上的代码量消除了JDBC大量冗余的代码不需要手动开关连接
3、很好的与各种数据库兼容因为MyBatis使用JDBC来连接数据库所以只要JDBC支持的数据库MyBatis都支持。
5、提供映射标签支持对象与数据库的ORM字段关系映射提供对象关系映射标签支持对象关系组件维护。
1、SQL语句编写工作量大熟练度要高SQL语句的编写工作量较大尤其当字段多、关联表多时对开发人员编写SQL语句的功底有一定要求。
2、SQL语句依赖于数据库导致数据库移植性差不能随意更换数据库。
1、MyBatis专注于SQL本身是一个足够灵活的DAO层解决方案。
2、对性能的要求很高或者需求变化较多的项目如互联网项目MyBatis将是不错的选择。
1、Mybatis是一个半自动的ORM框架在查询关联对象或关联集合对象时需要手动编写sql语句来完成;Hibernate是全自动ORM映射工具查询关联对象或者关联集合对象时可以根据对象关系模型直接获取不需要编写sql.
2、Mybatis直接编写原生态sql可以严格控制sql执行性能灵活度高非常适合对性能要求高需求变化频繁的项目但是如果涉及到较多的字段或者关联多表时sql语句编写量大且对开发人的sql语句编写功底要求高。
3、Hibernate对象/关系映射能力强数据库无关性好适合需求变化不大的项目使用hibernate开发可以节省很多代码提高效率。
org.apache.ibatis.builder.xml.XMLConfigBuilder;
org.apache.ibatis.session.SqlSessionFactory;
org.apache.ibatis.session.SqlSessionFactoryBuilder;
使用XML配置文件构建SqlSessionFactory并允许传入Environment和Properties
基于Configuration对象创建SqlSessionFactory
SqlSessionFactoryBuilder.SqlSessionFactoryImpl(configuration);
ExceptionFactory.wrapException(Error
ErrorContext.instance().reset();
使用InputStream构建SqlSessionFactory
使用InputStream构建SqlSessionFactory并允许传入Environment和Properties
基于Configuration对象创建SqlSessionFactory
SqlSessionFactoryBuilder.SqlSessionFactoryImpl(configuration);
ExceptionFactory.wrapException(Error
ErrorContext.instance().reset();
SqlSessionFactoryImpl是SqlSessionFactory的默认实现
SqlSessionFactoryImpl(Configuration
org.apache.ibatis.session.SqlSession;
打开一个新的SqlSession并允许传入执行器类型和自动提交参数。
打开一个新的SqlSession并允许传入执行器类型、自动提交参数和配置属性。
org.apache.ibatis.executor.Executor;
org.apache.ibatis.executor.ExecutorType;
org.apache.ibatis.session.Configuration;
org.apache.ibatis.session.SqlSession;
org.apache.ibatis.session.SqlSessionFactory;
SqlSessionFactoryImpl(Configuration
openSession(ExecutorType.SIMPLE);
openSession(ExecutorType.SIMPLE,
configuration.newExecutor(executorType,
使用Configuration和Executor创建SqlSession
DefaultSqlSession(configuration,
方法有多个重载版本允许用户指定执行器类型、是否自动提交事务以及配置属性来打开
SqlSession。
这些重载方法最终都会调用一个或多个带有所有参数的
是线程安全的一旦创建就可以在整个应用程序中重用。
通常每个应用程序只需要一个
则是非线程安全的因此不应该在多个线程之间共享。
每个线程应该有自己的
的设计符合了工厂模式和单例模式的思想。
SqlSessionFactory
selectOne、selectList、insert、update、delete
org.apache.ibatis.executor.Executor;
org.apache.ibatis.executor.statement.StatementHandler;
org.apache.ibatis.mapping.MappedStatement;
org.apache.ibatis.session.Configuration;
org.apache.ibatis.session.ResultHandler;
org.apache.ibatis.session.RowBounds;
org.apache.ibatis.session.SqlSession;
DefaultSqlSession(Configuration
根据statement和parameter获取MappedStatement
configuration.getMappedStatement(statement);
configuration.newStatementHandler(this,
configuration.getMappedStatement(statement);
configuration.newStatementHandler(this,
ResultHandler.DEFAULT_RESULT_HANDLER);
与上一个selectList方法类似但允许传入RowBounds以进行分页查询
configuration.getMappedStatement(statement);
configuration.newStatementHandler(this,
ResultHandler.DEFAULT_RESULT_HANDLER);
configuration.getMappedStatement(statement);
configuration.newStatementHandler(this,
configuration.getMappedStatement(statement);
configuration.newStatementHandler(this,
configuration.getMappedStatement(statement);
configuration.newStatementHandler(this,
configuration.getMappedStatement(statement);
configuration.newStatementHandler(this,
可能还有其他方法如提交事务、回滚事务、关闭SqlSession等
等方法用于执行插入、更新和删除操作。
它们与查询方法类似但返回的是受影响的记录数。
接口的代理实现。
这允许你直接使用接口调用方法而无需手动创建和配置代理。
的使用通常遵循“打开-执行-关闭”的模式以确保资源的正确释放。
的动态代理机制自动生成代理对象。
Mapper接口定义了与数据库操作相关的方法而
接口动态生成一个代理对象。
这个代理对象会在运行时拦截方法调用并自动执行相应的
语句执行的一些选项。
例如在插入操作中useGeneratedKeys
内部使用的核心类其实现细节和源代码通常较为复杂不适合在这里完整地列出。
不过我可以为你提供一个简化版的
SqlSession、Executor、StatementHandler
它有三个实现类SimpleExecutor、ReuseExecutor
框架中的核心组件其源代码相对较长且涉及多个内部类和复杂逻辑。
在这里V
BaseExecutor类Executor接口的一个基础实现类
查询操作的实现逻辑包括预处理语句、设置参数、执行查询、处理结果集等
SimpleExecutor类BaseExecutor的一个简单实现用于执行SQL语句
这里可以添加SimpleExecutor特有的逻辑或者直接调用父类的实现
这里可以添加SimpleExecutor特有的逻辑或者直接调用父类的实现
中执行器模式的核心部分允许不同的执行策略如批处理、重用预处理语句等通过不同的实现类来实现。
接口的一个基础实现类提供了执行器的一些通用逻辑。
它通常包含配置信息、事务对象和错误上下文等成员变量。
BaseExecutor
类及其实现通常包含更多的成员变量、方法和复杂的逻辑以处理SQL语句的解析、参数绑定、结果映射以及缓存等高级功能。
此外Executor
StatementHandler、ParameterHandler、ResultSetHandler
处理参数绑定将用户提供的参数转换为JDBC可以理解的格式并设置到预处理语句中。
Transaction一起工作以确保SQL操作在事务的上下文中执行。
在执行查询时首先检查缓存中是否有结果如果有则直接返回避免重复执行SQL。
每种实现都有其特定的使用场景和性能特点用户可以根据应用的需求选择合适的实现。
框架中的核心组件之一它负责执行SQL语句并处理结果。
通过不同的实现类MyBatis
提供了灵活的执行策略以满足不同应用场景的性能需求。
在实际应用中用户通常不需要直接创建或管理
StringTypeHandler、IntegerTypeHandler
BaseTypeHandler类TypeHandler的一个基础实现类提供了默认的类型转换逻辑
setNonNullParameter(PreparedStatement
从CallableStatement中获取值默认实现子类需要实现这个方法
getNullableResult(CallableStatement
IntegerTypeHandler类TypeHandler的一个具体实现用于处理Integer类型的转换
setNonNullParameter(PreparedStatement
从CallableStatement中获取非空Integer值
getNullableResult(CallableStatement
IntegerTypeHandler它可以直接使用。
如果没有现成的
语句的生成、参数设置、结果集处理等过程进行自定义处理。
以下是一个简化版的
invocation.getMethod().getName());
properties.getProperty(someProperty);
这是一个用于包装目标对象的方法通常会在插件初始化时被调用返回被包装后的对象这个对象会代理目标对象的行为并在必要时插入拦截逻辑。
这是插件的核心方法当目标对象的方法被调用时这个方法会被执行。
在这里你可以编写自定义的拦截逻辑。
interceptorcom.example.MyCustomPlugin
类的实现中通常会使用动态代理技术来包装目标对象。
当目标对象的方法被调用时动态代理会拦截调用并首先执行插件的拦截逻辑然后再调用原始方法。
CGLIB来创建目标对象的代理。
代理对象会实现目标对象的接口并在调用方法时执行拦截逻辑。
分为三层架构分别是基础支撑层、核心处理层和接口层如上两图所示。
的原生反射相关的元数据提升了反射代码执行的效率优化了反射操作的性能。
文件中的数据库操作。
通过这种方式可以将一些错误提前到编译期该功能就是通过
的数据源模块中也提供了与第三方数据源集成的相关接口这也为用户提供了更多的选择空间提升了数据源切换的灵活性。
数据库是实践生成中非常核心的存储数据库性能的优劣直接影响了上层业务系统的优劣。
很多线上业务都是读多写少的场景在数据库遇到瓶颈时缓存是最有效、最常用的手段之一如下图所示正确使用缓存可以将一部分数据库请求拦截在缓存这一层这就能够减少一部分数据库的压力提高系统性能。
就提供了一级缓存和二级缓存具体实现位于基础支撑层的缓存模块中。
持久层框架一般都会提供一套事务管理机制实现数据库的事务控制MyBatis
对数据库中的事务进行了一层简单的抽象提供了简单易用的事务接口和实现。
一般情况下Java
有三处可以添加配置信息的地方分别是mybatis-config.xml
初始化过程中会加载这些配置信息并将解析之后得到的配置对象保存到
语句会涉及非常多的组件比较核心的有Executor、StatementHandler、ParameterHandler
会调用事务管理模块实现事务的相关控制同时会通过缓存模块管理一级缓存和二级缓存。
SQL
很多成熟的开源框架都会以各种方式提供扩展能力。
当框架原生能力不能满足某些场景的时候就可以针对这些场景实现一些插件来满足需求这样的框架才能有足够的生命力。
这也是
MyBatis配置文件config.xml配置了全局配置文件配置了MyBatis的运行环境等信息。
mapper,xmlsql的映射文件配置了操作数据库的sql语句此文件需在config.xml中加载。
2SqlSessionFactory通过MyBatis环境等配置信息构造SqlSessionFactory会话工厂。
3SqlSession通过会话工厂创建SqlSession会话对数据库进行增删改查操作。
4Exector执行器MyBatis底层自定义了Exector执行器接口来具体操作数据库Exector接口有两个实现一个基本执行器默认一个是缓存执行器SqlSession底层是通过Exector接口操作数据库。
5MappedStatementMyBatis的一个底层封装对象它包装了MyBatis配置信息与sql映射信息等。
mapper.xml中的insert/select/update/delete标签对应一个MappedStatement对象。
标签的id就是MappedStatement的id。
MappedStatement对sql执行输入参数进行定义包括HashMap、基本类型、pojo、Executor通过MappedStatement在执行sql前将输入的Java对象映射至sql中输入参数映射就是JDBC编程对preparedStatement设置参数。
MappedStatement对sql执行输出结果进行定义包括HashMap、基本类型、pojoExecutor通过MappedStatement在执行sql后将输出结果映射至Java对象中输出结果映射就是JDBC编程对结果的解析处理过程。
Mapper代理开发方式使用的是JDK的动态代理针对有接口的类进行动态代理。
1.构建一个DefaultSqlSessionFactory主要作用就是维护Configuration和查询时获取DefaultSqlSession然后通过DefaultSqlSession执行查询操作。
2.实例化的过程中会解析mapper.xml中的各种标签封装成xxxsqlSource保存在Configuration的mappedstatelment的sqlSource属性中。
3.解析mapper.xml中的各种标签的过程中会对已经解析过的xml对应的mapper进行保存保存在Configuration的mapperRegistry的konwnMappers中key是接口全限定名value是接口对应的MapperProxyFactory类型保存是为了实例化mapper接口时能获取到mapper及对应的MapperProxyFactory作用是实例化时创建mapper接口的代理类MapperProxy
4.mybatis-plus这种不写xml的会解析baseMapper中的方法根据实体类信息等生成sql。
实例化SqlSessionTemplate
1.构建一个SqlSessionTemplate用来在实例化mapper接口时获取mapper以及在执行查询时获取sqlsession。
SqlSessionTemplate里维护DefaultSqlSessionFactory比如获取Configuration就会通过SqlSessionTemplate获取DefaultSqlSessionFactory然后在获取Configuration查询时获取和数据库关联的sqlsession也是通过SqlSessionTemplate维护的DefaultSqlSessionFactory的opensession方法获取到的类型是DefaultSqlSession。
实例化mapper
扫描mapper文件变成BeanDefinitionMapper和MapperScan变成BeanDefinition后会把BeanDefinition中的BeanClass属性设置为MapperFactoryBean类型以便在spring容器实例化对象时对mapper接口也进行实例化也就是生成对应的代理类MapperProxy用以执行mapper的增删改查方法。
实例化完这三个对象springboot就可以等待前端调用接口然后执行mapper方法进行增删改查了。
也就是前端调接口然后调service然后调mapper的方法时做的工作
当通过servcie调用mapper接口的方法时会调用代理对象MapperProxy的invoke
方法会调用MapperMethod的execute方法。
在这个方法中会调用SqlSessionTemplate的对应方法执行查询在调用之前会进行方法参数解析最终方法是ParamNameResolver类的getNamedParams得到一个mapkey是参数名value是参数值。
获取最终的sql
mapper.xml中的sql会在MybatisAutoConfiguration中构建SqlSessionFactory时得到解析如果有where
if之类的标签会被解析成DynamicSqlSource如果是普通的查询语句select
department_id#{depId}则会被解析成RawSqlSource这个属性会被存在configuration的mappedstatements属性中属性名称为sqlSource。
然后执行查询时会从sqlSource中拿到对应的原始sql然后再进行解析也就是把方法调用时的传参拼接到sql中以及拼接where
if这种动态标签最终得到完整的sql。
方法就是对应的SqlSource类的getBoundsql方法。
这里DynamicSqlSource类的getBoundsql方法也会调用RawSqlSource的getBoundSql方法。
解析返回值关键类DefaultResultSetHandler基本逻辑都是在这个类实现的。
关键类ResultSetWrapper保存要映射的字段集合和查询出的数值的字节数组DefaultResultSetHandler类的handleResultSets方法先拿到需要映射的字段集合封装在ResultSetWrapper中然后再获取一个resultmap类型的集合每个resultmap保存需要映射的类型如果有resultmap标签则会封装到resultmappings属性中。
DefaultResultSetHandler类的handleResultSet方法调用handleRowValues方法处理结果集放到multipleResults中。
DefaultResultSetHandler类的handleRowValues方法分别处理嵌套映射和非嵌套映射。
非嵌套映射handleRowValuesForSimpleResultMap方法遍历映射每行数据调用getRowValue方法。
没加resultmap或者resultmap中没做映射的字段调用applyAutomaticMappings方法resultmap中映射的字段调用applyPropertyMappings方法。
具体方法就是调用对应字段类型的typeHandler从字节数组中拿到数据进行转换。
所有对应字段值的字节数组在ResultSetWrapper的resultset属性中。
嵌套映射handleRowValuesForNestedResultMap方法遍历映射每行数据调用重载的getRowValue方法没加resultmap或者resultmap中没做映射的字段调用applyAutomaticMappings方法resultmap中映射的字段调用applyPropertyMappings方法嵌套映射的字段调用applyNestedResultMappings方法。
而applyNestedResultMappings会再次调用getRowValue方法解析每行数据逻辑和非嵌套映射相同。
作为专业的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