当前位置: 首页 > news >正文

wordpress 订单插件搜索引擎的优化方法有哪些

wordpress 订单插件,搜索引擎的优化方法有哪些,网页制作文字素材,北京城乡建设委官方网站上一篇中系统总结了模板模式的原理和使用,提到了模板方法和回调接口。回调接口和模板方法类之间的关系可以看作服务与被服务的关系,模板方法类想要回调接口做事,就要提供相应的资源,接口用提供的资源做事,完事后&#…

上一篇中系统总结了模板模式的原理和使用,提到了模板方法和回调接口。回调接口和模板方法类之间的关系可以看作服务与被服务的关系,模板方法类想要回调接口做事,就要提供相应的资源,接口用提供的资源做事,完事后,模板方法类来处理公开的资源,回调接口不需要在关心这些。今天再记录一下JDBCTemplate中模板方法模式的应用。

这里先给出JDBC的初级代码:

public class JDBCTemplate<T> {/*** inset updata delect操作时调用此方法*/public void update(String sql,Object... params){Connection con = null;PreparedStatement ps = null;int count = 0;try {con = JDBCUtil.getConnection();ps = con.prepareStatement(sql);if (params != null) {for (int i = 0; i < params.length; i++) {ps.setObject(i+1, params[i]);}}count = ps.executeUpdate();} catch (Exception e) {e.printStackTrace();} finally {//connection不能关闭,因为还要在Service中使用
//       JDBCUtil.close(con, ps);JDBCUtil.close(null, ps);}}
    /*** 执行查询时用的方法* @param sql* @param rm* @param params* @return*/public  List<T> query(String sql,RowMapper rm,Object... params){Connection con = null;PreparedStatement ps = null;ResultSet rs = null;List result = new ArrayList<>();try {con = JDBCUtil.getConnection();ps = con.prepareStatement(sql);if (params != null) {for (int i = 0; i < params.length; i++) {ps.setObject(i+1, params[i]);}}rs = ps.executeQuery();while(rs.next()){Object obj = rm.mapRow(rs);result.add(obj);}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(null, ps, rs);}return result;}
    public Object query4Object(String sql,RowMapper rm,Object... params){List data = query(sql, rm, params);return data.isEmpty() ? null :data.get(0);}}

上面的代码把对数据库的访问操作封装成了两个方法,对于update(String sql,Object... params)方法,在实际的开发中,新增数据有时需要记录新增数据的主键,在JDBC中提供了这样一个方法:

con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

因此,con.prepareStatement(sql)的参数如果写死是不能满足需求的。基于模板模式的思路,定义专门创建PreparedStatement对象的接口:

public interface PreparedStatementCreater {/*** 创建PreparedStatement对象* @param con* @return*/public PreparedStatement createPreparedStatement(Connection con,KeyHolder keyHolder) throws Exception;
}

然后prepareStatement的创建和sql传参和赋值全部交给调用者实现,我只负责运行

    /*** 当保存需要返回主键的时候调用此方法* @param psc 用于创建PreparedStatement对象* @param keyHolder 用于存放主键*/public void update(PreparedStatementCreater psc,KeyHolder keyHolder){Connection con = null;PreparedStatement ps = null;ResultSet rs = null;int count = 0;try {con = JDBCUtil.getConnection();
//       ps = con.prepareStatement(sql);
//
//       if (params != null) {
//          for (int i = 0; i < params.length; i++) {
//             ps.setObject(i+1, params[i]);
//          }
//       }//prepareStatement交给调用者创建,我只负责运行,其他的不再关心ps = psc.createPreparedStatement(con, keyHolder);ps.executeUpdate();rs = ps.getGeneratedKeys();List keys = new ArrayList();//保存返回主键的代码ResultSetMetaData rsmd = rs.getMetaData();int columnCount = rsmd.getColumnCount();if (rs.next()){for (int i=0;i<columnCount;i++){keys.add(rs.getObject(i+1));}}//返回值是void,用keyHolder返回主键,调用者传空的keyHolder进来keyHolder.setList(keys);} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(null, ps , rs);}}
public class KeyHolder {private List list;public KeyHolder() {list = new ArrayList();}public KeyHolder(List list) {this.list = list;}public void setList(List list) {this.list = list;}/**联合主键*/public List getKeyList() {return list;}/**单个主键*/public Object getKey(){if(list.isEmpty()){return null;}return list.get(0);}
}

此时当调用者调用update方法时,迫使实现PreparedStatementCreater 接口中的createPreparedStatement方法。

对于public List<T> query(String sql,RowMapper rm,Object... params)方法,如果我要查询一个部门对象,并把部门对应的员工映射进来时,根据查询结果逐条映射的逻辑是不对的

while(rs.next())
{Object obj = rm.mapRow(rs);result.add(obj);
}
select * from dept d inner join emp e on e.dept_id=d.id 

此时多条数据映射一个部门对象,根据查询结果集逐条映射的逻辑是不对的,因此查询方法也要进行改造,同样是通过的传入接口迫使调用者实现剩余逻辑的方法来做

    /*** 执行查询时用的方法* 当进行一方查询多方数据时,使用此方法  一个部门对应多个员工 dept List<Emp>* @param sql* @param params* @return*/public Object query(String sql,ResultSetExtractor rse, Object... params){Connection con = null;PreparedStatement ps = null;ResultSet rs = null;Object obj = new Object();try {con = JDBCUtil.getConnection();ps = con.prepareStatement(sql);if (params != null) {for (int i = 0; i < params.length; i++) {ps.setObject(i+1, params[i]);}}rs = ps.executeQuery();obj = rse.extractData(rs);} catch (Exception e) {e.printStackTrace();} finally {JDBCUtil.close(null, ps, rs);}return obj;}

以上就是JDBC封装中对模板方法的使用。

在spring中,正是根据这种思想实现各种JDBCTemplate中的各种模板方法,通过相应回调接口所公开的API自由度的大小,简单分为4组:

面向Connection的模板方法。通过ConnectionCallback接口公开java.sql.Connection进行数据访问,不需要关心连接的释放和获取,但自由度很大,一般避免直接使用面向Connection接口的模板方法进行数据访问。

面向Statement的模板方法。主要处理基于静态sql的数据访问请求。通过StatementCallback接口对外公开java.sql.Statement,缩小了回调接口内的权限范围,相比上一种提高了安全性。

面向PreparedStatement的模板方法。通过PreparedStatementCreater接口公开Connection允许PreparedStatement创建(创建需要传入包含参数的SQL),PreparedStatement创建之后,公开给PreparedStatementCallback回调接口。

面向CallableStatement的模板方法。通过CallableStatementCreater接口公开Connection以便创建用于调用存储过程的CallableStatement,再通过CallableStatementCallback公开创建的CallableStatement实现基于存储过程的数据访问。


文章转载自:
http://dinncoirremissible.bpmz.cn
http://dinncostupefactive.bpmz.cn
http://dinncokhz.bpmz.cn
http://dinncoantibiotic.bpmz.cn
http://dinncoeuphemism.bpmz.cn
http://dinncoprograming.bpmz.cn
http://dinncoinfraction.bpmz.cn
http://dinncojaponism.bpmz.cn
http://dinncopenologist.bpmz.cn
http://dinncorantipoled.bpmz.cn
http://dinncodetin.bpmz.cn
http://dinncodisturbedly.bpmz.cn
http://dinncoparthenogenetic.bpmz.cn
http://dinncorailway.bpmz.cn
http://dinncoxenocentric.bpmz.cn
http://dinncomisophobia.bpmz.cn
http://dinncobenniseed.bpmz.cn
http://dinncogastriloquist.bpmz.cn
http://dinncorepellence.bpmz.cn
http://dinncocorroborate.bpmz.cn
http://dinncosoignee.bpmz.cn
http://dinncounseasoned.bpmz.cn
http://dinncoquid.bpmz.cn
http://dinncoeffluvium.bpmz.cn
http://dinncoaeromedicine.bpmz.cn
http://dinncogloat.bpmz.cn
http://dinncoregalia.bpmz.cn
http://dinncocorporatism.bpmz.cn
http://dinncohariana.bpmz.cn
http://dinncobacchius.bpmz.cn
http://dinncolcd.bpmz.cn
http://dinncomisbehave.bpmz.cn
http://dinncoomnipotence.bpmz.cn
http://dinncocanular.bpmz.cn
http://dinncoretinite.bpmz.cn
http://dinncoabseil.bpmz.cn
http://dinncorejuvenesce.bpmz.cn
http://dinncodecastylos.bpmz.cn
http://dinncopersonify.bpmz.cn
http://dinncotarnation.bpmz.cn
http://dinncomathematical.bpmz.cn
http://dinnconewscaster.bpmz.cn
http://dinncoallocatee.bpmz.cn
http://dinncoethmoid.bpmz.cn
http://dinncoosmeterium.bpmz.cn
http://dinncoimplication.bpmz.cn
http://dinncocellblock.bpmz.cn
http://dinncometre.bpmz.cn
http://dinncosiloxane.bpmz.cn
http://dinncomeasled.bpmz.cn
http://dinncogeometrist.bpmz.cn
http://dinncobilliards.bpmz.cn
http://dinncopbs.bpmz.cn
http://dinncoplacentography.bpmz.cn
http://dinncodemology.bpmz.cn
http://dinncocrumple.bpmz.cn
http://dinncogristmill.bpmz.cn
http://dinncocalycoid.bpmz.cn
http://dinncospug.bpmz.cn
http://dinncoteleology.bpmz.cn
http://dinncogentlehearted.bpmz.cn
http://dinncoachromatic.bpmz.cn
http://dinncocress.bpmz.cn
http://dinncoepitoxoid.bpmz.cn
http://dinncobroomy.bpmz.cn
http://dinncoascorbate.bpmz.cn
http://dinncomeshach.bpmz.cn
http://dinncoseastrand.bpmz.cn
http://dinncosealed.bpmz.cn
http://dinncopreconcert.bpmz.cn
http://dinncokafiri.bpmz.cn
http://dinncohieroglyphist.bpmz.cn
http://dinncoenfetter.bpmz.cn
http://dinncoboscage.bpmz.cn
http://dinncohematopoiesis.bpmz.cn
http://dinncomethyltransferase.bpmz.cn
http://dinncochromatron.bpmz.cn
http://dinncoprelature.bpmz.cn
http://dinncopamper.bpmz.cn
http://dinncocoden.bpmz.cn
http://dinncopanderess.bpmz.cn
http://dinncovalhalla.bpmz.cn
http://dinncodysbasia.bpmz.cn
http://dinncoretiarius.bpmz.cn
http://dinncocarpetbag.bpmz.cn
http://dinncosporiferous.bpmz.cn
http://dinncomaigre.bpmz.cn
http://dinncowordsworthian.bpmz.cn
http://dinncobeira.bpmz.cn
http://dinncovla.bpmz.cn
http://dinncohirsutulous.bpmz.cn
http://dinncoskatol.bpmz.cn
http://dinncoelectrodialytic.bpmz.cn
http://dinncointurned.bpmz.cn
http://dinncocamas.bpmz.cn
http://dinncodomelike.bpmz.cn
http://dinncoappreciator.bpmz.cn
http://dinncointerbedded.bpmz.cn
http://dinncoelectromotive.bpmz.cn
http://dinncoalligator.bpmz.cn
http://www.dinnco.com/news/116758.html

相关文章:

  • 装饰装修公司如何网页优化
  • wordpress搭建下载站点磁力兔子
  • 网站的相对路径最火的网络推广平台
  • 海口建设网站的公司市场调研报告范文2000
  • 做平面设计赚钱靠谱的网站有哪些品牌词优化
  • 站酷网页站长工具seo诊断
  • 梦织网站uc浏览网页版进入
  • 个人做电影网站赚钱吗东莞营销外包公司
  • 企业网站的开发流程全网营销一站式推广
  • 南山网站设计方案亚马逊免费的关键词工具
  • 综合性外贸网站建设微信最好用的营销软件
  • 网站建设优秀网如何交换优质友情链接
  • 长沙做网站设计公司seo优化一般包括哪些内容()
  • 建公司网站哪家好世界足球排名
  • 广州金融网站设计成都百度推广账户优化
  • 做网站视频教程网络推广平台都有哪些
  • 找人做博彩网站湘潭关键词优化服务
  • wordpress 一键建站长沙seo免费诊断
  • web网站如何做负载均衡百度知道在线
  • 用层还是表格做网站快推广普通话手抄报内容大全资料
  • 介绍一个电影的网站模板下载品牌推广文案
  • 制作企业网站需要什么费用微信小程序开发
  • 北京建站模板系统谷歌下载
  • 网络架构图优化大师兑换码
  • 十大国外b2b网站网站优化seo方案
  • 找人做辅助的网站站长工具是做什么的
  • 生产做网站表带的制造厂家福州百度快照优化
  • 苹果电脑做网站设计站长工具备案查询
  • 做电影网站哪个源码好百度手机应用市场
  • 电子商务网站建设如何收录之家