这两天一直在研究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

01
package po;  
02
   
03
import java.io.Serializable;  
04
   
05
public class Person implements Serializable{  
06
    /** 
07
     *  
08
     */ 
09
    private static final long serialVersionUID = -517413165963030507L;  
10
    /** 
11
     *  
12
     */ 
13
    private int id;  
14
    private String name;  
15
    private int sex;  
16
       
17
    public Person(){  
18
           
19
    }  
20
    public Person(int id,String name,int sex){  
21
        this.id = id;  
22
        this.name = name;  
23
        this.sex = sex;  
24
    }  
25
    public int getId() {  
26
        return id;  
27
    }  
28
    public void setId(int id) {  
29
        this.id = id;  
30
    }  
31
    public String getName() {  
32
        return name;  
33
    }  
34
    public void setName(String name) {  
35
        this.name = name;  
36
    }  
37
    public int getSex() {  
38
        return sex;  
39
    }  
40
    public void setSex(int sex) {  
41
        this.sex = sex;  
42
    }  
43
       
44
}


二:DAO接口类

    IAction.java

01
package dao;  
02
   
03
import java.util.List;  
04
   
05
import po.Person;  
06
   
07
public interface IAction {  
08
    public boolean insertPerson(Person person);   //添加   
09
    public boolean deleteById(int id);            //删除   
10
    public boolean updatePerson(Person person);    //修改   
11
    public Person queryById(int id);              //根据ID查询   
12
    public List<Person> queryAllPerson();         //查询全部   
13
}
 

 

 

 

 

三:DAO实现类
   

   ActionImpl.java 此类继承SqlMapClientSupport 实现IAction接口

01
package dao.impl;  
02
   
03
import java.io.IOException;  
04
import java.io.Reader;  
05
import java.sql.SQLException;  
06
import java.util.List;  
07
   
08
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;  
09
   
10
import com.ibatis.common.resources.Resources;  
11
import com.ibatis.sqlmap.client.SqlMapClient;  
12
import com.ibatis.sqlmap.client.SqlMapClientBuilder;  
13
import com.ibatis.sqlmap.client.SqlMapSession;  
14
   
15
import po.Person;  
16
import dao.IAction;  
17
   
18
public class ActionImpl extends SqlMapClientDaoSupport implements IAction {  
19
   
20
    //添加操作   
21
    @Override 
22
    public boolean insertPerson(Person person) {  
23
        // TODO Auto-generated method stub   
24
        getSqlMapClientTemplate().insert("insertPerson",person);  
25
        return false;  
26
    }  
27
       
28
    //删除操作   
29
    @Override 
30
    public boolean deleteById(int id) {  
31
        // TODO Auto-generated method stub   
32
        getSqlMapClientTemplate().delete("deleteById", id);  
33
        return false;  
34
    }  
35
   
36
       
37
   
38
    //查询全部   
39
    @Override 
40
    public List<Person> queryAllPerson() {  
41
        // TODO Auto-generated method stub   
42
        List<Person> persons = getSqlMapClientTemplate().queryForList("queryAllPerson");  
43
        return persons;  
44
    }  
45
   
46
    @Override 
47
    public Person queryById(int id) {  
48
        // TODO Auto-generated method stub  
49
 
50
 
51
                    //自己添加实现代码   
52
    return null;  
53
}  
54
   
55
@Override 
56
public boolean updatePerson(Person person) {  
57
    // TODO Auto-generated method stub  
58
 
59
 
60
                    //自己添加实现代码   
61
    return false;  
62
}  

四:既然是ibatis spring整合 那就必须要有ibatis的配置文件

 

  SqlMapConfig.xml

01
<?xml version="1.0" encoding="UTF-8" ?>  
02
<!DOCTYPE sqlMapConfig  
03
    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"  
04
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">   
05
    <sqlMapConfig>
06
<!--此处一定不能有<settings/> 标签--> 
07
    <!--  <settings   cacheModelsEnabled="true"  
08
                 enhancementEnabled="true"  
09
                 lazyLoadingEnabled="true"  
10
                 errorTracingEnabled="true"   
11
                 maxRequests="32"  
12
                 maxSessions="10"  
13
                 maxTransactions="5"  
14
                 useStatementNamespaces="false" />  --> 
15
           
16
    <sqlMap resource="po/Person.xml" />  
17
       
18
</sqlMapConfig>


SqlMapClient.xml里本应该有数据源的配置的 使用spring之后数据源的配置移植到了spring上

 

五:Person.xml

   里面配置了一下对数据的增删改查操作

01
<?xml version="1.0" encoding="UTF-8" ?>  
02
<!DOCTYPE sqlMapConfig  
03
    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"  
04
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">   
05
    <sqlMapConfig>
06
<!--此处一定不能有<settings/> 标签--> 
07
    <!--  <settings   cacheModelsEnabled="true"  
08
                 enhancementEnabled="true"  
09
                 lazyLoadingEnabled="true"  
10
                 errorTracingEnabled="true"   
11
                 maxRequests="32"  
12
                 maxSessions="10"  
13
                 maxTransactions="5"  
14
                 useStatementNamespaces="false" />  --> 
15
           
16
    <sqlMap resource="po/Person.xml" />  
17
       
18
</sqlMapConfig>


 

六:下面最重要的也就是配置applicationContext.xml了

 

01
 <?xml version="1.0" encoding="UTF-8"?>  
 
   
02
 <beans xmlns="http://www.springframework.org/schema/beans" 
 
   
03
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
 
   
04
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
 
   
05
  
 
   
06
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
 
   
07
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
 
   
08
 <property name="url" value="jdbc:mysql://localhost:3306/ibatis" />  
 
   
09
 <property name="username" value="root" />  
 
   
10
 <property name="password" value="1" />  
 
   
11
 </bean>  
 
   
12
  
 
   
13
 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
 
   
14
 <property name="configLocation">  <!-- name 为configLocation或s  不可为其他 --> 
 
   
15
 <value>SqlMapConfig.xml</value> <!-- 不区分大小写,路径前可加'/' --> 
 
   
16
 </property>  
 
   
17
  
 
   
18
 <!-- dataSource不是必需 --> 
 
   
19
 <property name="dataSource">  
 
   
20
 <ref local="dataSource" />  
 
   
21
 </property>  
 
   
22
 </bean>  
 
   
23
  
 
   
24
 <bean id="personDAO" class="dao.impl.ActionImpl">  
 
   
25
 <!-- dataSource不是必需 --> 
 
   
26
 <property name="dataSource">  
 
   
27
 <ref local="dataSource" />  
 
   
28
 </property>  
 
   
29
  
 
   
30
 <!-- sqlMapClient必需 --> 
 
   
31
 <property name="sqlMapClient">  
 
   
32
 <ref local="sqlMapClient"/>  
 
   
33
 </property>     
 
   
34
 </bean>  
 
   
35
  
 
   
36
 <!-- transactionManager不是必需  --> 
 
   
37
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
 
   
38
 <property name="dataSource">  
 
   
39
 <ref local="dataSource" />  
 
   
40
 </property>  
 
   
41
 </bean>  
 
   
42
 </beans>

 

注释里面的必需或不是必需都是本人多次试验的,至于为什么是必需不必需 其中的原理我也不是能太讲清楚,在此先是这些写罢了。

 

里面的每一个节点,属性,如果不太理解,可以上网查一些其他资料。

 

七:编写测试类

   此类利用junit进行测试。只测试了部分功能。

01
 package dao.impl;  
 
   
02
  
 
   
03
 import java.util.Iterator;  
 
   
04
 import java.util.List;  
 
   
05
  
 
   
06
 import org.junit.Test;  
 
   
07
 import org.springframework.context.ApplicationContext;  
 
   
08
 import org.springframework.context.support.ClassPathXmlApplicationContext;  
 
   
09
  
 
   
10
 import po.Person;  
 
   
11
  
 
   
12
  
 
   
13
 public class ActionImplTest {  
 
   
14
 private static ApplicationContext applicationContext = null;   //提供静态ApplicationContext  
 
   
15
 static{  
 
   
16
 applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //实例化  
 
   
17
 }  
 
   
18
 //添加操作  
 
   
19
 @Test 
 
   
20
 public void testInsertPerson(){  
 
   
21
 ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");  
 
   
22
 s.insertPerson(new Person(1,"zhangsan",2));  
 
   
23
 }  
 
   
24
  
 
   
25
 //删除操作  
 
   
26
 @Test 
 
   
27
 public void testDeletePerson(){  
 
   
28
 ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");  
 
   
29
 s.deleteById(1);  
 
   
30
 }  
 
   
31
  
 
   
32
 //查询全部  
 
   
33
 @Test 
 
   
34
 public void testQueryAllPerson(){  
 
   
35
 ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");  
 
   
36
 List<Person> persons = s.queryAllPerson();  
 
   
37
 //System.out.println(persons.size());  
 
   
38
 Iterator<Person> ite = persons.iterator();  
 
   
39
 while(ite.hasNext()){  
 
   
40
 Person person = ite.next();  
 
   
41
 System.out.print("ID: "+person.getId());  
 
   
42
 System.out.print(" Name: "+person.getName());  
 
   
43
 System.out.print(" Sex: "+person.getSex());  
 
   
44
 System.out.println();  
 
   
45
 }  
 
   
46
 }  
 
   
47
 }

八:如需记录日志 则要log4j.properties


01
 #log4j.rootLogger=DEBUG, stdout  
 
   
02
 #log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
 
   
03
 #log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
 
   
04
 #log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n  
 
   
05
 #log4j.logger.java.sql.PreparedStatement=DEBUG  
 
   
06
 log4j.rootLogger=DEBUG, stdout, fileout      
 
   
07
 #log4j.logger.test=info     
 
   
08
 #log4j.logger.org.apache.jasper = DEBUG     
 
   
09
 #log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG     
 
   
10
 #log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG     
 
   
11
  
 
   
12
 log4j.logger.com.fiscal = DEBUG     
 
   
13
 log4j.logger.com.system = DEBUG     
 
   
14
  
 
   
15
 log4j.logger.com.ibatis = DEBUG     
 
   
16
 log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG     
 
   
17
 log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG     
 
   
18
 log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG     
 
   
19
 log4j.logger.java.sql.Connection = DEBUG     
 
   
20
 log4j.logger.java.sql.Statement = DEBUG     
 
   
21
 log4j.logger.java.sql.PreparedStatement = DEBUG, fileout      
 
   
22
 log4j.logger.java.sql.ResultSet = DEBUG     
 
   
23
  
 
   
24
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender       
 
   
25
  
 
   
26
 log4j.appender.fileout=org.apache.log4j.RollingFileAppender      
 
   
27
 log4j.appender.fileout.File=C\:\\ibatis.log       
 
   
28
 log4j.appender.fileout.MaxFileSize=10000KB       
 
   
29
  
 
   
30
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout       
 
   
31
 log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n       
 
   
32
 log4j.appender.fileout.layout=org.apache.log4j.PatternLayout       
 
   
33
 log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n      
 
   
34
  
 
   
35
 #log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout       
 
   
36
  
 
   
37
 # log4j.logger.org=info

 

九:已经到最后了,我觉得这最后的才是最最重要的,就是一下jar包问题

   我调试了很长时间  一大部分时间是jar问题

   在此列出一下我认为能够跑起来这个小程序所需的一下jar包

   如没有,可网上下载。

  1. ibaits-2.3.4.jar  
  2. spring.jar  
  3. mysql-connector-java-bin.jar  
  4. commons-dbcp-1.4.jar  
  5. commons-pool-1.5.6.jar  
  6. spring-orm-2.5.6.jar //已集成到spring.jar里  
  7. //记录日志所需  
  8.  log4j-1.2.15.jar  
  9. commons-logging.jar 


下面是本人的目录结构图


spring框架整合ibatis的项目实例代码_xml