Spring+Ibatis集成开发实例

首先简历数据库demo(本文选mysql)

数据库脚本:

 

CREATE   TABLE  `ibatis` (
  `id` 
varchar ( 20 NOT   NULL ,
  `name` 
varchar ( 20 default   NULL ,
  
PRIMARY   KEY   (`id`)
) ENGINE
= InnoDB  DEFAULT  CHARSET = gb2312;

insert   into  ibatis  values (" 1 "," 1 ");
insert   into  ibatis  values (" 2 "," 2 ");

 

DAO接口:

 

package  ch10.SpringAndIbatis;

import  java.util.List;

public   interface  IDAO  {
  
public List getList();
  
public Ibatis getByName(String name);
  
public Ibatis getById(String id);
  
public void save(Ibatis ibatis);
  
public void delete(String id);
  
public void update(Ibatis ibatis);
}

 

Ibatis配置文件:

 

<? 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 >  

< sqlMap  resource ="ch10/SpringAndIbatis/Ibatis.xml"   />  

</ sqlMapConfig >

 

ibatis sql map文件ibatis.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  >
  
< typeAlias  type ="ch10.SpringAndIbatis.Ibatis"  alias ="user" />
  
< resultMap  id ="ibatisTest"  class ="user"   >
    
< result  column ="id"  property ="id"  jdbcType ="VARCHAR"   />
    
< result  column ="name"  property ="name"  jdbcType ="VARCHAR"   />
  
</ resultMap >
  
  
<!--  获得全查询列表  -->
  
< select  id ="getAllUsers"  resultMap ="ibatisTest" >
    select * from Ibatis
  
</ select >
  
   
<!--  根据用户名获得用户对象  -->
   
< select  id ="getUsersByName"  resultMap ="ibatisTest" >
     select * from Ibatis where name=#value#
  
</ select >  
  
  
<!--  根据id获得用户对象  -->
    
< select  id ="getUsersById"  resultMap ="ibatisTest" >
     select * from Ibatis where id=#value#
  
</ select >  
  
   
<!--  新增用户对象  -->
   
< insert  id ="insertUsers"  parameterClass ="user" >
      insert into ibatis (id,name) values (#id#,#name#)
   
</ insert >
   
   
<!--  删除用户对象  -->
   
< delete  id ="deleteUsers" >
     delete from ibatis where id=#value#
   
</ delete >
   
   
<!--  更新用户对象  -->
   
< delete  id ="updateUsers"  parameterClass ="user" >
      update ibatis set name=#name# where id=#id#
   
</ delete >
</ sqlMap >

spring配置文件

 

<? xml version="1.0" encoding="UTF-8" ?>
< beans
    
xmlns ="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >


< bean  id ="dataSource"  class ="org.apache.commons.dbcp.BasicDataSource" >
  
< property  name ="driverClassName" >
    
< value > com.mysql.jdbc.Driver </ value >
  
</ property >
  
< property  name ="username" >
    
< value > root </ value >
  
</ property >
  
< property  name ="password" >
    
< value > 1234 </ value >
  
</ property >
  
< property  name ="url" >
    
< value > jdbc:mysql://localhost:3306/spring </ value >
  
</ property >
</ bean >

< bean  id ="sqlMapClient"  class ="org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
  
<!--  此处应注入ibatis配置文件,而非sqlMap文件,否则会出现“there is no statement.....异常”  -->
  
< property  name ="configLocation" >
     
< value > ch10/SpringAndIbatis/sqlMapConfig.xml </ value >
  
</ property >

</ bean >

< bean  id ="testDAO"  class ="ch10.SpringAndIbatis.TestDAO" >
   
< property  name ="dataSource" >
   
< ref  bean ="dataSource" />
 
</ property >
  
< property  name ="sqlMapClient" >
    
< ref  bean ="sqlMapClient" />
  
</ property >
</ bean >

</ beans >

DAO实现类:

 

package  ch10.SpringAndIbatis;

import  java.util.List;

import  org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public   class  TestDAO  extends  SqlMapClientDaoSupport  implements  IDAO  {

    
public void delete(String id) {
        getSqlMapClientTemplate().delete(
"deleteUsers", id);
    }


    
public Ibatis getById(String id) {
        
return (Ibatis)getSqlMapClientTemplate().queryForObject("getUsersById",id);
    }


    
public Ibatis getByName(String name) {
        
        
return (Ibatis)getSqlMapClientTemplate().queryForObject("getUsersByName",name);
    }


    
public List getList() {
        
return getSqlMapClientTemplate().queryForList("getAllUsers",null);
    }


    
public void save(Ibatis ibatis) {
        getSqlMapClientTemplate().insert(
"insertUsers",ibatis);
    }


    
public void update(Ibatis ibatis) {
        getSqlMapClientTemplate().update(
"updateUsers", ibatis);
    }


}

domain对象

 

package  ch10.SpringAndIbatis;

public   class  Ibatis  {
  

private String id;
   
private String name;
   
public String getId() {
        
return id;
   }

   
public void setId(String id) {
        
this.id = id;
   }

   
public String getName() {
        
return name;
   }

   
public void setName(String name) {
        
this.name = name;
   }

   
public Ibatis(){
       
   }

public Ibatis(String id, String name) {
    
super();
    
this.id = id;
    
this.name = name;
}

}

 

 

测试代码:

 

 

package  ch10.SpringAndIbatis;

import  java.util.ArrayList;
import  java.util.Iterator;
import  java.util.List;

import  org.springframework.context.ApplicationContext;
import  org.springframework.context.support.ClassPathXmlApplicationContext;

public   class  Test  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        ApplicationContext context
=new ClassPathXmlApplicationContext("ch10/SpringAndIbatis/applicationContext.xml");
        TestDAO testDAOImpl
=(TestDAO)context.getBean("testDAO");

        
//获得全查询列表
        System.out.println("获得全查询列表");
        List result
=new ArrayList();
        result
=testDAOImpl.getList();
        
for (Iterator iter = result.iterator(); iter.hasNext();) {
            Ibatis element 
= (Ibatis) iter.next();
            System.out.println(element.getName());

        }
    
        
       
//根据用户名获得用户对象
        System.out.println("根据用户名获得用户对象");
        Ibatis ibatis
=testDAOImpl.getByName("1");
        System.out.println(ibatis.getName());
        
       
//根据id获得用户对象
        System.out.println("根据id获得用户对象");
        Ibatis ibatis1
=testDAOImpl.getById("1");
        System.out.println(ibatis.getName());
        
       
//新增用户对象
        System.out.println("-----------------");
        System.out.println(
"新增用户对象前");
        List result1
=new ArrayList();
        result1
=testDAOImpl.getList();
        
for (Iterator iter = result1.iterator(); iter.hasNext();) {
            Ibatis element 
= (Ibatis) iter.next();
            System.out.println(element.getName());

        }
    
        testDAOImpl.save(
new Ibatis("3","3")); //新增用户
        System.out.println("新增用户对象后");
        List result2
=new ArrayList();
        result2
=testDAOImpl.getList();
        
for (Iterator iter = result2.iterator(); iter.hasNext();) {
            Ibatis element 
= (Ibatis) iter.next();
            System.out.println(element.getName());
        }
    
        System.out.println(
"-----------------");
        
        
//删除用户对象
        System.out.println("-----------------");
        System.out.println(
"删除用户对象前");
        List result3
=new ArrayList();
        result3
=testDAOImpl.getList();
        
for (Iterator iter = result3.iterator(); iter.hasNext();) {
            Ibatis element 
= (Ibatis) iter.next();
            System.out.println(element.getName());

        }
    
        testDAOImpl.delete(
"3"); //删除用户
        System.out.println("删除用户对象后");
        List result4
=new ArrayList();
        result4
=testDAOImpl.getList();
        
for (Iterator iter = result4.iterator(); iter.hasNext();) {
            Ibatis element 
= (Ibatis) iter.next();
            System.out.println(element.getName());
        }
    
        System.out.println(
"-----------------");
        
        
        
//更新用户对象
        System.out.println("-----------------");
        System.out.println(
"更新用户对象前");
        List result5
=new ArrayList();
        result5
=testDAOImpl.getList();
        
for (Iterator iter = result5.iterator(); iter.hasNext();) {
            Ibatis element 
= (Ibatis) iter.next();
            System.out.println(element.getName());

        }
    
        
        Ibatis ibatis3
=testDAOImpl.getById("1");
        ibatis3.setName(
"new1");
        testDAOImpl.update(ibatis3);
//更新用户对象
        
        
        System.out.println(
"更新用户对象后");
        List result6
=new ArrayList();
        result6
=testDAOImpl.getList();
        
for (Iterator iter = result6.iterator(); iter.hasNext();) {
            Ibatis element 
= (Ibatis) iter.next();
            System.out.println(element.getName());
        }
    
        System.out.println(
"-----------------");
        
     }


}

 

测试结果:

获得全查询列表
1
2
根据用户名获得用户对象
1
根据id获得用户对象
1
-----------------
新增用户对象前
1
2
新增用户对象后
1
2
3
-----------------
-----------------
删除用户对象前
1
2
3
删除用户对象后
1
2
-----------------
-----------------
更新用户对象前
1
2
更新用户对象后
new1
2
-----------------------------------------------------------------------------

Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。

与hibernate类似,Spring提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。

通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的。此篇文章没有进行事务处理。

本文采用ibatis+spring+mysql 进行编写

数据库脚本如下

1 create database ibatis; 
2        
3 create table person( 
4       id int primary key
5       name varchar(10), 
6       sex int 
7 );

 

一:要有一个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" 
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 sqlMap 
03 PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" 
05 <sqlMap
06     <typeAlias alias="person" type="po.Person" /> 
07        
08     <insert id="insertPerson" parameterClass="po.Person"
09        <![CDATA[
10            insert into person values (#id#,#name#,#sex#)
11        ]]> 
12     </insert
13        
14     <delete id="deleteById" parameterClass="int"
15         <![CDATA[
16            delete from person where id=#id#
17         ]]> 
18     </delete
19        
20     <update id="updatePerson" parameterClass="po.Person"
21          <![CDATA[
22                update person set name=#name#,sex=#sex# where id=#id#
23          ]]> 
24     </update
25        
26     <select id="queryById" parameterClass="int" resultClass="po.Person"
27          <![CDATA[
28               select * from person where id=#id#
29          ]]> 
30     </select
31        
32     <select id="queryAllPerson" cacheModel="personCache" resultClass="po.Person"
33          <![CDATA[
34                select * from person
35          ]]> 
36     </select
37 </sqlMap>

 

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

01 <?xml version="1.0" encoding="UTF-8"?> 
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 




下面是本人的目录结构图

 










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值