关键词:
ibatis
ibatis集成spring
dwr集成spring
内容:
当前软件开发中ssh框架集成司空常见,相信大家都会做。ibatis是一种非常优秀的持久层框架,那么ibatis如何与spring集成在一起呢。注意我没有明确说ibatis和struts集成在一起,原因在于ssh中struts与spring的集成,在ss+ibatis中没有区别。
1. Struts和spring的集成
很多时候,我使用dwr(ajax框架)。所以我使用监听器的方式集成struts与spring。以利于dwr与spring集成。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
……..
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- dwr框架 -->
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<!-- spring集成struts -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/bo-dao.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
……..
</web-app>
dwr.xml的使用
dwr框架可以直接使用spring容器里的BO bean
本例中findAll( )方法返回客户的list
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="JCustomer">
<param name="beanName" value="customerBO" />
<include method="findAll"/>
</create>
<convert converter="bean" match="com.esale.to.CustomerTO"></convert>
</allow>
</dwr>
2. ibatis与hibernate的横向比较之我见
两者都是优秀的持久层框架。Hibernate是对象关系映射产品(orm),全自动的。ibatis的作者认为ibatis是一种半自动的数据映射器框架(data mapper)。
使用hibernate的人,不需要了解sql,除非你基于性能的考虑,例如hibernate的分页性能就比较差,原因在于hibernate要查询出所有的记录而不是当前页的记录。
使用ibatis的人需要熟练sql,项目中大量的查询让sql高手使用ibatis的时候如鱼得水,极致性能。
核心区别我的理解:
select * from users where username=? and password=?;
这是一条sql语句,ibatis把这条sql语句映射为函数,username和password的实际值作为函数参数,返回值做为一个实体对象或者实体对象的列表,就是查询结果集的封装。
hibernate不关心sql语句,sql由框架来生成。它关心表和类的对应关系,称之为映射。
比如tbl_user表对应UserTO类(传输值类),表中的列一一对应实体类的属性。类和表的映射关系一旦建立。类等于表,表中的一条记录就是类的一个实例对象。只不过这个对象可能处于transient、persistant或者detached状态。
开发中hibernate对增加删除和修改有利,对复杂查询不利。
ibatis的crud操作都比较好,对高性能和高难度的查询更加有利,唯一的缺点在于半自动化。
3. ibatis与spring的集成
3.1 SqlMapConfig.xml相当于hibernate.cfg.xml文件,数据源由spring管理,看后面
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings useStatementNamespaces="true" />
<sqlMap resource="com/eHome/dao/impl/User.xml" />
<sqlMap resource="com/eHome/dao/impl/Article.xml" />
</sqlMapConfig>
3.2 User.xml与UserDAOImpl.java类,相当于hibernate的实体类与实体类的映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="user">
<typeAlias alias="userTO" type="com.eHome.entity.UserTO" />
<select id="selectByUserName" resultClass="userTO"
parameterClass="string">
select * from users where userName=#userName#
</select>
<insert id="insert" parameterClass="userTO">
insert into users values(#userName#,#password#,#realName#,#sex#)
<selectKey resultClass="int" keyProperty="userId">
SELECT @@IDENTITY AS userId
</selectKey>
</insert>
</sqlMap>
public class UserDAOImpl extends SqlMapClientDaoSupport implements UserDAO {
/**
* 根据用户名查找一名用户
*/
public UserTO findByUserName(String userName) {
UserTO user = (UserTO) this.getSqlMapClientTemplate().queryForObject(
"user.selectByUserName", userName);
return user;
}
/**
* 保存一个用户
*/
public Integer save(UserTO user) {
return (Integer) this.getSqlMapClientTemplate().insert("user.insert", user);
}
}
注意红色部分配置文件中sql语句与dao方法的对应关系。
3.3 最后spring集成ibatis
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- 数据源 -->
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="net.sourceforge.jtds.jdbc.Driver">
</property>
<property name="url"
value="jdbc:jtds:sqlserver://localhost:1433/ownHome">
</property>
<property name="username" value="sa"></property>
<property name="password" value="ok"></property>
</bean>
<!-- 相当于hibernate会话工厂的sqlMapClient -->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:com/eHome/dao/SqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref bean="ds" />
</property>
</bean>
<!-- hibernate中dao类依赖会话工厂,此处 -->
<bean id="userDAO" class="com.eHome.dao.impl.UserDAOImpl"
abstract="false" lazy-init="default" autowire="default"
dependency-check="default">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
<!—bo对dao的依赖 -->
<bean id="userBO" class="com.eHome.service.UserBO" abstract="false"
lazy-init="default" autowire="default" dependency-check="default">
<property name="userDAO">
<ref bean="userDAO" />
</property>
</bean>
……
</beans>
今天到此,大家有什么问题与我讨论,在lily_c_@126.com联系我。
北大青鸟-中博www.njaccp.com