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




下面是本人的目录结构图

 


结束语:此文没有过多的讲些原理性的问题,比如为何这样写,又为何这样配置,只是给出了一个搭建框架的架子而已。

        因为我也是一个菜鸟,至于如何,我想,等我们有经验了,会慢慢都懂得。

        还希望大家共同努力,实现自己的梦想。

        希望能与各位共勉!

 

 

posted on 2011-11-06 16:09  itmyhome  阅读(134)  评论(0编辑  收藏  举报

导航