由SpringJdbc引发的一点思考

本来项目中使用的是Hibernate,后来换Mybatis,但由于项目中很多sql语句是动态的,无实体,参数不固定,列也不固定,Mybatis显得太重量了,所以我又选择用spring jdbc这种更轻量的封转替换掉原来的jdbc,更换dao层真心让我想吐了。

其实,无论Spring jdbc,Hibernate,还是mybatis都是对jdbc的封装,封装不变的部分,留下可变的部分让我们自己写。

使用 Spring jdbc,其实最主要的是使用它的三个模板,Spring的JdbcTemplate、NamedParameterJdbcTemplate和SimpleJdbcTemplate。我们从Spring 的JdbcTemplate开始说,这是其他模板的基础,NamedParameterJdbcTemplate和SimpleJdbcTemplate 都是在 JdbcTemplate的基础之上封装的。

1、JdbcTemplate

执行过程:定义SQL,其次调用JdbcTemplate方法执行SQL,并传递参数,最后通过RowCallbackHandler回调处理ResultSet结果集。另外,JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连 接做任何事情、StatementCallback通过回调接口返回给用户一个Statement,从而可以使用该Statement做任何事情。当然还有其他接口,不再赘述。

2、NamedParameterJdbcTemplate

NamedParameterJdbcTemplate类是基于JdbcTemplate类,并对它进行了封装从而支持命名参数特性。

什么是命名参数特性?

PreparedStatement p = con.prepareStatement("select * from people where (first_name = ? or last_name = ?) and address = ?");

p.setString(1, name);

p.setString(2, name);

p.setString(3, address);

这种问好的形式,参数是匿名并被通过索引设置,灵活性太差,而且参数多的时候,非常容易出错,可读性非常差。

String query = "select * from people where (first_name = :name or last_name = :name) and address = :address");

NamedParameterStatement p = new NamedParameterStatement(con, query);

p.setString("name", name);

p.setString("address", address);

以上这种形式,就成为命名参数形式,从代码灵活性,可读性和性能上和前者差不多。

NamedParameterJdbcTemplate 就是这种命名参数的一种实现。

3、SimpleJdbcTemplate

SimpleJdbcTemplate类也是基于JdbcTemplate类,但利用Java5+的可变参数列表和自动装箱和拆箱从而获取更简洁的代码。

SimpleJdbcTemplate主要提供两类方法:query及queryForXXX方法、update及batchUpdate方法。SimpleJdbcTemplate类还支持命名参数特性,如 queryForList(String sql, SqlParameterSource args)和queryForList(String sql, Map<String, ?> args) ,类似于NamedParameterJdbcTemplate中使用,在此就不介绍了。

SimpleJdbcTemplate,从名字上看,它是进一步简化jdbc操作,把我们常用的方式封装起来。

但从Spring 3.1开始,JdbcTemplate和NamedParameterJdbcTemplate提供了SimpleJdbcTemplate的功能,SimpleJdbcDaoSupport被标记为

源码中,有说明:

@deprecated since Spring 3.1 in favor of {@link org.springframework.jdbc.core.JdbcTemplate} and

{@link org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate}. The JdbcTemplate and  NamedParameterJdbcTemplate now provide all the functionality of the SimpleJdbcTemplate.

总结:

之所以会写这篇文章,是因为在dao层的选型上走了不少弯路,因为项目中没有实体类,我放弃了Hibernate,选用mybatis,后来因为mybatis的mapper文件,我又弃之,选择spring jdbctemplate,一度因为其不支持命名参数,我自己实现了一个 NamedParameterStatement ,后来发现,springjdbc中的NamedParameterJdbcTemplate已经实现了这个功能,而且比我实现的要好不少,果断放弃我自己写的,改用这个,走了不少弯路,发现自己全局观还是有些问题的,做事情前的思考不够充分,总是想赶紧做出东西来,一头扎进去,做不动了才开始思考,导致多次返工,血与泪的教训啊。

时间: 2024-10-07 05:55:30

由SpringJdbc引发的一点思考的相关文章

一个回车符引发的问题思考

在维护和开发通信类软件产品的过程中,经常需要处理一些软件故障问题.在问题刚出现的时候,大家可能显得手足无措,有一种天都要塌下来的感觉.但在问题原因找到之后,大家又会觉得问题原因非常的简单,要是当初开发的时候仔细一点,是不会犯这样的低级错误的.最近,本人就遇到了一个回车符引发的问题. 近日,在开发某软件版本时需要对文件进行操作,在代码中使用了Linux C语言中的opendir函数,但是该函数始终返回NULL,提示文件路径不存在. 本人查了一下该函数的具体情况.opendir函数的原型为: DIR

关于模板方法和策略模式的一点思考

该随笔的思想原点,应该算是在两三年前了.当时和一前同事聊天.不知怎得就聊到了Http访问. 一.我记得他和我说过的第一句话,大概是:有没有已经封装好的.比较强大的HttpUtil.也可能是受业务的影响(接口对内).我当时接触到的Http访问,大多比较“规范”,至少有一个接口约束在约定着某些东西,不至于一会传递json,返回json, 一会又要传递xml,返回xml,甚至更奇葩的是,上传个文件.返回0或者1.如果真出现这样的状态,HttpUtil依然能够方便.灵活的适应着各种情况.我想这个Util

display:inline-block引发的间隙思考

一.导火线 没错,总有一类属性在助你轻松寻得捷径的同时,也可为你增添烦劳,比如本文的主谋display:inline-block.众前端们所诸知,其作用是将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格.然而不幸的是,它并没有得到所有浏览器的支持,比如ie6.7和古老一点的firefox完全无视它,由于firefox的老版本几乎已经从市场中消失,所以名义上firefox是支持display:inline-block的,除此之外,伟大的chrome.O

关于后台系统自动生成的一点思考

大量实践发现后台管理程序,其实90%的代码都是相同的,当然是在抛弃复杂逻辑业务的情况下,那么如何能高效的节约这些时间呢,那就是接下来我要说的,对于后台系统自动生成的一些思考. 适用情景: 1.表编号id为自增(基于现在大部分表编号都是自增的情况): 2.没有太复杂业务关联关系,比如表的某一个字段,存储了一个json对象,为了平衡后台用户使用,需要友好的分段展示给用户的定制ui界面:还比如表中存储了外键的多个id,但为了方便用户使用,只能已标签name的方式,给用户展示,等等这些超强业务黏合逻辑的

关于前端的一点思考

关于前端的一点思考 Author:tkorays 最近写前端代码,写着写着就突然开始惆怅.忧伤.愤怒.发狂,我TMD到底在干什么啊! 很多东西写了n遍了,但是还是在不停地写着.自己写过的代码也不想再修改完善.重新利用,只是觉得,可能重新写一遍可能要好点.面对这很多库以及框架,虽然喜爱,但是也是有所顾忌,我只要使用其中的一个功能,根本不需要引入这么大的整个库. 事实上,我们可能在动手写任何代码之前,先要思考下,我们到底要的是什么! 0x00 界面真的需要这么炫酷么 在使用某个界面库之前,我们可能先

关于Emit中动态类型TypeBuilder创建类标记的一点思考

  利用TypeBuilder是可以动态创建一个类型,现在有个需求,动态生成一个dll,创建类型EmployeeEx,需要继承原dll里面的Employee类,并包含Employee类上的所有类标记.   网上有很多例子, //创建TypeBuilder. TypeBuilder myTypeBuilder = myModBuilder.DefineType(typeName, TypeAttributes.Public); myTypeBuilder.SetParent(type);   大概

关于失败的一点思考

睡觉之前突然想到马云说过的一句话:我们要习惯于拒绝,习惯失败,如果我们还没成功,那是因为我们的失败还不够 --------2016.4,11  以此自勉 关于失败的一点思考

有关盒模型的一点思考

有关盒模型的一点思考 盒子模型是css中一个重要的概念,理解了盒子模型才能更好的排版. 其实盒子模型有两种,分别是标准 w3c 盒子模型和 IE 盒子模型. 他们对盒子模型的解释各不相同,先来看看我们熟知的标准盒子模型: 一.w3c盒子模型 看下面的图,根据色块,右外倒内,分别代表margin.border.padding.content(即网页内容部分) 二.IE盒子模型 与w3c盒子模型的组成部分类似,IE盒子模型也包括上图几个部分 但是不同的是,IE盒子模型把border和padding归

关于android SDK安装Failed to fetch URL 一点思考

最近SDK出问题了,然后在google下载了一个android-sdk-windows.rar,然后点击SDK Manager,结果一直不能刷新API Level,然后就开始在网上找了好多资料,解决这个问题,修改 HOSTS,    HTTP  和  HTTPS  都不能解决,这给我带来了很大的困惑!   加载不出来的界面错误为: Fetching http://dl-ssl.google.com/android/repository/addons_list-1.xml Failed to fe