zoukankan      html  css  js  c++  java
  • ibatisSpring 整合

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




    下面是本人的目录结构图


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

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

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

            希望能与各位共勉!

     

  • 相关阅读:
    行列式学习笔记
    二项式反演学习笔记
    【AtCoder】ARC096(C
    【LOJ】#2127. 「HAOI2015」按位或
    [ACM] POJ 1218 THE DRUNK JAILER (关灯问题)
    lua的弱弱引用表
    西班牙式软件团队
    【DRP】採用dom4j完毕XML文件导入数据库
    基于Linux平台病毒Wirenet.c解析
    【剑指offer】异或去重
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131615.html
Copyright © 2011-2022 走看看