Spring+ibatis

 
Spring 提供了一套成熟而全面的基础框架,站在应用开发的实际角度来说,其最大的优势在于: Spring 是一个从实际项目开发经验中抽取的,可高度重用的应用框架
Spring Framework 中目前最引人注目的,也就是名为控制反转( IOC Inverse Of Control )或者依赖注入( DI Dependence Injection )的设计思想。
IoC ,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中,实现了组件真正意义上的即插即用。这也是 Spring 最具价值的特性之一
但是,光一个单纯的设计模式并不能使得 Spring 如此成功,而 Spring 最成功的地方也并不仅仅在于采用了 IOC/DI 的设计。
首先, Spring 涵盖了应用系统开发所涉及的大多数技术范畴,包括 MVC ORM 以及 RemoteInterface 等,这些技术往往贯穿了大多数应用系统的开发过程。 Spring 从开发者的角度对这些技术内容进行了进一步的封装和抽象,使得应用开发更为简便。
其次, Spring 并非一个强制性框架,它提供了很多独立的组件可供选择。
 
一个依赖注入的例子
<beans>
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/sample</value>
</property>
</bean>
<bean id="SampleDAO" class="com.SampleDAO">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
</beans>
其中 SampleDAO 中的 dataSource 将由容器在运行期动态注入,而 DataSource 的具体配置和初始化工作也将由容器在运行期完成。
通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定SampleDAO中所需的DataSource实例。SampleDAO只需利用容器注入的DataSource实例,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。
 
 
ibatis Hibernate 类似 也是一个 ORM 解决方案。 相对 Hibernate Apache OJB 等“一站式” ORM 解决方案而言, ibatis 是一种“半自动化”的 ORM 实现。
这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM 实现而言,“全自动”ORM 实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。而ibatis 的着力点,则在于POJO 与SQL之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。
使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL 语句,而ibatis 则要求开发者编写具体的SQL 语句。相对Hibernate等“全自动”ORM机制而言,ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。
 
一个简单的配置
<select id="getUser" parameterClass="java.lang.String" resultClass="java.util.HashMap">
 <![CDATA[
 select name, sex from t_user where name = #name#
 ]]>
</select>
通过对sql语句配置的id(getUser)可以非常轻松的通过ibatis中的SqlMapClient对象将查询的记录集封装在对象取出。
Map user = (Map)sqlMap.queryForObject("getUser",name);
这样一来就可以实现对sql语句的配置化,即将sql语句从Bean中分离出来,这对后期的维护工作非常有帮助。
仅仅对sql语句的配置化只是其优点之一,它还有很多非常实用的功能,比如查询的动态映射功能(即通过查询页面提交的条件来动态的组合sql),分页功能等等。
 
我们通过Struts在项目中的运用已经对MVC的开发模式有了比较深刻的理解,只是对于数据持久层,解决得不是很好,因此有必要掌握一种比较流行而且适合我们开发的 ORM ibatis 就是其中的一种,
 
目前在我们的项目中运用的技术不外乎两种jsp+bean和struts,这些技术比较落后了,因此有必要掌握先进的技术,为了公司的技术积累,同时也是为了自身的发展。
我们应该用MVC的模式来开发新的项目,用spring framework做为控制器(C),用jsp页面作为显示页面(V)用ibatis作为数据持久层,并结合java bean来作开发。
控制器
Spring 的控制器分为两种,一种是简单控制器,另一种是form控制器,
Form 控制器是通过commonClass属性将指定的bean与jsp页面上的表单输入框进行绑定,来达到表现层与控制层的数据传输目的,通过Validation属性来对数据的有效性进行校验,通过error对象来封装错误信息并与commonClass属性指定的bean相结合达到错误信息与表单对象绑定的目的。
简单控制器只是对请求进行处理,与Form控制器不同它没有表单绑定和数据校验的功能,相当于一个servlet,使用简单控制器获取jsp提交过来的数据是通过request.getParameter和request.getParameterValues方法,通过new ModelAndView(returnView, model)
方法将数据对象发送到页面(model一般是一个封装了数据的Map对象)。
对比两种控制器,简单控制器更简单和实用,Form控制器比较复杂,需要写与表单绑定的bean(不能用Map来代替),可能还需要写与之相配合使用的数据校验,这无疑会增加不少工作量,同时对于主从表形式的表单的封装还没有找到很好的解决方法,因此应该选择简单控制器,简单控制器可以通过Map的形式来封装页面请求数据,这样可以少写或不写vo对象来映射数据库中的对象,麻烦的地方就是对请求对象中的数据的填充,不过目前已经解决了此不足之处,同时实现了主从表形式的表单数据的传递。
目前我的做法是这样的,先写一个抽象类SimpleController来实现AbstractController的接口,在SimpleController中加入一些比较公用的属性和对象,比如formView,successView等,将AbstractController的handleRequestInternal (HttpServletRequest req, httpServletResponse response)方法抽象出来交由继承SimpleController的子类中实现,其它的控制器都继承于SimpleController控制器,在控制器获取请求后通过一个
Map fillMap(String[] fieldNames, HttpServletRequest request)
List fillMaps(String[] fieldNames, HttpServletRequest request)
方法将表单中的数据封装在Map或List中,然后再对Map或List进行其它的操作,比如对数据有效性进行校验、发送到数据持久层进行增删改查等操作,处理完后再用Map对各种数据和错误信息进行封装,然后发送到页面通过<c:out>标签输出。
 
数据持久层
数据持久层应该充分的发挥ibatis中的功能。
Ibatis 中支持Map对象作为sql语句中的传入参数,同对也支持将查询的结果集以Map的形式进行封装,因此应该用Map来代替ibatis使用中的各种对象,配合控制器中Map使用达到简化开发流程,提高开发效率的目的。
对于数据访问的事务处理,spring和ibatis中都提供了相应功能,使用spring管理事务比较复杂,需要写各种接口和数据访问对象DAO,这样符合面向对象的编程思想同时对我们的编程水平有很大的提高,但是对于开发时间极短的项目来说是不合适的,因此为了到达简单,快速的目的,直接使用ibatis中的事务处理机制管理事务,
我的做法是在控制器中直接使用
Try{
sqlMap.startTransaction();// 开启事务
……
sqlMap.commitTransaction();// 提交事务
}
Finally{
sqlMap.endTransaction();// 结束事务
}
对事务进行控制,
 
视图
视图使用jsp文件来输出,
表单上的输入框直接用标准的html语言,
逻辑、循环和输出则通过jstl的标签实现。
页面上的js函数都以js文件的形式include进来,这样修改一个js函数,所有用到该函数的页面都不用改动。
对于页面输入校验直接用javascript处理,
对于页面上的动态效果通过样式表配合htc文件和javascript完成。
 
日志输出
对于开发中进行调试的信息统一用log4j组件来输出,
 
异常处理
统一使用spring中提供的异常处理机制,各模块中只用将发生的异常抛出,剩下的事情由spring中设置的异常的监听来完成。
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值