- 浏览: 1229233 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
ibatis学习(三)---ibatis与spring的整合
介绍
iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性。
iBATIS不同于一般的OR映射框架(eg:hibernate)。OR映射框架,将数据库表、字段等映射到类、属性,那是一种元数据(meta-data)映射。iBATIS则是将SQL查询的参数和结果集映射到类。因此可以说,iBATIS做的是SQL Mapping的工作。它把SQL语句看成输入以及输出,结果集就是输出,而where后面的条件参数则是输入。iBATIS能将输入的普通POJO对象、Map、XML等映射到SQL的条件参数上,同时也可以将查询结果映射到普通POJO对象(集合)、Map、XML等上面。
iBATIS使用xml文件来映射这些输入以及输出。能大大减少数据库存储部分的代码量,而且可以非常方便的利用SQL中的一些小技巧。
简单示例
基于ibatis-2.3.0.677版本。
1、 创建新的项目,并引入jar包
a) ibatis-2.3.0.677.jar
b) mysql驱动
2、 在类路径中(classes下)提供ibatis的配置文件:sqlMapConfig.xml
<?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> <transactionManager type="JDBC" commitRequired="false"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/> <property name="JDBC.ConnectionURL" value="jdbc:mysql://127.0.0.1/ibatis"/> <property name="JDBC.Username" value="root"/> <property name="JDBC.Password" value="mysql"/> </dataSource> </transactionManager> <sqlMap resource="com/ibatis/model/User.xml"/> </sqlMapConfig> |
3、创建实体类:User.java
package com.ibatis.model; publicclass User { privateintid; private String username; private String password;
publicint getId() { returnid; } publicvoid setId(int id) { this.id = id; } public String getPassword() { returnpassword; } publicvoid setPassword(String password) { this.password = password; } public String getUsername() { returnusername; } publicvoid setUsername(String username) { this.username = username; } } |
4、创建针对User对象的CRUD的xml映射配置:User.xml
<?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"> <!-- Use type aliases to avoid typing the full classname every time. --> <typeAlias alias="User" type="com.ibatis.model.User"/> <!-- Select with no parameters using the result map for Account class. --> <select id="selectAllUsers" resultClass="User"> select * from t_user </select>
<select id="selectUser" resultClass="User" parameterClass="int"> select * from t_user where id=#id# </select>
<insert id="insertUser" parameterClass="User"> insert into t_user values ( null,#username#,#password# ) </insert>
<update id="updateUser" parameterClass="User"> update t_user set username = #username#,password=#password# where id=#id# </update>
<delete id="deleteUser" parameterClass="int"> delete from t_user where id=#id# </delete> </sqlMap> |
5、创建测试程序测试:
package com.crm.model; import java.io.Reader; import java.util.Iterator; import java.util.List; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; /** *最简单的形式! *@authorq * */ publicclass UserTest { /** *@paramargs */ publicstaticvoid main(String[] args) throws Exception{ //从配置文件中得到SqlMapClient对象 Reader reader = Resources.getResourceAsReader("sqlMapConfig.xml"); SqlMapClient sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader); reader.close();
//创建用户数据 for(int i=0; i<10; i++){ User user = new User(); user.setUsername("用户"+i); user.setPassword("密码"+i); sqlMapper.insert("insertUser", user); }
//查询用户数据 List users = sqlMapper.queryForList("selectAllUsers"); for (Iterator iter = users.iterator(); iter.hasNext();) { User user = (User) iter.next(); System.out.println(user.getUsername()); }
//查询特定用户的数据 User user = (User)sqlMapper.queryForObject("selectUser", 1); System.out.println("用户【id="+1+"】的名称是:"+user.getUsername());
//更新用户的信息 user = new User(); user.setId(3); user.setUsername("更改之后的用户名称"); user.setPassword("密码被更改"); sqlMapper.update("updateUser", user);
//删除用户的信息 sqlMapper.delete("deleteUser", 6); } } |
SqlMapClient对象
这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作。这个类是我们使用iBATIS的最主要的类。它是线程安全的。通常,将它定义为单例。(与hibernate中sessionFactory的定义类似)。如:
import java.io.Reader; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; public class IbatisSQLMapConfig { private static final SqlMapClient sqlMap; //在静态区块中初试化返回 static { try { //声明配置文件的名称(映射文件被定义在其中) String resource = "sql_map_config.xml"; //利用工具类Resources来读取到配置文件 Reader reader = Resources.getResourceAsReader(resource); //创建SqlMapClient接口的变量实例 sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException( "Error initializing MyAppSqlConfig class. Cause: " + e); } } public static SqlMapClient getSqlMapInstance() { //提供静态方法返回静态区块中得到的SqlMapClient return sqlMap; } } |
主要用法:
如何获得刚插入记录的自增长ID值?
以下所有虚线上面代表User.xml中的内容,虚线下方是测试类中的内容:User类沿用上一篇中的User类
<insert id="insertUser" parameterClass="User"> insert into t_user values ( null,#username#,#password# ) <selectKey resultClass="int" keyProperty="id"> SELECT @@IDENTITY AS ID </selectKey> </insert> |
User user = new User(); user.setUsername("张三"); user.setPassword("张三密码");
//如果主键是自动生成的,则其返回值可以通过<selectKey>标签来设置 //如果不通过<selectKey>标签来设置,则返回值为空! //<selectKey >中的keyProperty,是指定User中的id属性,当调用结束之后, //user对象的id值和insert方法的返回值都是这条记录的ID值! Object obj = sqlMapper.insert("insertUser", user); |
parameterClass的使用
<insert id="insertUser" parameterClass="User"> insert into t_user values ( null,#username#,#password# ) <selectKey resultClass="int" keyProperty="id"> SELECT @@IDENTITY AS ID </selectKey> </insert>
<insert id="insertUser2"> insert into t_user values ( null,#username#,#password# ) <selectKey resultClass="int" keyProperty="id"> SELECT @@IDENTITY AS ID </selectKey> </insert> |
insertUser使用了parameterClass,所以必需传入User类型的对象
User user = new User(); user.setUsername("张三"); user.setPassword("张三密码");
//传递进去的对象,必须是User类型 Object obj = sqlMapper.insert("insertUser", user); |
insertUser2没有使用parameterClass,所以可以传入任意具有相应属性值的对象
JustAnObject anobj = new JustAnObject(); anobj.setUsername("用户名"); anobj.setPassword("用户密码");
//如果没有指定parameterClass属性,则任何一个具有相应属性值 //的对象都可以被传递进去 Object obj = sqlMapper.insert("insertUser2", anobj); |
parameterMap的使用
<parameterMap class="User" id="insertUser-param"> <parameter property="username"/> <parameter property="password"/> </parameterMap> <insert id="insertUser" parameterMap="insertUser-param"> insert into t_user values ( null,?,? ) <selectKey resultClass="int" keyProperty="id"> SELECT @@IDENTITY AS ID </selectKey> </insert> |
parameterMap用于传入参数,以便匹配SQL语句中的?号
User user = new User(); user.setUsername("张三dd"); user.setPassword("张三密码dd");
Object obj = sqlMapper.insert("insertUser", user); |
利用parameterMap,可以定义参数对象的属性如何映射到SQL查询语句的动态参数上,注意parameterMap中<parameter/>标签的先后顺序不能颠倒!
如何将查询结果映射到不同的对象?(resultClass的使用)
package com.ibatis.model;
publicclassOtherObject {
privateintid;
private String prop1;
private String prop2;
publicint getId() {
returnid;
}
publicvoid setId(int id) {
this.id = id;
}
public String getProp1() {
return Prop1;
}
publicvoid set Prop1 (String Prop1) {
this. Prop1 = Prop1;
}
public String getProp2() {
returnusername;
}
publicvoid setProp2 (String Prop2) {
this.Prop2 = Prop2;
}
}
<select id="selectUserForOtherObject" resultClass="com. ibatis.OtherObject" parameterClass="int"> select username as prop1, password as prop2 from t_user where id=#value# </select> |
//查找t_user表,将其结果映射到一个属性名不同的对象中! OtherObject obj = (OtherObject)sqlMapper.queryForObject("selectUserForOtherObject", 1); System.out.println(obj.getProp1()+","+obj.getProp2()); |
如何将查询结果集映射到不同的对象?(resultMap的基本使用)
<resultMap class="com.ibatis.model.OtherObject" id="ooResult"> <result property="prop1" column="username"/> <result property="prop2" column="password"/> </resultMap> <!-- 如果使用resultMap来定义如何映射,则如下语句不可写成: select username as prop1,password as prop2 .... --> <select id="selectUserForOtherObject2" parameterClass="int" resultMap="ooResult"> select username, password from t_user where id=#value# </select> |
//查找t_user表,将其结果映射到一个属性名不同的对象中! OtherObject obj = (OtherObject)sqlMapper.queryForObject("selectUserForOtherObject2", 17); System.out.println(obj.getProp1()+","+obj.getProp2()); |
如何将查询结果集映射为xml格式的数据?
<select id="selectXmlData" resultClass="xml" xmlResultName="User" parameterClass="int"> select * from t_user where id=#value# </select> <select id="selectXmlDatas" resultClass="xml" xmlResultName="User"> select * from t_user </select> |
//查找t_user表,将其结果映射到xml! //返回值是xml形式的字符串 Object obj = (Object)sqlMapper.queryForObject("selectXmlData", 1); System.out.println(obj); //查找t_user表,将其结果映射到xml! List list = (List)sqlMapper.queryForList("selectXmlDatas"); System.out.println(list); |
如何用Map类型的对象作为传入参数?
<!-- 这里,可以使用全路径类名,如: java.util.Map java.util.HashMap java.util.TreeMap 或 map --> <insert id="insertUser" parameterClass="map"> insert into t_user values ( null,#username#,#password# ) </insert> |
Map user = new TreeMap(); user.put("username", "Map用户"); user.put("password", "Map用户密码"); sqlMapper.insert("insertUser",user); |
如何将查询结果集的元素转换为Map类型的对象?
<!-- resultClass可以定义为java.util.HashMap类型, 将能自动转换 --> <select id="selectMapUsers" resultClass="java.util.HashMap"> select * from t_user </select> |
List list = (List)sqlMapper.queryForList("selectMapUsers"); System.out.println(list); for (Iterator iter = list.iterator(); iter.hasNext();) { Map map = (Map) iter.next(); //可在此输出map的数据 } |
事务处理
可以使用sqlMapClient的startTransaction/commitTransaction/endTransaction等方法来控制事务的边界。
如果与spring整合(这是iBatis推荐的方式),则我们需要在spring配置文件中指定其事务特性。
Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。
与hibernate类似,Spring 提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。
通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的,这里面关键的问题是事务处理。Spring提供了强大的声明式事务处理的功能,我们已经清楚hibernate中如何配置声明式的事务,那么在iBATIS中如何获得声明式事务的能力呢?
第一,我们需要了解的是spring通过AOP来拦截方法的调用,从而在这些方法上面添加声明式事务处理的能力。典型配置如下:applicationContext-common.xml
<!-- 配置事务特性 --> <tx:advice id="txAdvice" transaction-manager="事务管理器名称"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice>
<!-- 配置哪些类的方法需要进行事务管理 --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com.ibatis.manager.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/> </aop:config> |
这些事务都是声明在业务逻辑层的对象上的。
第二,我们需要一个事务管理器,对事务进行管理。
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1/ibatis"/> <property name="username" value="root"/> <property name="password" value="mysql"/> </bean> |
此后,我们需要让spring来管理SqlMapClient对象:
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"><value>classpath:sqlMapConfig.xml</value></property> </bean> |
我们的sqlMapConfig.xml就可以简写为:
<?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
lazyLoadingEnabled="true"
useStatementNamespaces="true" />
<!-- 使用spring之后,数据源的配置移植到了spring上,所以iBATIS本身的配置可以取消 -->
<sqlMap resource="com/ibatis/dao/impl/ibatis/User.xml"/>
</sqlMapConfig>
User.xml:如下
<?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">
<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="User" type="com.ibatis.User"/>
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectAllUsers" resultClass="User">
select * from t_user
</select>
<select id="selectUser" resultClass="User" parameterClass="int">
select * from t_user where id=#id#
</select>
<insert id="insertUser" parameterClass="User">
insert into t_user values (
null,#username#,#password#
)
</insert>
<update id="updateUser" parameterClass="User">
update t_user set username = #username#,password=#password#
where id=#id#
</update>
<delete id="deleteUser" parameterClass="int">
delete from t_user where id=#id#
</delete>
</sqlMap>
我们的DAO的编写:
package com.iabtis.dao.impl.ibatis; import java.util.List; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import com.ibatis.dao.UserDAO; import com.ibatis.crm.model.User; public class UserDAOImpl extends SqlMapClientDaoSupport implements UserDAO { public void select(User user) { getSqlMapClientTemplate().delete("selectUser ",user.getId()); } public List findAll() { return getSqlMapClientTemplate().queryForList("selectAllUsers "); } public void delete(User user) { getSqlMapClientTemplate().delete("deleteUser ",user.getId()); } public void save(User user) { getSqlMapClientTemplate().insert("insertUser ",user); } public void update(User user) { getSqlMapClientTemplate().update("updateUser ",user); } } |
继承SqlMapClientDaoSupport,要求我们注入SqlMapClient对象,因此,需要有如下的DAO配置:
<bean id="userDAO" class="com.ibatils.dao.impl.ibatis.UserDAOImpl"> <property name=”sqlMapClient” ref=”sqlMapClient”/> </bean> |
这就是所有需要注意的问题了,此后就可以在业务逻辑层调用DAO对象了!
发表评论
-
IBATIS resultClass为hashMap时的缓存问题
2012-01-16 15:25 1343http://hi.baidu.com/sgqiang5566 ... -
Ibatis读写CLOB数据
2012-01-10 11:20 1279Ibatis读写CLOB数据 注意:需要更新ORACLE数据 ... -
IBATIS调用存储过程
2011-12-16 10:30 881http://www.iteye.com/topic/8422 ... -
Ibatis select in 的处理
2011-11-16 19:48 1810如下: 在ibatis中如何使用in条件select * f ... -
使用ibator快速生成代码
2011-11-08 18:38 613相关链接: ibator使用说明:http://ibatis ... -
spring 3 和mybatis 3集成,并用junit4进行测试
2011-11-04 14:01 1464转:spring 3 和mybatis 3集成,并用junit ... -
java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource的解决方法
2011-11-03 16:17 2746用Myeclipse开发struts时,配置struts-co ... -
Ibatis在项目中怎么使用的
2011-11-03 10:44 917Spring中配置: <!--定义dat ... -
iBATIS是什么?
2009-08-05 22:40 939http://developer.51cto.com/art/ ... -
iBATIS动态查询的实现浅析
2009-08-05 22:46 1095http://developer.51cto.com/art/ ... -
IBatis 怎样直接执行SQL语句
2009-08-05 22:50 1187http://blog.tanggaowei.com/2009 ... -
iBATIS实现的一个例子
2009-08-05 22:51 841http://www.builder.com.cn/2007/ ... -
选择Hibernate还是iBATIS
2009-08-05 22:54 1343http://robbin.iteye.com/blog/24 ... -
我为什么选择 iBatis 而不是 Hibernate(对于正在选型的人的建议)
2009-08-05 22:56 867http://jiming.iteye.com/blog/41 ... -
ibatis教程入门示例
2009-08-05 23:07 2816http://www.javah.net/ibatis/200 ... -
iBatis学习方法及入门总结
2009-08-05 23:09 1592http://www.javah.net/ibatis/200 ... -
iBATIS SQL Maps 入门教程
2009-08-05 23:29 986http://nchc.dl.sourceforge.net/ ...
相关推荐
本项目旨在为初学者提供一个基础的入门指南,帮助理解并掌握这三个框架的集成与使用,实现CRUD(Create、Read、Update、Delete)操作。 **Struts2** 是一个基于MVC(Model-View-Controller)设计模式的开源Web应用...
MyBatis与Spring框架的整合可以进一步提高应用的灵活性和可管理性。Spring作为一款全功能的框架,提供了依赖注入(DI)和面向切面编程(AOP)等特性,而MyBatis则专注于数据库操作。当两者结合时,我们可以利用...
6. 事务管理:理解Ibatis的自动和手动事务控制,以及如何与Spring的事务管理集成。 7. 错误调试:学会如何查看和解读Ibatis的日志,以便于定位和解决问题。 通过阅读提供的文档和教程,结合实际的代码练习,你应该...
5. 配置Spring:如果使用Spring整合iBatis,需要在Spring配置文件中添加相关配置。 6. 编写测试类:例如`ibatisJavaTest`,使用Spring的`@Autowired`注解注入`UserMapper`接口,调用其方法进行数据库操作。 四、...
- 易于集成:Ibatis 可以轻松地与其他框架(如 Spring)集成,实现更强大的功能。 通过这个入门教程,你将掌握 Ibatis 的基础用法,从而能够进行基本的数据库操作。在实际项目中,随着对 Ibatis 的深入理解和应用...
- **事务管理**:与Spring集成时,可以利用Spring的事务管理机制来处理复杂的事务逻辑。 #### 六、总结与展望 - **总结**:通过本文的学习,我们了解了iBATIS SQL Maps的基本概念、架构设计以及快速入门的方法。 -...
其他还有一些特点不是Spring的核心,这里只做简单陈述,如:对JDBC的封装与简化,提供事务管理功能,对O/R mapping工具(hibernate、iBATIS)的整合;提供MVC解决方案,也可以与其他web框架(Struts、JSF)进行整合...
Spring还包含了数据访问、事务管理、邮件服务、任务调度等多个模块,能够与各种其他框架如Struts2、iBatis无缝集成。 将这三者结合起来,我们可以构建出一个高效且可维护的Java Web应用。首先,Struts2作为前端控制...
在IT行业中,SSI(Spring、Struts1、iBatis)是经典的Java Web开发框架组合,它们各自负责应用的不同层面,协同工作以构建高效、可维护的...同时,这个案例也可以作为教学材料,帮助初学者快速入门企业级Java应用开发。
**ibatis入门教程与开发指南** Ibatis,全称MyBatis-iBATIS,是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Ibatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Ibatis可以使用简单...
iBATIS可以很好地与Spring框架集成,通过Spring的SqlSessionFactoryBean创建SqlSessionFactory,再由SqlSessionFactory创建SqlSession,进而执行SQL Maps中的操作。这样,iBATIS可以融入到Spring的依赖注入和事务...
在实际应用中,iBATIS可以很好地与Spring框架集成,形成Spring + iBATIS的架构,提供更强大的企业级应用解决方案。在Spring中,可以通过Autowired注解实现iBATIS DAO层的自动注入,简化了依赖注入的过程。 总的来说...
iBatis,现已被更名为MyBatis,是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。...通过这个简单的"iBatis入门Helloworld"项目,你可以快速掌握iBatis的基础操作,并为进一步学习和应用打下坚实基础。
"Spring Guide.pdf"很可能是Spring框架的入门教程,涵盖了Spring的基本概念、配置、Bean管理、AOP、事务管理等内容,可能还会介绍Spring MVC用于构建Web应用的部分。 "Hibernate_DEV_GUIDE.rar"应包含Hibernate的...
在Struts2和iBatis的集成中,Spring可以作为容器管理它们的生命周期,同时提供事务管理等高级功能。 在"TestSSi"这个项目中,你可能会看到以下几个关键部分: 1. **配置文件**:包括`struts.xml`、`spring-servlet...
在"iBATIS开发指南电子书"中,会提供更详细的指导,包括事务管理、缓存机制、动态SQL以及与Spring框架的整合。iBATIS的事务管理允许你在应用程序级别控制事务的提交和回滚。缓存机制则可以提高数据访问效率,减少对...
这个入门例子将帮助初学者了解WebWork、Spring和iBatis的集成使用,为后续的Web开发技能提升打下坚实基础。在实践中,可以不断优化和扩展这个例子,比如引入Ajax增强用户体验,或者加入验证和异常处理机制,使其成为...
对于Spring整合Ibatis,还需要配置SqlSessionFactoryBean,它会根据配置文件生成SqlSessionFactory,它是SqlSession的工厂。 四、动态SQL Ibatis的动态SQL功能非常强大,允许我们在映射文件中直接写条件语句,如if...