Ibatis+Spring整合实例Demo+源码
1. 单独整合ibatis
ibatis和hibernate一样, 总体上没有hibernate那么强大.但是ibatis简单易用.
区别:
hibernate中每个实体类配置的注解和xml对应于数据库,ORM关系看比较紧;查询更新以实体对象为基准;
ibatis中每个实体也配置xml和实体类(entity和数据库对应的字段);配置要用的SQL语句;
?
A. 见证实体对象User.java
package cn.edu.zju.jjh.entity;import java.io.Serializable;/**** * * @author greatwqs * @date 2011-12-02 */public class User implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;private String password;private String description;// getter and setter}
?
B. 对应实体的ibatis的xml配置信息.Users.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="cn.edu.zju.jjh.entity.User" /><!-- Result maps describe the mapping between the columns returnedfrom a query, and the class properties. A result map isn'tnecessary if the columns (or aliases) match to the properties exactly. --><resultMap id="UserResult" column="id" /><result property="name" column="name" /><result property="password" column="password" /><result property="description" column="description" /></resultMap><!-- Select with no parameters using the result map for Account class. --><select id="selectAllUsers" resultMap="UserResult">select * from Users</select><!-- A simpler select example without the result map. Note the aliases to match the properties of the target result class. --><select id="selectUserById" parameterparameterparameterparametername="code"><?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> <!-- Configure a built-in transaction manager. If you're using an app server, you probably want to use its transaction manager and a managed datasource --> <transactionManager type="JDBC" commitRequired="false"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/> <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatistest"/> <property name="JDBC.Username" value="root"/> <property name="JDBC.Password" value="greatwqs"/> </dataSource> </transactionManager> <!-- List the SQL Map XML files. They can be loaded from the classpath, as they are here (com.domain.data...) --> <sqlMap resource="cn/edu/zju/jjh/entity/Users.xml"/> <!-- List more here... <sqlMap resource="com/mydomain/data/Order.xml"/> <sqlMap resource="com/mydomain/data/Documents.xml"/> --></sqlMapConfig>
?
D: 测试IbatisTest.java
package cn.edu.zju.jjh;import java.io.IOException;import java.io.Reader;import java.sql.SQLException;import cn.edu.zju.jjh.entity.User;import com.ibatis.common.resources.Resources;import com.ibatis.sqlmap.client.SqlMapClient;import com.ibatis.sqlmap.client.SqlMapClientBuilder;public class IbatisTest {/*** * 使用纯Ibatis进行测试! */public static void main(String[] args) {String resource = "sqlMapConfig_ibatis.xml";Reader reader;SqlMapClient sqlMap = null;try {reader = Resources.getResourceAsReader(resource);sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);sqlMap.startTransaction();User user = new User();user.setId("1099");user.setName("EagleWang");user.setPassword("EaglePassword");user.setDescription("Email: greatwqs@163.com");sqlMap.insert("insertUser", user);sqlMap.commitTransaction();sqlMap.endTransaction();} catch (IOException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}}
?
执行测试成功:
DEBUG-Created connection 1073282.DEBUG-{conn-100000} ConnectionDEBUG-{conn-100000} Preparing Statement: insert into Users (id,name, password,description) values ( ?, ?, ?, ?) DEBUG-{pstm-100001} Executing Statement: insert into Users (id,name, password,description) values ( ?, ?, ?, ?) DEBUG-{pstm-100001} Parameters: [1099, EagleWang, EaglePassword, Email: greatwqs@163.com]DEBUG-{pstm-100001} Types: [java.lang.String, java.lang.String, java.lang.String, java.lang.String]DEBUG-Returned connection 1073282 to pool.
?
2. Spring整合Ibatis
通过上面的配置测试成功,证明ibatis能独立测试成功!
A. Spring配置如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans><!-- 配置数据源,这里配置在Spring中,就不需要在ibatis中配置数据源了 --><bean id="dataSource"/></property></bean><!-- 与hibernate相似,如果需要建立DAO层,传入链接数据源+ibatis特有的sqlMapClient,而在DAO中要继承类SqlMapClientDaoSupport,hibernate中是HibernateDaoSupport --><bean id="userDao" /></property><property name="sqlMapClient"><ref local="sqlMapClient" /></property></bean><!-- userDaoProxy为一个userDao的形式,中间加入事务的支持,在action中UserDaoInterface userDao = (UserDaoInterface) springContex.getBean("userDaoProxy"); --><bean id="userDaoProxy"/></property><property name="target"><ref local="userDao" /></property><property name="transactionAttributes"><props><prop key="insert*">PROPAGATION_REQUIRED</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean></beans>
?
B. SqlMapConfig_spring.xml只需配置:(与上面1.C中的配置文件做比较)
<?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><!-- List the SQL Map XML files. They can be loaded from the classpath, as they are here (com.domain.data...) --><sqlMap resource="cn/edu/zju/jjh/entity/Users.xml" /><!-- List more here... <sqlMap resource="com/mydomain/data/Order.xml"/><sqlMap resource="com/mydomain/data/Documents.xml"/>--></sqlMapConfig>
?C. Spring+ibatis集成测试代码
package cn.edu.zju.jjh;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.edu.zju.jjh.dao.UserDaoInterface;import cn.edu.zju.jjh.entity.User;public class SpringTest {public static void main(String arg[]){ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");UserDaoInterface userDao = (UserDaoInterface) ac.getBean("userDaoProxy");try {User user = new User();user.setId("20001");user.setName("greatwqs");user.setPassword("GreatPassword");user.setDescription("Email: greatwqs@126.com");userDao.insertUser(user);} catch (Exception e) {e.printStackTrace();}}}
?
?
成功测试:
INFO-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7: display name [org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7]; startup date [Fri Dec 02 18:27:03 CST 2011]; root of context hierarchyDEBUG-Class [org.apache.commons.collections.map.CaseInsensitiveMap] or one of its dependencies is not present: java.lang.ClassNotFoundException: org.apache.commons.collections.map.CaseInsensitiveMapDEBUG-Class [edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap] or one of its dependencies is not present: java.lang.ClassNotFoundException: edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap INFO-Loading XML bean definitions from class path resource [applicationContext.xml]DEBUG-Using JAXP provider [com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl]DEBUG-Found beans DTD [http://www.springframework.org/dtd/spring-beans.dtd] in classpath: spring-beans.dtdDEBUG-Loading bean definitionsDEBUG-Loaded 5 bean definitions from location pattern [applicationContext.xml] INFO-Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7]: org.springframework.beans.factory.support.DefaultListableBeanFactory@ecd7eDEBUG-5 beans defined in org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7: display name [org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7]; startup date [Fri Dec 02 18:27:03 CST 2011]; root of context hierarchyDEBUG-Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@8b819f]DEBUG-Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@789144] INFO-Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@ecd7e: defining beans [dataSource,sqlMapClient,transactionManager,userDao,userDaoProxy]; root of factory hierarchyDEBUG-Creating shared instance of singleton bean 'dataSource'DEBUG-Creating instance of bean 'dataSource'DEBUG-Eagerly caching bean 'dataSource' to allow for resolving potential circular referencesDEBUG-Finished creating instance of bean 'dataSource'DEBUG-Creating shared instance of singleton bean 'sqlMapClient'DEBUG-Creating instance of bean 'sqlMapClient'DEBUG-Eagerly caching bean 'sqlMapClient' to allow for resolving potential circular referencesDEBUG-Invoking afterPropertiesSet() on bean with name 'sqlMapClient'DEBUG-Finished creating instance of bean 'sqlMapClient'DEBUG-Creating shared instance of singleton bean 'transactionManager'DEBUG-Creating instance of bean 'transactionManager'DEBUG-Eagerly caching bean 'transactionManager' to allow for resolving potential circular referencesDEBUG-Returning cached instance of singleton bean 'dataSource'DEBUG-Invoking afterPropertiesSet() on bean with name 'transactionManager'DEBUG-Finished creating instance of bean 'transactionManager'DEBUG-Creating shared instance of singleton bean 'userDao'DEBUG-Creating instance of bean 'userDao'DEBUG-Eagerly caching bean 'userDao' to allow for resolving potential circular referencesDEBUG-Returning cached instance of singleton bean 'dataSource'DEBUG-Returning cached instance of singleton bean 'sqlMapClient'DEBUG-Invoking afterPropertiesSet() on bean with name 'userDao'DEBUG-Finished creating instance of bean 'userDao'DEBUG-Creating shared instance of singleton bean 'userDaoProxy'DEBUG-Creating instance of bean 'userDaoProxy'DEBUG-Eagerly caching bean 'userDaoProxy' to allow for resolving potential circular referencesDEBUG-Returning cached instance of singleton bean 'transactionManager'DEBUG-Returning cached instance of singleton bean 'userDao'DEBUG-Adding transactional method [insert*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT]DEBUG-Adding transactional method [get*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly]DEBUG-Invoking afterPropertiesSet() on bean with name 'userDaoProxy'DEBUG-Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [cn.edu.zju.jjh.dao.UserDaoImpl@12cc95d]DEBUG-Finished creating instance of bean 'userDaoProxy'DEBUG-Publishing event in context [org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7]: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7: display name [org.springframework.context.support.ClassPathXmlApplicationContext@10dd1f7]; startup date [Fri Dec 02 18:27:03 CST 2011]; root of context hierarchy]DEBUG-Returning cached instance of singleton bean 'userDaoProxy'DEBUG-Using transaction object [org.springframework.jdbc.datasource.DataSourceTransactionManager$DataSourceTransactionObject@15fadcf]DEBUG-Creating new transaction with name [cn.edu.zju.jjh.dao.UserDaoInterface.insertUser]: PROPAGATION_REQUIRED,ISOLATION_DEFAULTDEBUG-Acquired Connection [jdbc:mysql://localhost:3306/ibatistest, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transactionDEBUG-Switching JDBC Connection [jdbc:mysql://localhost:3306/ibatistest, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commitDEBUG-Bound value [org.springframework.jdbc.datasource.ConnectionHolder@f4f44a] for key [org.apache.commons.dbcp.BasicDataSource@b23210] to thread [main]DEBUG-Initializing transaction synchronizationDEBUG-Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@1ec8909] for iBATIS operationDEBUG-Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@f4f44a] for key [org.apache.commons.dbcp.BasicDataSource@b23210] bound to thread [main]DEBUG-{conn-100000} ConnectionDEBUG-Obtained JDBC Connection [jdbc:mysql://localhost:3306/ibatistest, UserName=root@localhost, MySQL-AB JDBC Driver] for iBATIS operationDEBUG-{conn-100000} Preparing Statement: insert into Users (id,name, password,description) values ( ?, ?, ?, ?) DEBUG-{pstm-100001} Executing Statement: insert into Users (id,name, password,description) values ( ?, ?, ?, ?) DEBUG-{pstm-100001} Parameters: [20001, greatwqs, GreatPassword, Email: greatwqs@126.com]DEBUG-{pstm-100001} Types: [java.lang.String, java.lang.String, java.lang.String, java.lang.String]DEBUG-Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@f4f44a] for key [org.apache.commons.dbcp.BasicDataSource@b23210] bound to thread [main]DEBUG-Triggering beforeCommit synchronizationDEBUG-Triggering beforeCompletion synchronizationDEBUG-Initiating transaction commitDEBUG-Committing JDBC transaction on Connection [jdbc:mysql://localhost:3306/ibatistest, UserName=root@localhost, MySQL-AB JDBC Driver]DEBUG-Triggering afterCommit synchronizationDEBUG-Triggering afterCompletion synchronizationDEBUG-Clearing transaction synchronizationDEBUG-Removed value [org.springframework.jdbc.datasource.ConnectionHolder@f4f44a] for key [org.apache.commons.dbcp.BasicDataSource@b23210] from thread [main]DEBUG-Releasing JDBC Connection [jdbc:mysql://localhost:3306/ibatistest, UserName=root@localhost, MySQL-AB JDBC Driver] after transactionDEBUG-Returning JDBC Connection to DataSource
?
classpath:
?
<?xml version="1.0" encoding="UTF-8"?><classpath><classpathentry kind="src" path="src"/><classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING25_CORE"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING25_AOP"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING25_PERSISTENCE_CORE"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING25_PERSISTENCE_IBATIS"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING25_PERSISTENCE_JDBC"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING25_PERSISTENCE_JDO"/><classpathentry kind="lib" path="lib/ibatis-common-2.jar"/><classpathentry kind="lib" path="lib/ibatis-dao-2.jar"/><classpathentry kind="lib" path="lib/ibatis-sqlmap-2.jar"/><classpathentry kind="lib" path="lib/log4j-1.2.9.jar"/><classpathentry kind="lib" path="lib/mysql-connector-java-3.1.12-bin.jar"/><classpathentry kind="var" path="MYECLIPSE_SPRING_DATA_HOME/1.2/lib/spring-aop.jar"/><classpathentry kind="output" path="bin"/></classpath>
?
两个测试程序在一起.
附上源码+lib+建表SQL:
?