`
lijingyao8206
  • 浏览: 219349 次
  • 性别: 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  
膜拜....

相关推荐

    数学建模拟合与插值.ppt

    数学建模拟合与插值.ppt

    [net毕业设计]ASP.NET教育报表管理系统-权限管理模块(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    mysql相关资源.txt

    mysql相关资源.txt

    利用HTML+CSS+JS的国漫分享网站(响应式)

    此项目为一个HTML+CSS+JS的国漫分享网站,用户可以在此网站中观看自己喜欢的国漫。此网站共有4个页面,分别为首页,最新动态,热门推荐,分类。页面动漫图片齐全,内容可更改。可用于期末课程设计或个人课程设计。

    Python爬虫爬取漫画

    Python爬虫爬取漫画

    C++语言编程用模拟退火算法解决旅行商问题

    模拟退火算法应用。C++语言编程用模拟退火算法解决旅行商问题。该资源包含模拟退火算法C++语言的源代码。模拟退火算法是一种基于概率的全局优化算法,最初来自于物理学中的退火过程。它通过模拟金属冷却时原子排列逐渐趋于最低能量状态的过程来寻找问题的最优解。模拟退火算法常用于解决非线性、组合优化问题,特别适合于大规模、复杂的搜索空间。

    传感器试题及答案.doc

    传感器试题及答案.doc

    [net毕业设计]ASP.NET网上书店(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    MongoDB数据表基本操作中文最新版本

    本文档主要讲述的是MongoDB数据表基本操作;希望对大家会有帮助;感兴趣的朋友可以过来看看

    1-全国各省废气、废水排放二氧化硫、氮氧化物、烟尘、颗粒物排放量统计数据2011-2021年-社科数据.zip

    本数据集提供了2011至2021年间全国各省废气和废水中主要污染物的排放量统计数据。数据涵盖了二氧化硫、氮氧化物、烟尘和颗粒物等关键污染物的排放量,为研究中国环境状况和污染物排放趋势提供了宝贵信息。数据显示,2011-2021年间,各省的二氧化硫排放量从数十万吨到数百万吨不等,其中广东、广西、海南等省份的排放量较高。氮氧化物排放量同样显示出地域差异,北京、天津等北方城市的排放量相对较低,而一些工业大省如河北、山西的排放量较高。颗粒物排放量统计显示,工业源和生活源是主要的排放源,其中工业源排放量占比较大。这些数据不仅对环保政策制定者具有参考价值,也为学术研究提供了实证基础。

    脉冲宽度测量单片机课程设计.doc

    脉冲宽度测量单片机课程设计.doc

    [net毕业设计]ASP.NET在线毕业论文提交系统的设计与实现(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    求职与招聘(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    [net毕业设计]ASP.NET视频点播系统的设计与实现(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    全国矢量地图数据【国道+高速】-ArcGis Shape 格式数据集

    全国矢量地图数据【国道+高速公路】ArcGIS Shape格式数据集是一种专门用于地理信息系统(GIS)的矢量数据集,包含中国范围内国道和高速公路的详细路网信息。该数据集广泛应用于交通规划、导航、物流分析和灾害应急等领域,具有高精度和易用性。 数据集特点: 1. 数据内容: 国道:包括以“G”开头的国家级公路,如G1京哈高速、G107国道等。 高速公路:包括全国范围内的所有高速公路网,覆盖主要经济区、城市和边境口岸。 属性数据: 道路编号(国道或高速公路编号)。 道路名称。 道路等级(如一级、二级、快速路等)。 起点和终点坐标。 道路长度(单位:公里)。 相关属性(如路段建成年份、设计速度、车道数等)。 2. 数据格式: **Shapefile(.shp)**格式,支持主流GIS软件(如ArcGIS、QGIS)及数据处理工具(如Python、Matlab)。 3. 投影坐标系: 一般采用WGS84地理坐标系,或可根据需求转换为**GCJ-02(火星坐标系)**以配合国内导航应用。

    4.html

    4

    ASP网上作业提交系统(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    Oracle常用分析函数说明中文最新版本

    Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 感兴趣的朋友可以过来看看

    1-商道融绿ESG评级季度数据及分项ESG评级2015-2022年-社科数据.zip

    商道融绿ESG评级季度数据及分项ESG评级2015-2022年的数据集提供了一个全面评估上市公司在环境、社会和公司治理(ESG)方面表现的视角。该数据集覆盖了2015至2022年间的数据,包含了沪深A股上市公司以及港股通的香港上市公司。数据集包含了多个维度的指标,如公司代码、公司名称、评级日期、ESG综合评级、历史评级、财务状况和所属行业等,共计13个指标。这些指标不仅包括了ESG评级,还涵盖了公司的财务分析,例如总市值、流通市值、市盈率PE(TTM)、每股收益EPS(TTM)、每股营业收入(TTM)以及每股经营活动产生的现金流量净额(TTM)等。此外,数据集还提供了证监会行业和Wind行业的分类信息,为研究者提供了一个多角度分析上市公司ESG表现的工具。该数据集对于投资者、资产管理公司以及企业自身在可持续发展报告撰写和风险管理中具有重要参考价值。

Global site tag (gtag.js) - Google Analytics