ibatis-Spring 整合
这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受吧。呵呵,废话就不多说了。
在此先引用几句别人的资料。。。
Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。
与hibernate类似,Spring提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。
通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的。此篇文章没有进行事务处理。
本文采用ibatis+spring+mysql 进行编写
数据库脚本如下
create database ibatis; create table person( id int primary key, name varchar(10), sex int );
一:要有一个PO类
Person.java
package po; import java.io.Serializable; public class Person implements Serializable{ /** * */ private static final long serialVersionUID = -517413165963030507L; /** * */ private int id; private String name; private int sex; public Person(){ } public Person(int id,String name,int sex){ this.id = id; this.name = name; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } }
二:DAO接口类
IAction.java
package dao; import java.util.List; import po.Person; public interface IAction { public boolean insertPerson(Person person); //添加 public boolean deleteById(int id); //删除 public boolean updatePerson(Person person); //修改 public Person queryById(int id); //根据ID查询 public List<Person> queryAllPerson(); //查询全部 }
三:DAO实现类
ActionImpl.java 此类继承SqlMapClientSupport 实现IAction接口
package dao.impl; import java.io.IOException; import java.io.Reader; import java.sql.SQLException; import java.util.List; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; import com.ibatis.sqlmap.client.SqlMapSession; import po.Person; import dao.IAction; public class ActionImpl extends SqlMapClientDaoSupport implements IAction { //添加操作 @Override public boolean insertPerson(Person person) { // TODO Auto-generated method stub getSqlMapClientTemplate().insert("insertPerson",person); return false; } //删除操作 @Override public boolean deleteById(int id) { // TODO Auto-generated method stub getSqlMapClientTemplate().delete("deleteById", id); return false; } //查询全部 @Override public List<Person> queryAllPerson() { // TODO Auto-generated method stub List<Person> persons = getSqlMapClientTemplate().queryForList("queryAllPerson"); return persons; } @Override public Person queryById(int id) { // TODO Auto-generated method stub //自己添加实现代码 return null; } @Override public boolean updatePerson(Person person) { // TODO Auto-generated method stub //自己添加实现代码 return false; } }
四:既然是ibatis spring整合 那就必须要有ibatis的配置文件
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <!--此处一定不能有<settings/> 标签--> <!-- <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> --> <sqlMap resource="po/Person.xml" /> </sqlMapConfig>
SqlMapClient.xml里本应该有数据源的配置的 使用spring之后数据源的配置移植到了spring上
五:Person.xml
里面配置了一下对数据的增删改查操作
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap> <typeAlias alias="person" type="po.Person" /> <insert id="insertPerson" parameterClass="po.Person"> <![CDATA[ insert into person values (#id#,#name#,#sex#) ]]> </insert> <delete id="deleteById" parameterClass="int"> <![CDATA[ delete from person where id=#id# ]]> </delete> <update id="updatePerson" parameterClass="po.Person"> <![CDATA[ update person set name=#name#,sex=#sex# where id=#id# ]]> </update> <select id="queryById" parameterClass="int" resultClass="po.Person"> <![CDATA[ select * from person where id=#id# ]]> </select> <select id="queryAllPerson" cacheModel="personCache" resultClass="po.Person"> <![CDATA[ select * from person ]]> </select> </sqlMap>
六:下面最重要的也就是配置applicationContext.xml了
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/ibatis" /> <property name="username" value="root" /> <property name="password" value="1" /> </bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"> <!-- name 为configLocation或s 不可为其他 --> <value>SqlMapConfig.xml</value> <!-- 不区分大小写,路径前可加'/' --> </property> <!-- dataSource不是必需 --> <property name="dataSource"> <ref local="dataSource" /> </property> </bean> <bean id="personDAO" class="dao.impl.ActionImpl"> <!-- dataSource不是必需 --> <property name="dataSource"> <ref local="dataSource" /> </property> <!-- sqlMapClient必需 --> <property name="sqlMapClient"> <ref local="sqlMapClient"/> </property> </bean> <!-- transactionManager不是必需 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="dataSource" /> </property> </bean> </beans>
注释里面的必需或不是必需都是本人多次试验的,至于为什么是必需不必需 其中的原理我也不是能太讲清楚,在此先是这些写罢了。
里面的每一个节点,属性,如果不太理解,可以上网查一些其他资料。
七:编写测试类
此类利用junit进行测试。只测试了部分功能。
package dao.impl; import java.util.Iterator; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import po.Person; public class ActionImplTest { private static ApplicationContext applicationContext = null; //提供静态ApplicationContext static{ applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //实例化 } //添加操作 @Test public void testInsertPerson(){ ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO"); s.insertPerson(new Person(1,"zhangsan",2)); } //删除操作 @Test public void testDeletePerson(){ ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO"); s.deleteById(1); } //查询全部 @Test public void testQueryAllPerson(){ ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO"); List<Person> persons = s.queryAllPerson(); //System.out.println(persons.size()); Iterator<Person> ite = persons.iterator(); while(ite.hasNext()){ Person person = ite.next(); System.out.print("ID: "+person.getId()); System.out.print(" Name: "+person.getName()); System.out.print(" Sex: "+person.getSex()); System.out.println(); } } }
八:如需记录日志 则要log4j.properties
#log4j.rootLogger=DEBUG, stdout
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
#log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.rootLogger=DEBUG, stdout, fileout
#log4j.logger.test=info
#log4j.logger.org.apache.jasper = DEBUG
#log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG
#log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG
log4j.logger.com.fiscal = DEBUG
log4j.logger.com.system = DEBUG
log4j.logger.com.ibatis = DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG, fileout
log4j.logger.java.sql.ResultSet = DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=C\:\\ibatis.log
log4j.appender.fileout.MaxFileSize=10000KB
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
#log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
# log4j.logger.org=info
九:已经到最后了,我觉得这最后的才是最最重要的,就是一下jar包问题
我调试了很长时间 一大部分时间是jar问题
在此列出一下我认为能够跑起来这个小程序所需的一下jar包
如没有,可网上下载。
ibaits-2.3.4.jar
spring.jar
mysql-connector-java-bin.jar
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
spring-orm-2.5.6.jar //已集成到spring.jar里
//记录日志所需
log4j-1.2.15.jar
commons-logging.jar
下面是本人的目录结构图
结束语:此文没有过多的讲些原理性的问题,比如为何这样写,又为何这样配置,只是给出了一个搭建框架的架子而已。