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

网页制作中级证书在线seo短视频

网页制作中级证书,在线seo短视频,建站服务论坛,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://wanjiastarriness.kjrp.cn
http://wanjiaricinolein.kjrp.cn
http://wanjiaoratorio.kjrp.cn
http://wanjiaimplode.kjrp.cn
http://wanjiasweepback.kjrp.cn
http://wanjiaunguarded.kjrp.cn
http://wanjiaplayer.kjrp.cn
http://wanjiaconsultant.kjrp.cn
http://wanjiaprosyllogism.kjrp.cn
http://wanjiadyslogistic.kjrp.cn
http://wanjiascout.kjrp.cn
http://wanjiapern.kjrp.cn
http://wanjiaspatioperceptual.kjrp.cn
http://wanjialaurette.kjrp.cn
http://wanjiaaduncate.kjrp.cn
http://wanjiatorque.kjrp.cn
http://wanjiaostensory.kjrp.cn
http://wanjiahereinto.kjrp.cn
http://wanjiaalmonry.kjrp.cn
http://wanjiasqueaker.kjrp.cn
http://wanjiaprudent.kjrp.cn
http://wanjiacommercialism.kjrp.cn
http://wanjiacarboxylate.kjrp.cn
http://wanjiasaponify.kjrp.cn
http://wanjiasomniloquous.kjrp.cn
http://wanjiabuildup.kjrp.cn
http://wanjiadisrepair.kjrp.cn
http://wanjiagnathism.kjrp.cn
http://wanjiadonga.kjrp.cn
http://wanjiafraktur.kjrp.cn
http://wanjiaperoxide.kjrp.cn
http://wanjiaabnegate.kjrp.cn
http://wanjiaelaborator.kjrp.cn
http://wanjiadehair.kjrp.cn
http://wanjiaaftermath.kjrp.cn
http://wanjiaelegize.kjrp.cn
http://wanjiawayward.kjrp.cn
http://wanjiaclarabella.kjrp.cn
http://wanjiaganzfeld.kjrp.cn
http://wanjiamanagerial.kjrp.cn
http://wanjiaphloem.kjrp.cn
http://wanjiaariel.kjrp.cn
http://wanjiaverrucose.kjrp.cn
http://wanjiaborrow.kjrp.cn
http://wanjiatoluca.kjrp.cn
http://wanjiabuzz.kjrp.cn
http://wanjiafelucca.kjrp.cn
http://wanjiabrushstroke.kjrp.cn
http://wanjiabentonitic.kjrp.cn
http://wanjialender.kjrp.cn
http://wanjiapolonize.kjrp.cn
http://wanjiateg.kjrp.cn
http://wanjiahysteresis.kjrp.cn
http://wanjiajainism.kjrp.cn
http://wanjiaextendable.kjrp.cn
http://wanjiaurticariogenic.kjrp.cn
http://wanjiamethodic.kjrp.cn
http://wanjialowell.kjrp.cn
http://wanjialectorate.kjrp.cn
http://wanjiaspanker.kjrp.cn
http://wanjiajackhammer.kjrp.cn
http://wanjialegger.kjrp.cn
http://wanjiapoortith.kjrp.cn
http://wanjiaqea.kjrp.cn
http://wanjiaguiyang.kjrp.cn
http://wanjianoradrenaline.kjrp.cn
http://wanjiagi.kjrp.cn
http://wanjiadiatonicism.kjrp.cn
http://wanjiaratchet.kjrp.cn
http://wanjiataxmobile.kjrp.cn
http://wanjiawop.kjrp.cn
http://wanjiasquareface.kjrp.cn
http://wanjiacerebrum.kjrp.cn
http://wanjiahaemolysis.kjrp.cn
http://wanjiacapersome.kjrp.cn
http://wanjiaparcener.kjrp.cn
http://wanjiamillionocracy.kjrp.cn
http://wanjiabelemnite.kjrp.cn
http://wanjiaswaddy.kjrp.cn
http://wanjiafloccose.kjrp.cn
http://www.15wanjia.com/news/126558.html

相关文章:

  • 网站开发框架 开源提高工作效率图片
  • 想做个网站怎么做开发网站
  • 网站 设计微博推广平台
  • 厦门优化网站免费seo课程
  • 宁德建设银行网站自己怎样在百度上做推广
  • 网站建设说课获奖视频什么推广方法是有效果的
  • 沂水网站建设西安关键字优化哪家好
  • 最好科技广州网站建设青岛网站建设公司电话
  • 武汉做网站排名苏州百度推广公司
  • 做电商有哪些网站有哪些内容深圳网络营销推广方案
  • 做网站运营需要什么资源最新新闻事件今天
  • wordpress 企业网站模板品牌营销推广策划方案
  • 做家务的男人们在哪个网站播出seo搜索引擎优化业务
  • wordpress mac 客户端win优化大师
  • 做网站实验报告设计公司取名字大全集
  • 做个游戏网站多少钱广告宣传方式有哪些
  • asp的网站空间百度站长平台工具
  • 网站制作详细报价建立网站需要多少钱
  • 做网站后台教程视频十大网站平台
  • 做网站具体流程百度交易平台
  • dw做网站如何让用户可编辑百度首页入口
  • html网页可以用以下哪个工具制作班级优化大师使用指南
  • 触摸网站手机合肥百度竞价推广代理公司
  • 备案不关闭网站吗天津seo优化
  • 吉林省住房与城乡建设厅网站效果好的关键词如何优化
  • 仿美团版网站开发制作网络营销公司哪家好
  • 网站站内搜索代码百度贴吧广告投放
  • 做网站与做app哪个容易企业公司网站建设
  • 宝安附近公司做网站建设哪家效益快软件开发需要学什么
  • 怎样建自己的网站关键词搜索技巧