在Spring 中集成iBatis的配置是很简单了,下面是一个简单的配置示例:
Spring 的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd "> <context:component-scan base-package="com.david.demo.common.*" /> <context:property-placeholder location="classpath:META-INF/config.properties" /> <!-- 定义数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.ams.driver}" /> <property name="jdbcUrl" value="${jdbc.ams.url}" /> <property name="user" value="${jdbc.ams.username}" /> <property name="password" value="${jdbc.ams.password}" /> <property name="initialPoolSize" value="${initialSize}" /> <property name="minPoolSize" value="${minPoolSize}" /> <property name="maxPoolSize" value="${maxActive}" /> <property name="acquireIncrement" value="${acquireIncrement}" /> <property name="maxIdleTime" value="${maxIdleTime}" /> </bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:META-INF/sqlmap/sqlmap.xml" /> </bean> </beans>
config.properties
jdbc.ams.driver=com.mysql.jdbc.Driver jdbc.ams.url=jdbc:mysql://localhost:3306/test jdbc.ams.username=root jdbc.ams.password=root initialSize=3 minPoolSize=5 maxActive=100 acquireIncrement=3 maxIdleTime=10
sqlMap.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> <!-- cacheModelsEnable 是否启用sqlMapClient上的缓存机制, enhancementEnabled 是否省队POJO启用字节码增强,提升getter/setter效率 lazyLoadingEnabled 是否启用延迟加载机制 errorTracingEnable 是否启用错误日志 maxRequest 最大并发请求数(Statement 并发数) maxSession 最大Session数(SqlMapClient 并发数) maxTransaction=<maxSession=<maxRequest maxTransactions 最大并发事务 useStatemnetNamespaces 是否启用命名空间 --> <settings cacheModelsEnabled="false" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="true" useStatementNamespaces="true" maxRequests="3000" maxSessions="3000" maxTransactions="3000" /> <sqlMap resource="META-INF/sqlmap/sqlmap-Book.xml" /> </sqlMapConfig>
sqlmap-Book.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="demo"> <resultMap class="com.david.common.domain.Book" id="BooKMap"> <result property="id" column="id" javaType="int" /> <result property="name" column="name" javaType="java.lang.String" /> <result property="price" column="price" javaType="int" nullValue="0" /> <result property="extend" column="extend" typeHandler="com.david.demo.common.handler.ExtendTypeHandler"/> </resultMap> <typeAlias alias="Book" type="com.david.common.domain.Book" /> <parameterMap class="Book" id="book"> <parameter property="name" javaType="java.lang.String" nullValue="test"/> <parameter property="price" javaType="int" nullValue="0"/> <parameter property="extend" typeHandler="com.david.demo.common.handler.ExtendTypeHandler" /> </parameterMap> <insert id="insert" parameterMap="book"> insert into t_book (name,price,extend) values (?,?,?) <selectKey keyProperty="id" resultClass="Integer"> select LAST_INSERT_ID() </selectKey> </insert> <select id="select-all" resultMap="BooKMap"> select id,name,price,extend,gmt_create,gmt_modify from t_book </select> <delete id="delete-by-id"> delete from t_book where id=#id# </delete> </sqlMap>
iBatis执行SQL的关键入口是SqlMapClientImpl。通过该类的源码可以发现,在构造方法中注入了一个SqlMapExecutorDelegate 实例,但该类并不真正执行Sql 而是通过SqlMapSession去执行的。
/** * Implementation of ExtendedSqlMapClient */ public class SqlMapClientImpl implements SqlMapClient, ExtendedSqlMapClient { private static final Log log = LogFactory.getLog(SqlMapClientImpl.class); /** * 执行SQL的代理 */ public SqlMapExecutorDelegate delegate; protected ThreadLocal localSqlMapSession = new ThreadLocal(); /** * Constructor to supply a delegate * * @param delegate - the delegate */ public SqlMapClientImpl(SqlMapExecutorDelegate delegate) { this.delegate = delegate; } public Object insert(String id, Object param) throws SQLException { return getLocalSqlMapSession().insert(id, param); } ... /** 获取当前线程的SqlMapSession,如果当前线程中没有SqlMapSession或SqlMapSession已经关闭,则创建一个新的SqlMapSession 并存入到当前线程中。 */ protected SqlMapSessionImpl getLocalSqlMapSession() { SqlMapSessionImpl sqlMapSession = (SqlMapSessionImpl) localSqlMapSession.get(); if (sqlMapSession == null || sqlMapSession.isClosed()) { // 使用当前SqlMapClientImpl 作为构造参数构造一个新的SqlMapSession实例 sqlMapSession = new SqlMapSessionImpl(this); // 将实例放入ThreadLocal中 localSqlMapSession.set(sqlMapSession); } return sqlMapSession; } ... }
通过SqlMapSessionImpl 的源码可以发现,在构造函数中,将SqlMapClientImpl中的属性delegate赋值给了SqlMapSessionImpl的属性delegate,同时可以发现SqlMapExecutorDelegate是真正执行Sql的地方
** * Implementation of SqlMapSession */ public class SqlMapSessionImpl implements SqlMapSession { protected SqlMapExecutorDelegate delegate; protected SessionScope sessionScope; protected boolean closed; /** * Constructor * * @param client - the client that will use the session */ public SqlMapSessionImpl(SqlMapClientImpl client) { this.delegate = client.getDelegate(); this.sessionScope = this.delegate.beginSessionScope(); this.sessionScope.setSqlMapClient(client); this.sessionScope.setSqlMapExecutor(client); this.sessionScope.setSqlMapTxMgr(client); this.closed = false; } /** * Start the session */ public void open() { sessionScope.setSqlMapTxMgr(this); } /** * Getter to tell if the session is still open * * @return - the status of the session */ public boolean isClosed() { return closed; } public void close() { if (delegate != null && sessionScope != null) delegate.endSessionScope(sessionScope); if (sessionScope != null) sessionScope = null; if (delegate != null) delegate = null; if (!closed) closed = true; } // 使用SqlMapExecutorDelegate去执行SQL public Object insert(String id, Object param) throws SQLException { return delegate.insert(sessionScope, id, param); } ...
相关推荐
在整合Spring和iBatis框架时,我们需要进行一系列的配置工作,以便于让Spring负责管理iBatis的数据访问层。Spring作为一个强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,可以方便地...
"spring+ibatis配置实例"这个项目提供了一个完整的开发环境,包含所需的依赖包和标准化的项目结构,对初学者或开发者来说极具价值。 Spring是一个全面的Java应用框架,它提供了依赖注入(Dependency Injection,DI...
很好的spring+ibatis事务的配置文档.
3. iBatis配置:创建一个名为`sqlmap-config.xml`的iBatis配置文件,定义数据源、事务管理器以及SQL映射文件的位置。 4. 映射文件:每个数据库表对应一个或多个SQL映射文件,如`UserMapper.xml`,其中定义了SQL语句...
ibatis配置文件中,可以看到关于ibatis事务管理器的配置。这里设置事务管理器类型为JDBC,表示ibatis将直接使用底层的JDBC连接进行事务控制,而不是使用Spring提供的事务管理器。 ```xml ``` ...
-- 通过文件路径指定iBatis配置文件 --> <value>/WEB-INF/SqlMapConfig.xml ``` #### iBatis事务管理配置 最值得关注的部分是iBatis的事务管理配置,这里明确指定了事务管理器的类型为`JDBC`,并且定义了...
3. **配置文件**:在整合过程中,需要配置两部分:Spring 配置文件(如 `applicationContext.xml`)和 iBATIS 配置文件(如 `sqlMapConfig.xml`)。Spring 配置文件中定义数据源、事务管理器以及 ...
Struts2、Spring和iBatis是Java Web开发中三个非常重要的框架,它们分别负责MVC模式中的Action层、业务层管理和数据访问层。在这个项目整合源码中,这三个组件协同工作,构建了一个完整的Web应用程序。 Struts2是...
spring和ibatis配置与模板
2. **配置Spring**:接下来,需要在Spring的配置文件中定义iBATIS的SqlMapClient或SqlSessionFactory Bean,并配置数据源、事务管理器等相关属性。 3. **定义映射文件**:iBATIS的核心在于定义SQL映射文件,这些...
【Spring+iBatis配置归类】的文档主要涵盖了Spring框架与iBatis集成的细节,旨在简化数据库访问的代码,并提供统一的异常处理机制。在本文档中,我们将深入探讨Spring如何与iBatis协同工作,包括JavaBean实体、映射...
Struts+Spring+Ibatis环境配置(一) - zwjxf的专栏 - 博
Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的动作控制、依赖注入及持久层操作。本项目整合了这三个框架,并使用MySQL作为数据库,实现了一个基础的用户登录注册查询删除的功能...
Struts2、Spring和iBatis是Java Web开发中非常重要的三个框架,它们分别负责MVC模式中的Action层、业务逻辑层以及数据访问层。这三个框架的整合可以提供一个高效且灵活的开发环境,帮助开发者构建出结构清晰、易于...
【Spring+iBatis配置】是软件开发中常见的一种技术整合,用于构建高效、灵活的数据访问层。Spring框架提供了对iBatis的内建支持,使得开发者可以更方便地使用iBatis进行数据库操作,同时利用Spring的优势进行事务...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
6. **配置数据源**:在Spring中配置数据源,以便iBatis能够连接数据库。 7. **编写Mapper接口和XML文件**:定义数据库操作接口,XML文件中编写具体的SQL语句。 8. **测试**:编写JUnit测试或在实际应用中测试整合后...
- **iBatis配置**:编写MyBatis的配置文件(如`mybatis-config.xml`),设置数据源、事务管理器等,并定义Mapper接口和对应的XML映射文件。 4. **Mapper接口与XML映射文件** - **Mapper接口**:在Java中创建...