Spring+ibatis

来源:互联网 发布:比特彗星端口检测失败 编辑:程序博客网 时间:2024/05/22 01:38
 
Spring提供了一套成熟而全面的基础框架,站在应用开发的实际角度来说,其最大的优势在于:Spring是一个从实际项目开发经验中抽取的,可高度重用的应用框架
Spring Framework中目前最引人注目的,也就是名为控制反转(IOC Inverse Of Control)或者依赖注入(DI Dependence Injection)的设计思想。
IoC,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中,实现了组件真正意义上的即插即用。这也是Spring最具价值的特性之一
但是,光一个单纯的设计模式并不能使得Spring如此成功,而Spring最成功的地方也并不仅仅在于采用了IOC/DI的设计。
首先,Spring涵盖了应用系统开发所涉及的大多数技术范畴,包括MVCORM以及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实例,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。
 
 
ibatisHibernate类似也是一个ORM解决方案。相对HibernateApache 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的开发模式有了比较深刻的理解,只是对于数据持久层,解决得不是很好,因此有必要掌握一种比较流行而且适合我们开发的ORMibatis就是其中的一种,
 
目前在我们的项目中运用的技术不外乎两种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中设置的异常的监听来完成。
 
原创粉丝点击