php做的网站好不好网站建设模板下载免费

pingmian/2026/1/27 0:09:25/文章来源:
php做的网站好不好,网站建设模板下载免费,cpa推广联盟,做个英文网站多少钱*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更新 *************************************优雅的分割线 ********************************** 前言 难得复工了公司百业待兴有一大堆接口需要对接忙的不行。回过神来发现自己快一个月没写博客了赶紧抽时间写一写不能断更。 截止上一篇博客我们已经把结果集映射的内容介绍完毕接下来就是对Mybatis中的核心接口进行介绍通过介绍这些核心接口使读者们更深刻地理解Mybatis的运行机制以及原理。 StatementHandler StatementHandler接口是Mybatis的核心接口之一它完成了Mybatis中最核心的工作也是Executor接口实现的基础。 StatementHandler接口中功能有很多如创建Statement对象、执行SQL语句、批量执行SQL语句等。StatementHandler接口定义如下。 /** Mybatis核心接口之一完成了Mybatis中最核心的工作也是Executor接口实现的基础。 author Clinton Begin */ public interface StatementHandler { /** 从数据库连接中获取一个Statementparam connectionparam transactionTimeoutreturnthrows SQLException */ Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException; /** 绑定statement执行时所需的实参param statementthrows SQLException */ void parameterize(Statement statement) throws SQLException; /** 批量执行sql语句param statementthrows SQLException */ void batch(Statement statement) throws SQLException; /** 执行 update/insert/delete语句param statementreturnthrows SQLException */ int update(Statement statement) throws SQLException; /** 执行select语句param statementparam resultHandlerparam returnthrows SQLException */ List query(Statement statement, ResultHandler resultHandler) throws SQLException; /** 查询游标param statementparam returnthrows SQLException */ Cursor queryCursor(Statement statement) throws SQLException; /** 获取BoundSqlreturn */ BoundSql getBoundSql(); /** 获取ParameterHandlerreturn */ ParameterHandler getParameterHandler(); } 该接口的继承关系如下。其中CallableStatementHandler用于调用存储过程而mysql的存储过程在大多数公司都很少使用甚至禁止使用这里就不对其进行介绍了有兴趣的朋友可以自己参考源码阅读 RoutingStatementHandler RoutingStatementHandler使用策略模式根据MappedStatement中指定的statementType字段创建对应的StatementHandler接口实现。由于其这种思路还有人认为这是个路由。RoutingStatementHandler核心代码如下。 public class RoutingStatementHandler implements StatementHandler { /*** 底层封装的真正的StatementHandler对象* 这里的delegate在写框架的过程中使用较多*/ private final StatementHandler delegate;public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {// RoutingStatementHandler的主要功能是根据MappedStatement的配置生成对应的StatementHandler对象switch (ms.getStatementType()) {case STATEMENT:delegate new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);break;case PREPARED:delegate new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);break;case CALLABLE:delegate new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);break;default:throw new ExecutorException(Unknown statement type: ms.getStatementType());}}} BaseStatementHandler BaseStatementHandler是一个抽象类实现了StatementHandler接口。它只提供了一些参数绑定相关的方法对数据库不进行任何操作。该类的字段如下。 protected final Configuration configuration; protected final ObjectFactory objectFactory; protected final TypeHandlerRegistry typeHandlerRegistry;/*** 记录结果集映射对象*/ protected final ResultSetHandler resultSetHandler;/*** 记录使用的参数处理器对象。ParameterHandler的主要功能是为SQL绑定实参* 也就是使用传入的实参替换SQL语句中的 ? 占位符*/ protected final ParameterHandler parameterHandler;protected final Executor executor;/*** 记录SQL语句对应的MappedStatement*/ protected final MappedStatement mappedStatement;/*** 记录用户设置的offset和limit用于在结果集中定位映射的起始位置和结束位置*/ protected final RowBounds rowBounds;protected BoundSql boundSql;在BaseStatementHandler的构造方法中除对上面的字段进行初始化之外还会调用KeyGenerator.processBefore()方法初始化SQL的主键具体实现如下。 protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {this.configuration mappedStatement.getConfiguration();this.executor executor;this.mappedStatement mappedStatement;this.rowBounds rowBounds;this.typeHandlerRegistry configuration.getTypeHandlerRegistry();this.objectFactory configuration.getObjectFactory();if (boundSql null) {// 调用KeyGenerator.processBefore 方法获取主键generateKeys(parameterObject);boundSql mappedStatement.getBoundSql(parameterObject);}this.boundSql boundSql;this.parameterHandler configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);this.resultSetHandler configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql); }protected void generateKeys(Object parameter) {KeyGenerator keyGenerator mappedStatement.getKeyGenerator();ErrorContext.instance().store();keyGenerator.processBefore(executor, mappedStatement, null, parameter);ErrorContext.instance().recall(); }BaseStatementHandler实现了StatementHandler的prepare方法该方法用来初始化Statement对象然后为其分配超时时间等属性。其中初始化StatementHandler的方法是个抽象方法instantiateStatement是一个抽象方法需要由子类去实现代码如下。 Override public Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException {ErrorContext.instance().sql(boundSql.getSql());Statement statement null;try {// 初始化statement对象交给子类去实现statement instantiateStatement(connection);// 设置超时时间setStatementTimeout(statement, transactionTimeout);setFetchSize(statement);return statement;} catch (SQLException e) {closeStatement(statement);throw e;} catch (Exception e) {closeStatement(statement);throw new ExecutorException(Error preparing statement. Cause: e, e);} }BaseStatementHandler依赖两个重要的组件分别是ParameterHandler和ResultSetHandler。后者在前面的文章中已经介绍不在重复。 ParameterHandler 通过前面介绍动态SQL可知在BoundSql中记录的SQL语句可能包含?占位符每个?占位符都对应了BoundSql.parameterMapings集合中的一个元素。在ParameterHandler中只定义了一个setParameter方法该方法用于为SQL语句绑定实参。ParameterHandler接口只有唯一一个实现类 DefaultParameterHandler核心字段如下。 /*** 管理Mybatis中的全部TypeHandler对象*/ private final TypeHandlerRegistry typeHandlerRegistry;/*** SQL节点*/ private final MappedStatement mappedStatement;/*** 用户传入的实参对象*/ private final Object parameterObject; private final BoundSql boundSql; private final Configuration configuration;DefaultParameterHandler的setParameters方法中会遍历parameterMappings集合中记录的ParameterMapping对象并根据其中记录的参数名称找到对应的实参再与SQL绑定。setParameters方法如下。 /*** 设置参数* param ps*/ Override public void setParameters(PreparedStatement ps) {ErrorContext.instance().activity(setting parameters).object(mappedStatement.getParameterMap().getId());// 取出参数映射列表ListParameterMapping parameterMappings boundSql.getParameterMappings();if (parameterMappings ! null) {// 遍历参数for (int i 0; i parameterMappings.size(); i) {ParameterMapping parameterMapping parameterMappings.get(i);// OUT是存储过程中的输出参数这里需要过滤掉这些参数if (parameterMapping.getMode() ! ParameterMode.OUT) {Object value;// 获取参数名称String propertyName parameterMapping.getProperty();// 获取对应的实参值if (boundSql.hasAdditionalParameter(propertyName)) {value boundSql.getAdditionalParameter(propertyName);} else if (parameterObject null) {value null;} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {// 实参可以直接通过TypeHandler转换成jdbcTypevalue parameterObject;} else {MetaObject metaObject configuration.newMetaObject(parameterObject);value metaObject.getValue(propertyName);}// 获取parameterMapping中设置的TypeHandler对象TypeHandler typeHandler parameterMapping.getTypeHandler();JdbcType jdbcType parameterMapping.getJdbcType();if (value null jdbcType null) {jdbcType configuration.getJdbcTypeForNull();}try {// 为语句绑定实参typeHandler.setParameter(ps, i 1, value, jdbcType);} catch (TypeException | SQLException e) {throw new TypeException(Could not set parameters for mapping: parameterMapping . Cause: e, e);}}}} }对SQL语句绑定完实参后就可以调用Statement对象的execute方法执行SQL了。 SimpleStatementHandler SimpleStatementHandler是BaseStatementHandler的子类底层使用了Statement对象完成数据库的相关操作所以SQL语句中不能存在占位符因此parameterize方法是空实现。 SimpleStatementHandler的instantiateStatement方法直接通过JDBC Connection创建Statement代码如下。 /*** 创建statement对象* param connection* return* throws SQLException*/ Override protected Statement instantiateStatement(Connection connection) throws SQLException {if (mappedStatement.getResultSetType() ResultSetType.DEFAULT) {return connection.createStatement();} else {return connection.createStatement(mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY);} }query方法完成了数据库查询的操作并通过ResultSetHandler将结果集映射成结果对象代码如下。 Override public E ListE query(Statement statement, ResultHandler resultHandler) throws SQLException {String sql boundSql.getSql();statement.execute(sql);return resultSetHandler.handleResultSets(statement); }update方法负责执行insert、update、delete的SQL语句并根据配置的KeyGenerator获取数据库生成的主键具体实现如下。 /*** 负责执行insert、update、delete语句* param statement* return* throws SQLException*/ Override public int update(Statement statement) throws SQLException {String sql boundSql.getSql();Object parameterObject boundSql.getParameterObject();KeyGenerator keyGenerator mappedStatement.getKeyGenerator();int rows;if (keyGenerator instanceof Jdbc3KeyGenerator) {statement.execute(sql, Statement.RETURN_GENERATED_KEYS);rows statement.getUpdateCount();keyGenerator.processAfter(executor, mappedStatement, statement, parameterObject);} else if (keyGenerator instanceof SelectKeyGenerator) {statement.execute(sql);rows statement.getUpdateCount();keyGenerator.processAfter(executor, mappedStatement, statement, parameterObject);} else {statement.execute(sql);rows statement.getUpdateCount();}return rows; }PreparedStatementHandler 该类底层依赖于PrepareStatement对象完成数据库的操作instantiateStatement方法直接调用Connection的prepareStatement方法创建PrepareStatement对象代码如下。 /*** 直接调用Connection的prepareStatement方法创建PrepareStatement对象* param connection* return* throws SQLException*/ Override protected Statement instantiateStatement(Connection connection) throws SQLException {// 获取待执行的sqlString sql boundSql.getSql();// 根据keyGenerator的值创建PrepareStatement对象if (mappedStatement.getKeyGenerator() instanceof Jdbc3KeyGenerator) {String[] keyColumnNames mappedStatement.getKeyColumns();if (keyColumnNames null) {// 返回数据库生成的主键return connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);} else {// 在insert语句执行完成之后将keyColumnNames指定的列返回return connection.prepareStatement(sql, keyColumnNames);}} else if (mappedStatement.getResultSetType() ResultSetType.DEFAULT) {// 设置结果集是否可以滚动以及游标是否可以上下移动设置结果集是否可更新return connection.prepareStatement(sql);} else {// 创建普通的PrepareStatement对象return connection.prepareStatement(sql, mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY);} }PrepareStatement的其他方法的实现与SimpleStatementHandler对应的方法实现类型这里就不赘述了。 *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更新 *************************************优雅的分割线 **********************************

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二手商品网站怎么做模型网站大全免费

专属领域论文订阅 VX 扫吗关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能,机器人强化学习开放词汇,检测分割 [晓理紫…

中山营销网站建设费用湘潭县建设投资有限公司网站

文章目录 什么是数据库数据库是运行在操作系统中的软件 为什么需要数据库有哪些数据库MySQL 的体系架构网络连接层/API 层数据库服务层存储引擎层系统文件层 什么是 SQL参考资料 阅读前导:理论上数据库可以在操作系统和网络之前学习,但是这样会让学习层次…

提升网站建设品质信息凡科 wordpress

最近,抖音上的AI扩图突然火了,看完真的让人笑掉大牙~~~ 这一热议的话题#AI扩图#在短视频平台抖音上的播放量已经突破7.8亿次,而相关的讨论也如同星火燎原,迅速点燃了公众的好奇心。从“用AI扩图…

我学我做我知道网站展馆设计的主题有哪些

1.基本的读取配置文件-read(filename) 直接读取ini文件内容-sections() 得到所有的section,并以列表的形式返回-options(section) 得到该section的所有option-items(section) 得到该section的所有键值对-get(section,option) 得到section中option的值,返…

大连旧房翻新装修哪家公司好班级优化大师免费下载app

注:比较简陋,仅供参考。 编写PHP代码,实现反序列化的时候魔法函数自动调用计算器 PHP反序列化 serialize(); 将对象序列化成字符串 unserialize(); 将字符串反序列化回对象 创建类 class Stu{ public $name; public $age; public $sex; publi…

高校档案馆网站建设肥料网站建设

写在开始三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击,现在可以致敬伟大的.NET斗士甲骨文了  (JDK8以上都需要收费,Android弃用java作为第一语言,别高兴:OpenJDK是甲骨文的).《ASP.NET Core 高性能系列》是一套如何编…

像素时代网站建设手机站设计通州青岛网站建设

目录 自动映射 表映射 字段映射 字段失效 视图属性 Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现。既然…

校园网站制作模板网页设计图片排版代码

【Blazor】| 总结/Edison Zhou大家好,我是Edison。许久没有更新Blazor学习系列了,今天续更。Blazor 的路由系统就和 ASP.NET MVC的路由系统一样,可以为我们提供灵活的选项,可用于确保用户请求到达可处理它们并返回用户想要的信息的…

山东省工程建设交易信息网站重庆妇科医院排名前三

如果想要从Excel导入数据,那么就要用到xlsread函数。 具体如下: filename‘E:\数据\test.xlsx’; sheet3; xlRange‘C:E’; subsetAxlsread(filename,sheet,xlRange);%这样导入没有标题名字 其中sheet3;这里的3代表的是sheet从左到由的顺序&#xff0c…

重庆电商网站如何推广微信小程序

高斯日记(选自2013 CA组) 大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道&#xf…

国外社交网站建设集团网站建设需求

代理可以控制和管理访问。 RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。RMI的好处在于你不必亲自写任何网络或I/O代码。客户程序调用远程方法就和运行在客户自己本地JVM对对象进行正常方法调用一样。 步骤一:制作远程…

网站首页模块如何做链接网站后台管理系统有哪些

同学们大家好,我是小伊同学,上一节课我们讲解了全局数据的读写方法,那么在页面间同样需要数据交互,今天我们就来学习这部分内容。在微信小程序中,我们常常需要将数据在页面之间进行传递,比如用户的身份信息…

行业网站有建设价值吗郑州哪家公司给国外做网站

xcorr函数的用法和程序举例 xcorr函数返回两个离散时间序列的互相关。互相关测量向量 x 和移位(滞后)副本向量y 的之间的相似性,形式为滞后的函数。如果 x 和 y 的长度不同,函数会在较短向量的末尾添加零,使其长度与另…

公司国际网站怎么做荥阳郑州网站建设

1. QT 的 selection 模型是用来做什么的? Qt的selection模型用于管理TableView中的选择操作。它允许用户选择和操作特定的数据。 2. Selection 模型用途的例子? 当使用Qt的TableView时,可以使用selection模型来实现以下用途: …

小程序制作侧拉切换适合seo优化的站点

[html] 切页面时,每次都动手刷新看效果很麻烦,如果要让你写一个实时刷新预览的工具你该怎么写? node包http, scoket.io建立服务静态页面增加webSocket,服务器推送后执行刷新页面fs包,fs.watch 监听静态页面&#xff0c…

广州网站建设骏域试论述外贸网站建设应注意的问题

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关unordered系列关联式容器的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:…

企业网站做的好的有什么公司网站开发专业就业前景

常量:在程序执行过程中,其值不发生改变的量;1、分类: 字面值常量和自定义常量;1、字面值常量有以下几种:字符串常量、小数常量、整数常量、字符常量、布尔常量(true、false)、空常量(null);2、整数常量…

asp做网站好不好最流行网站开发工具

本文着重在于讲解用 “堆实现优先级队列” 以及优先级队列的应用,在本文所举的例子中,可能使用优先级队列来解并不是最优解法,但是正如我所说的:本文着重在于讲解“堆实现优先级队列” 堆实现优先级队列 堆的主要应用有两个&…

成都专业制作网站公司做瞹瞹小视频网站

随着Web3时代的到来,去中心化技术的崛起不仅令人瞩目,也为创业者带来了前所未有的机遇。在这个新的时代,一批去中心化初创公司正崭露头角,重新定义着商业和创新的边界。本文将深入探讨Web3创业的趋势,以及去中心化初创…

海淀视频网站建设seo需要培训才能找到工作吗

考虑到设备部署到现场后有可能需要进行软件升级,之前做过PIC系列单片机的升级,现在想做个国民技术N32G031系列Cortex-M0内核的单片机IAP方案。 因为国民技术系列单片机在很多大程度上都模仿了STM32,所以我想其升级方案极有可能差不多。于是在…