`
badqiu
  • 浏览: 674471 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

ibatis3 (mybatis) 实例代码下载兼ibatis3优劣分析

    博客分类:
  • Java
阅读更多

(本文章于2010-06-30更新以适应mybatis的最新版本)

 

作为rapid-framework路线图的一部分,集成ibatis3也是以后要更新的内容之一.

现编写了ibatis3的代码例子. 

 

一.首先我们来看现在的xml mapper关于增删改查的编写

 

 

<mapper namespace="UserInfo">

	<resultMap id="RM.UserInfo" type="com.company.project.model.UserInfo">
        <result property="userId" column="USER_ID"/>
        <result property="username" column="USERNAME"/>
        <result property="password" column="PASSWORD"/>
        <result property="birthDate" column="BIRTH_DATE"/>
        <result property="sex" column="SEX"/>
        <result property="age" column="AGE"/>
	</resultMap>
	
	<!-- 用于select查询公用抽取的列 -->
	<sql id="UserInfo.columns">
	    <![CDATA[
        	USER_ID,
        	USERNAME,
        	PASSWORD,
        	BIRTH_DATE,
        	SEX,
        	AGE
	    ]]>
	</sql>

	<!-- useGeneratedKeys="true" keyProperty="xxx" for sqlserver and mysql -->
	<insert id="UserInfo.insert" useGeneratedKeys="true" keyProperty="userId">
    <![CDATA[
        INSERT INTO USER_INFO (
        	USER_ID ,
        	USERNAME ,
        	PASSWORD ,
        	BIRTH_DATE ,
        	SEX ,
        	AGE 
        ) VALUES (
        	#{userId} ,
        	#{username} ,
        	#{password} ,
        	#{birthDate} ,
        	#{sex} ,
        	#{age} 
        )
    ]]>
		<!--	
			oracle: order="BEFORE" SELECT sequenceName.nextval AS ID FROM DUAL 
			DB2: order="BEFORE"" values nextval for sequenceName
		<selectKey resultType="java.lang.Long" order="BEFORE" keyProperty="userId">
			SELECT sequenceName.nextval AS ID FROM DUAL 
        </selectKey>
		-->
	</insert>
    
	<update id="UserInfo.update" >
    <![CDATA[
        UPDATE USER_INFO SET
	        USERNAME = #{username} ,
	        PASSWORD = #{password} ,
	        BIRTH_DATE = #{birthDate} ,
	        SEX = #{sex} ,
	        AGE = #{age} 
        WHERE 
	        USER_ID = #{userId} 
    ]]>
	</update>

    <delete id="UserInfo.delete">
    <![CDATA[
        DELETE FROM USER_INFO WHERE
        USER_ID = #{id} 
    ]]>
    </delete>
    
    <select id="UserInfo.getById" resultMap="RM.UserInfo">
		SELECT <include refid="UserInfo.columns" />
	    <![CDATA[
		    FROM USER_INFO 
	        WHERE 
		        USER_ID = #{id} 
	    ]]>
	</select>
	
	<sql id="UserInfo.findPage.where">
		<!-- ognl访问静态方法的表达式 为@class@method(args),以下为调用rapid中的Ognl.isNotEmpty()方法,还有其它方法如isNotBlank()可以使用,具体请查看Ognl类 -->
		<where>	      				
	       <if test="@Ognl@isNotEmpty(userId)">
				AND USER_ID = #{userId}
			</if>
	       <if test="@Ognl@isNotEmpty(username)">
				AND USERNAME = #{username}
			</if>
	       <if test="@Ognl@isNotEmpty(password)">
				AND PASSWORD = #{password}
			</if>
	       <if test="@Ognl@isNotEmpty(birthDateBegin)">
				AND BIRTH_DATE >= #{birthDateBegin}
		   </if>
		   <if test="@Ognl@isNotEmpty(birthDateEnd)">
				AND BIRTH_DATE &lt;= #{birthDateEnd}
		   </if>
	       <if test="@Ognl@isNotEmpty(sex)">
				AND SEX = #{sex}
			</if>
	       <if test="@Ognl@isNotEmpty(age)">
				AND AGE = #{age}
			</if>
		</where>
	</sql>
		
    <select id="UserInfo.findPage.count" resultType="long">
        SELECT count(*) FROM USER_INFO 
		<include refid="UserInfo.findPage.where"/>    
    </select>
    
    <!--
    	分页查询已经使用Dialect进行分页,也可以不使用Dialect直接编写分页
    	因为分页查询将传 offset,pageSize,lastRows 三个参数,不同的数据库可以根于此三个参数属性应用不同的分页实现
    -->
    <select id="UserInfo.findPage" resultMap="RM.UserInfo">
    	SELECT <include refid="UserInfo.columns" />
	    FROM USER_INFO 
		<include refid="UserInfo.findPage.where"/>
		
		<if test="@Ognl@isNotEmpty(sortColumns)">
			ORDER BY ${sortColumns}
		</if>
    </select>
</mapper>

 

 

与ibatis2 sqlmap的主要异同:

1. insert节点现在可以直接指定mysql auto_increment(或是sqlserver identity)的主键生成策略

  useGeneratedKeys="true" keyProperty="userId" 

 

2.动态构造sql部分,test部分采用的是struts2 ognl表达式,还有choose,foreach语句等,跟struts2 tag是否很像呢?

  (注:此处现可以使用ONGL访问静态方法来解决:@Ognl@isNotEmpty(userId))

  Ognl静态方法调用

 

二.构造SqlSessionFactory,以前的SqlMapClient

 

		Reader reader = Resources.getResourceAsReader("Configuration.xml");
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = sessionFactory.openSession();

 

三. 配置文件Configuration.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/company/project/model/mapper/UserInfoMapper.xml" />
	</mappers>
</configuration>

 

以上就是完整的示例, 具体demo代码下载:  http://rapid-framework.googlecode.com/files/ibatis3_demo.zip

 

 

ibatis3 annotation评价:

难听点,根本是个脑残方案,如果用annotation写,我还不如使用类似jdbc的java代码. 不知道自己优势是在xml文件,瞎跟风.

 

而spring现在还没有对ibatis3集成,不过以后rapid会先与spring发布ibatis3的插件, 只提供生成器模板,现不自己开发集成,等待spring. 当然以后对提供类似ibatis2的基于方言Dialect的分页还是会提供的.

 

 

最后仍然做下广告: rapid-framework, 现最好的项目脚手架

http://code.google.com/p/rapid-framework/

 

 

 

20
4
分享到:
评论
11 楼 poplong_2001 2009-12-13  
楼主的原文:ibatis3 annotation评价:

难听点,根本是个脑残方案,如果用annotation写,我还不如使用类似jdbc的java代码. 不知道自己优势是在xml文件,瞎跟风.

楼主这段话说明楼主压根没有认真看ibatis3的官方文档。
ibatis3的官方文档中明确说明了:“Java Annotations are unfortunately limited in their expressiveness and flexibility. Despite a lot of time spent in investigation, design and trials, the most powerful iBATIS mappings simply cannot be built with Annotations – without getting ridiculous that is.”That said, the Java!Annotation based configuration is not without its benefits.
ibatis3之所以推出这种配置方式,主要是为了顺应新的jdk的变化,为部分用户提供一种选择而已,文档中其实已经明确指出了java annotations的缺陷,而且并不鼓励大家在大型的项目中使用。并强调xml的方式仍然是发挥ibatis3优势的最好选择。
10 楼 littleJava 2009-11-09  
iBATIS3.0和iBATIS2.0在XML的规则上有写区别,近期估计不会有iBATIS3的实际项目吧
9 楼 melin 2009-09-28  
badqiu 写道
你现在这个切入点是不行的,必须要能够修改limit及offset的值才行, 我已经写好了,我写一下文章介绍一下.


反射能获取,肯定能修改
期待你的思路。。。
8 楼 badqiu 2009-09-28  
你现在这个切入点是不行的,必须要能够修改limit及offset的值才行, 我已经写好了,我写一下文章介绍一下.
7 楼 melin 2009-09-28  
melin 写道
然以后对提供类似ibatis2的基于方言Dialect的分页还是会提供的. 
希望尽快提供一个ibatis3,谢谢!


自己写了一个,找切入点,花了不少时间:

@Intercepts({@Signature(
		type= StatementHandler.class, 
		method = "prepare", args = {Connection.class})})
public class DiclectStatementHandlerInterceptor implements Interceptor {
	
	private Properties properties;
	
	private static final String DIALECT = "dialect";
	
	public Object intercept(Invocation invocation) throws Throwable {
		RoutingStatementHandler statement = (RoutingStatementHandler)invocation.getTarget();
		
		PreparedStatementHandler handler = (PreparedStatementHandler) ReflectUtil.getField(statement, "delegate", StatementHandler.class);
		
		Integer rowOffset = (Integer)ReflectUtil.getField(handler, "rowOffset", int.class);
		Integer rowLimit = (Integer)ReflectUtil.getField(handler, "rowLimit", int.class);
		
		if(rowLimit !=0) {
			BoundSql boundSql = statement.getBoundSql();
			String sql = boundSql.getSql();
			String dialectStr = properties.getProperty(DIALECT);
			
			Dialect dialect = (Dialect) Class.forName(dialectStr).newInstance();
			
			sql = dialect.getLimitString(sql, rowOffset, rowLimit);
			ReflectUtil.setFieldValue(boundSql, "sql", String.class, sql);
		}
		return invocation.proceed();
	}

	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}

	public void setProperties(Properties properties) {
		this.properties = properties;
	}
}

6 楼 melin 2009-09-27  
然以后对提供类似ibatis2的基于方言Dialect的分页还是会提供的. 
希望尽快提供一个ibatis3,谢谢!
5 楼 超级潜水员 2009-09-24  
真是够快的,期待楼主的3.0版本.
4 楼 badqiu 2009-09-24  
gosin 写道
可以google下,网上已经有spring3跟ibatis3的集成了。


等spring3集成吧,实在没有必要自己写,反正两者都没有发布.都不会有人实际应用ibatis beta3应用于生产环境的.

3 楼 badqiu 2009-09-24  
annotation主要是速度快,如spring的@Component等标注,很方便。

不过,太多annotation就难以接受,尤其ibatis3.0这种,根本不是人能够看的。

而ibatis3这种语法: #{age,javaType=int,jdbcType=NUMERIC,typeHandler=typeHandler}
主要也是由于要适应annotation,所以才搞出这种东西.

2 楼 treblesoftware 2009-09-24  
annotation很侵入代码,不知道badqiu对annotation泛滥有什么感觉?annotation根本没有解决配置问题,配置是变少了,但是由于配置引起的问题根本没有被解决。
1 楼 gosin 2009-09-24  
可以google下,网上已经有spring3跟ibatis3的集成了。

相关推荐

    Ibatis/mybatis代码生成工具

    《Ibatis/mybatis代码生成工具详解》 在Java开发领域,Ibatis和Mybatis作为两款广泛应用的持久层框架,极大地简化了数据库操作。为了进一步提高开发效率,开发者们设计了一系列的代码生成工具,如"Ibatis Helper"和...

    Ibatis和Mybatis实例源码

    同时,通过对源码的分析,开发者可以更好地利用这两个框架提供的功能,例如:利用Mybatis的注解简化开发,或者使用Ibatis的动态SQL提高查询效率。 在实践中,IbatisExer和MybatisExer这两个项目提供了一系列的示例...

    ibatis mybatis crud 完整代码

    总的来说,`iBatis` 和 `MyBatis` 通过提供直观的接口和灵活的SQL映射,大大降低了数据库操作的复杂性,使得开发者可以专注于业务逻辑,而不是繁琐的JDBC代码。通过熟练掌握这两个框架,你可以轻松地进行`CRUD`操作...

    ibatis2mybatis-master.zip

    标题“ibatis2mybatis-master.zip”所指的是一款工具或服务,用于将基于iBATIS的数据访问框架的代码自动转换为使用MyBatis框架的代码。iBATIS和MyBatis都是Java开发中常用的持久层框架,它们帮助开发者简化数据库...

    ibatis mybatis 分页 crud 完整代码

    压缩包中的"books"可能是一个示例项目,包含了使用Ibatis和Mybatis进行CRUD和分页操作的代码实例。通过阅读和分析这些代码,开发者可以更深入地理解如何在实际项目中应用这两个框架。 总的来说,这份资源对于学习...

    从iBatis迁移到MyBatis

    标题 "从iBatis迁移到MyBatis" 暗示了本次讨论的主题是关于数据库持久层框架的升级,从较早的iBatis转向更现代的MyBatis。iBatis是一个Java语言中的SQL映射框架,而MyBatis是在iBatis的基础上发展起来的,提供了更多...

    ibatis2.X升级mybatis3.X之曲径通幽处

    本篇文章将探讨从ibatis2.x升级到mybatis3.x的过程,揭示其中的技术变迁和核心变化。 Ibatis2.x是一款轻量级的ORM框架,它允许开发者通过SQL Map配置文件来编写SQL语句,提供了灵活的SQL控制。然而,随着技术的发展...

    ibatis2mybatis-master

    可以帮你将 ibatis 2.x sqlmap 文件转换为 myBatis 3.x mapper 文件,该工具是使用了 Ant 构建任务进行 XSTL 转换和一些语法文字替换 该工具下载下来使用非常简单,把你要转换的所有 sqlmap 文件放到 source 文件夹...

    ibatis和mybatis对比

    ibatis和mybatis对比

    mybatis和ibatis代码生成工具

    MyBatis和iBatis是两个著名的Java持久层框架,它们都致力于简化数据库与Java代码之间的交互。在Java开发中,代码生成工具可以极大地提高开发效率,减少手动编写重复的CRUD(创建、读取、更新、删除)操作。本压缩包...

    springMvc_ibatis_mybatis

    Spring MVC、iBatis 和 MyBatis 是Java开发中常用的三个框架,它们分别在Web层、数据访问层有着重要作用。让我们深入探讨这三个框架的核心概念、使用场景以及它们之间的关系。 **Spring MVC** Spring MVC是Spring...

    iBatis和MyBatis对比

    在Java EE开发领域,iBatis和MyBatis是两个广受欢迎的持久层框架,它们都提供了SQL映射的功能,帮助开发者处理数据库操作。iBatis作为早期的代表,以其简洁和灵活性赢得了开发者们的青睐,特别是对于熟悉SQL的程序员...

    ibatis和mybatis的区别

    在里面总结了ibatis和mybatis的主要区别,包括xml文件等

    2011最新ibatis+Mybatis+Spring整合文档全集以及案例

    《2011最新ibatis+Mybatis+Spring整合文档全集以及案例》是一份珍贵的资源,包含了关于这三个著名Java技术的详细信息和实践案例。这篇文章将深入探讨ibatis、Mybatis和Spring框架的整合,以及它们在实际开发中的应用...

    spring mybatis ibatis 实例(源代码)

    spring mybatis ibatis 实例(源代码)

    iBatis+MyBatis[中文教程]

    MyBatis3用户指南中文版.pdf涵盖了MyBatis的全部内容,包括MyBatis的安装、配置、Mapper接口的使用、XML和注解方式的SQL映射、结果映射、参数映射、缓存机制、动态SQL以及如何自定义插件等。 在学习这两个框架时,...

    ibatis、mybatis官方教程文档集合(含Manning.iBATIS.in.Action)

    MyBatis 3 User Guide Simplified Chinese.pdf MyBatis-3.0.3-Migrations.pdf MyBatis-3.0.3-User-Guide.pdf MyBatis-3-Migrations.doc MyBatis-3-Migrations.pdf MyBatis-3-User-Guide.doc MyBatis-3-User-Guide....

    mybatis/ibatis代码生成器

    注意,ibatis(ibatis2)和mybaits(ibatis3)的xml文件中有一些语法不一样,例如 select 等元素的 parameterClass 属性改为了 parameterType 属性,resultClasss 属性改为了 resultType 属性; parameterMap 等元素的 class...

    myBatis和ibatis的区别

    通过对ibatis与myBatis之间区别的详细分析,我们可以看到myBatis不仅继承了ibatis的优点,还在很多方面进行了改进和优化,使得其在功能性和易用性上都有了显著提升。对于开发者而言,选择myBatis作为持久层框架可以...

    ibatis-2-mybatis-2.3.5.zip

    它将SQL语句与Java代码分离,提供了一种灵活的方式来控制数据库操作,避免了传统的JDBC中的大量模板代码,提高了开发效率。iBatis 2.3.5是其在2.x系列中的一个重要版本,具备稳定性高、灵活性强等特点。 二、iBatis...

Global site tag (gtag.js) - Google Analytics