`
lijingyao8206
  • 浏览: 219470 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

iBATIS&Spring合奏(一)--DAO

阅读更多
    iBATIS,大家都用的比喻就是什么半自动步枪之类的,没错。一个框架是做神马的相信靠谱点的程序猿们都会先去Google,然后看看官方文档之类的,再在网上找点代码copy下然后运行看看。随后需要深入研究了,需要性能优化了,再去深入研究和体会,牛者自己写个差不多的框架用起来还爽些。这合奏系列文章就是提供给刚刚接受iBATIS框架,想和Spring放在一起用的猿类们的。也是觉得过几阵子不用它自己也会不记得了,先写下来,以后用到的时候也会方便唤醒沉睡的记忆。
     1)iBATIS做ORM,还是很轻便且强大的,某些方面的性能方面比Hibernate好些啦。下面简单建两个数据库。如下图:


     当然,这里先不用外键,今天是第一步。等会会有两表连接的查询,存储过程下次介绍。然后就是POJO也就是domain模型,这里就不列举代码了。Order表中的user会联合User表的username做链接查询。先以user的操作为例。
     2)iBATIS的核心配置文件SqlMapConfig.xml如下:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
	
  <properties resource="sqlmap.properties"/>
	
  <transactionManager type="JDBC">
    <dataSource type="SIMPLE">
    
     <property name="JDBC.Driver"
			value="${jdbc.driverClassName}" />
		<property name="JDBC.ConnectionURL" value="${jdbc.url}" />
		<property name="JDBC.Username" value="${jdbc.username}" />
		<property name="JDBC.Password" value="${jdbc.password}" />
    </dataSource>
  </transactionManager>
	

  <sqlMap resource="com/qiyun/spritis/persistence/sqlmapdao/sql/User.xml"/>
  <sqlMap resource="com/qiyun/spritis/persistence/sqlmapdao/sql/Order.xml"/>
  <sqlMap resource="com/qiyun/spritis/persistence/sqlmapdao/sql/Dynamic.xml"/>

</sqlMapConfig>


       这里配置了数据源,属性值通过读取Properties文件获得。这里就不列举该文件了。涉及到了三个sqlMap标签中指明的资源配置文件。
        3)sqlMap配置文件。先看看User.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 namespace="User">
    <typeAlias alias="user" type="com.qiyun.spritis.pojo.User"/>

	<select id="getAllUsers" resultClass="user">
		select * from user order by id; 
	</select>

	<!--	内联映射->实体类	-->
	<select id="getUsersByCompanyName1" resultClass="user"
		parameterClass="string">
		select id as id, username as username, password as
		password, company as company from user where
		company=#company#
	</select>


	<!--	显示映射->MAP类	-->
	<resultMap id="mapResult" class="user">
		<result property="id" column="ID" />
		<result property="username" column="USERNAME" />
		<result property="password" column="PASSWORD" />
		<result property="company" column="COMPANY" />
	</resultMap>
	
	
	
	<select id="getUsersByCompanyName2" resultMap="mapResult" 
		parameterClass="string">
		select * from user where company=#company#
	</select>

	<!--XML	-->
	<select id="getUserToXMLByCompanyName" parameterClass="string" resultClass="xml"
		xmlResultName="MYUSER">
		select * from user where company=#company#
	</select>

	

	<!--	外联参数映射	-->	
	<parameterMap  id="parameterMapEx" class="user">
		<parameter property="username" jdbcType="VARCHAR"/>
		<parameter property="password" jdbcType="VARCHAR"/>
		<parameter property="company" jdbcType="VARCHAR"/>
	</parameterMap>
	
	<insert id="insertUser" parameterMap="parameterMapEx">
		INSERT INTO user 
		( 
			username, password, company
		)VALUES(
			?,?,? 
		)
	</insert>
	
	<update id="updateUser" parameterClass="user">
		update user
		set username=#username#,
		    password=#password#,
		    company=#company#
		where id=#id#
	</update>
	
	<delete id="deleteUser" parameterClass="int">
	  delete from user where id=#id#
	</delete>
	

	
	<cacheModel type="LRU" id="account-cache">
		<flushInterval hours="1"/>
		<flushOnExecute statement="insertOneUser2"/>
		<property name="size" value="1000"/>
	</cacheModel>
	
</sqlMap>

       一看就知道了很多的sql语句。参数类型,返回值类型都在CRUD相关标签中配置了。相信熟悉Hibernate的同学看这个应该很容易理解的。##中间夹着的不就是可爱的参数啦,参数,当然我们在后面看是如何传进来的。下面开始把Spring搞进来啦。
        4)Spring在此不介绍了,这里只简单用了Ioc,陆续会加上事务管理的融合再加上Aop的东东。当然也用到了Spring的中间层数据访问的DAO支持。先看beans.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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:sqlmap.properties</value>
		</property>
	</bean>
	
	<bean id="userDao" class="com.qiyun.spritis.persistence.sqlmapdao.impl.UserSqlMapDao">
		<property name="sqlMapClient" ref="mysqlMapClient"></property>
	</bean>

	<bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

	

	<bean id="mysqlMapClient"
		class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
	    <property name="configLocation" value="SqlMapConfig.xml" />
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
		abstract="false"  lazy-init="default" autowire="default"
		dependency-check="default">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>   
	</bean>   
	
	
</beans>

       5)DAO 接口的示例如下。只简单列举到User表的操作DAO。
package com.qiyun.spritis.persistence.sqlmapdao.interfaces;

import java.util.List;

import org.springframework.dao.DataAccessException;

import com.qiyun.spritis.pojo.User;


public interface UserDao {
   
	List<User> getAllUsers()throws DataAccessException;
	List<User> getUserByCompanyName(String compName) throws DataAccessException;
	void insertUser(User user) throws DataAccessException;
	void updateUser(User user) throws DataAccessException;
	void deleteUserById (int id) throws DataAccessException;
}


       6)DAO的实现类。这里用到了Spring的Templete方法,和HibernateTemplete差不多。如下先睹为快:
package com.qiyun.spritis.persistence.sqlmapdao.impl;

import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.qiyun.spritis.persistence.sqlmapdao.interfaces.UserDao;
import com.qiyun.spritis.pojo.User;

public class UserSqlMapDao extends  SqlMapClientDaoSupport implements UserDao {

	@Override
	public void deleteUserById(int id) throws DataAccessException {
		getSqlMapClientTemplate().delete("deleteUser", id);
	}

	
	@SuppressWarnings("unchecked")
	@Override
	public List<User> getAllUsers() throws DataAccessException {
		return (List<User>)getSqlMapClientTemplate().queryForList("getAllUsers");
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<User> getUserByCompanyName(String compName)
			throws DataAccessException {
		return (List<User>)getSqlMapClientTemplate().queryForList("getUsersByCompanyName2",compName);
	}

	@Override
	public void insertUser(User user) throws DataAccessException {
		getSqlMapClientTemplate().update("insertUser",user);
	}

	@Override
	public void updateUser(User user) throws DataAccessException {
		
		getSqlMapClientTemplate().update("updateUser",user);
	}

}

 
      到这里就差不多懂了吧,就是把User。xml配置文件中的id和所要传入的参数给getSqlMapClientTemplate方法去调用iBATIS来处理。Spring只是对iBATIS获取sqlMapClient这个核心类进行了轻量的封装。当然为了把AOP加进来,少不了Service层啦。
       7)Service层,用Spring容器来管理的Dao们要呼之欲出了。以后要加什么逻辑的话还可以进一步封装。UserService类如下:
package com.qiyun.spritis.service;

import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.qiyun.spritis.persistence.sqlmapdao.impl.UserSqlMapDao;
import com.qiyun.spritis.persistence.sqlmapdao.interfaces.UserDao;
import com.qiyun.spritis.pojo.User;


public class UserService {
	
	public List<User> getAllUsers() throws Exception {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		UserDao service = (UserSqlMapDao)ctx.getBean("userDao");
		List<User> list=(List<User>)service.getAllUsers();
		ctx.destroy();
		return list;
	}
	
	public List<User> getUserByCompanyName(String company)throws Exception {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		UserDao service = (UserSqlMapDao)ctx.getBean("userDao");
		List<User> list=(List<User>)service.getUserByCompanyName(company);
		ctx.destroy();
		return list;
	}
	
	public void insertUser(User user) throws Exception{
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		UserDao service = (UserSqlMapDao)ctx.getBean("userDao");
		System.out.println(service.getClass());
		service.insertUser(user);
		ctx.destroy();
	}
	
	public void deleteUser(int id)throws Exception{
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		UserDao service = (UserSqlMapDao)ctx.getBean("userDao");
		service.deleteUserById(id);
		ctx.destroy();
	}
	
	public void updateUser(User user)throws Exception{
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		UserDao service = (UserSqlMapDao)ctx.getBean("userDao");
		service.updateUser(user);
		ctx.destroy();
	}

}


       8)以上就不错做解释,下面开始测试啦。用JUnit来测一下吧,比较方便,用单元测试的好处,相信猿类们早有体会。UserServiceTest如下:
package com.qiyun.spritis.test;

import java.util.List;

import org.junit.Test;

import com.qiyun.spritis.pojo.User;
import com.qiyun.spritis.service.UserService;

public class UserServiceTest {
	
	@Test
	public void testGetAllUsers() throws Exception {
		UserService us=new UserService();
		List<User> li=us.getUserByCompanyName("TB");
		for(int i=0;i<li.size();i++){
			System.out.println(li.get(i).getId()+"||"+li.get(i).getUsername()+"||"+li.get(i).getPassword()+"||"+li.get(i).getCompany());
		}
		
		
		
	}
	
	@Test
	public void testInsertUser()throws Exception{
		UserService us=new UserService();
		us.insertUser(new User("LK","lk","TB"));
		List<User> li=us.getAllUsers();
		System.out.println("最新添加的员工:"+li.get(li.size()-1).getUsername());
	}
	
	@Test
	public void testDeleteUser()throws Exception{
		
		UserService us=new UserService();
		us.deleteUser(8);
	}
	
	@Test
	public void testUpdateUser()throws Exception{
		User u=new User();
		u.setId(new Integer(8));
		u.setUsername("LK");
		u.setPassword("lk");
		u.setCompany("IBM");
		UserService us=new UserService();
		us.updateUser(u);
	}
	

}


       到此。一个Spring和iBATIS的前奏总算演奏完了。当然很简单的一个示例。后面会陆续加上连接查询,动态SQL,以及一些Handler的介绍。等用熟了之后再深入其架构,一个好用的框架当然少不了好的设计模式。先到这里。源码奉上。如果运行中报错,希望同学们先Google一下,可能是缺jar包哦。项目压缩包:spritis(Spring+iBATIS)
  • 大小: 26.2 KB
3
0
分享到:
评论
1 楼 TTNecro 2010-12-05  
膜拜....

相关推荐

    iBATIS&Spring合奏(二)--Flex前端融合

    在“iBATIS&Spring合奏(二)--Flex前端融合”中,博主Yunshen0909分享了关于如何在Java Web应用中结合使用这两种技术,特别是如何与Flex前端进行集成,以提升用户体验。 首先,iBATIS是一个持久层框架,它简化了...

    apache开源项目源码ibatis-3-core-src-3.0.0.227(ibatis框架java源程序)

    spring,struts,hibernate,ibatis,框架源码 各种ibatis框架应用源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其优良的代码风格和高质量的源码是学习者难得的学习资料!

    mybaits-spring(ibatis-spring)-1.0.2-bundle

    2. SqlSessionDaoSupport:这是一个抽象类,为DAO提供了一个SqlSessionTemplate实例,继承自它,只需专注于业务逻辑,无需关心事务和SqlSession管理。只需重写getSqlSessionTemplate()方法即可。 3. ...

    ibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.zip

    ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...

    ibatis-3-core-3.0.0.200

    ibatis-3-core-3.0.0.200

    ibatis-dao-2.jar

    ibatis-dao-2.jar gggggggggggg

    iBATIS-DAO-2

    ### iBATIS Data Access Objects (DAO):一种强大的持久层抽象技术 在深入探讨iBATIS Data Access Objects(DAO)的细节之前,我们先来理解一下这个概念的重要性以及它如何改变Java应用程序的开发方式。 #### 引言...

    myeclipse热部署jrebel6.5.0

    亲测可用,资源下载到磁盘,然后打开myeclipse 路径为:Windows ---&gt; Perferences --&gt; MyEclipse --&gt;Servers --&gt;Tomcat --&gt;...-Drebel.ibatis-plugin--------热部署ibatis相关的jar

    myeclipse 插件热部署 jrebel6.5

    myeclipse 插件热部署 jrebel6.5 亲测可用,资源下载到磁盘,然后打开myeclipse 路径为:Windows ---&gt; Perferences --&gt; MyEclipse --&gt;...-Drebel.ibatis-plugin--------热部署ibatis相关的jar

    iBATIS-SqlMaps-2-Tutorial_cn.pdf

    iBATIS-SqlMaps-2-Tutorial_cniBATIS-SqlMaps-2-Tutorial_cn.pdf.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdf

    Ibatis基本配置---[环境搭建

    Ibatis基本配置---[环境搭建

    Spring-Struts-IBatis-AOP-Transaction

    在 "17-Prj-Spring-Struts-IBatis-AOP-Transaction" 这个项目中,这四个框架被集成在一起,形成一个强大的 web 应用开发解决方案。Spring 作为整个系统的基石,负责依赖注入和事务管理;Struts 2 处理 HTTP 请求,...

    hibernate3.jar、ibatis-dao-2.jar、spring.jar、struts.jar、log4j-1.2.9.jar

    5. **iBatis-dao-2.jar**:iBatis(在本例中可能是iBATIS DAO的特定版本)是另一种ORM框架,不同于Hibernate,它更强调SQL的灵活性。iBatis允许开发者编写自定义的SQL,将SQL语句直接嵌入XML配置文件或Java代码中,...

    ibatis-3-core-3.0.0.227.z

    iBatis,作为一款优秀的Java持久层框架,一直以来都是开发者们青睐的工具。本文将围绕"ibatis-3-core-3.0.0.227.z"这个压缩包,详细介绍其包含的元素以及相关的知识要点。 首先,"ibatis-3-core-3.0.0.227.jar"是...

    spring-modules-0.9.zip

    Spring Modules是针对Spring框架的一系列扩展工具和模块,旨在增强Spring的功能并促进其与其他开源项目的无缝集成。这个压缩包"spring-modules-0.9.zip"包含了0.9版本的Spring Modules,它在早期的Spring生态中扮演...

    ibatis-3-core-3.0.0.204

    ibatis-3-core-3.0.0.204 最新官方下载版

    flex 整合 spring+struts2+ibatis - 乐的日志 - 网易博客.htm

    flex 整合 spring+struts2+ibatis - 乐的日志 - 网易博客.htm flex 整合 spring+struts2+ibatis - 乐的日志 - 网易博客.htm

Global site tag (gtag.js) - Google Analytics