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

iBATIS 3 变动

 
阅读更多

   iBATIS以其对SQL控制的灵活性而受到许多大型项目的青睐,它不像Hibernate那样是完全面向对象的,iBATIS是一个半自动化的O/R Mapping框架。今晚散逛到iBATIS的官网(http://ibatis.apache.org/),发现iBATIS 3已经到Beta 5阶段,应该说已经比较稳定了,于是Download了一个下来研究,早就听说iBATIS 3在相比iBATIS 2作了很大改动,看来不假,呵呵,废话少说,见下。

  首先是初始化的改变:

Reader reader = Resources.getResourceAsReader(CONFIG_FILE_PATH);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, "development_oracle");
SqlSession session = sqlSessionFactory.openSession();
   iBATIS 2中的SqlMapClient被SqlSession所替代, 而iBATIS 2中的静态类SqlMapClientBuilder也被SqlSessionFactoryBuilder所替代,变为了非静态的,此外最重要的是iBATIS 3中需要使用openSession()方法来返回SqlSession的实例,至于上述代码中build方法的第二参数“development_oracle”是环境配置ID,稍候会讲到。

 

  下面来看Configuration文件。

<?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>
	<properties resource="conf/database.properties" />
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${database.driver}"/>
				<property name="url" value="${database.url}"/>
				<property name="username" value="${database.user}"/>a
				<property name="password" value="${database.password}"/>
			</dataSource>
		</environment>
		
		<environment id="development_oracle">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${oracle.database.driver}"/>
				<property name="url" value="${oracle.database.url}"/>
				<property name="username" value="${oracle.database.user}"/>
				<property name="password" value="${oracle.database.password}"/>
			</dataSource>
		</environment>	
	</environments>
	
	<mappers>
		<mapper resource="conf/NewsNotice.xml"/>
	</mappers>
</configuration> 

     database.properties内容:

database.driver = org.gjt.mm.mysql.Driver
database.url = jdbc:mysql://localhost:3306/test
database.user = root
database.password = root

oracle.database.driver = oracle.jdbc.driver.OracleDriver
oracle.database.url = jdbc:oracle:thin:@locahost:1521:ORCL2
oracle.database.user = Tester
oracle.database.password = password
   本人觉得iBATIS 3配置文件最大的变化是增加了<environment/>标签,这样对于不同的环境可以配置不同的属性,无论从开发还是布署都显得非常方便。

  iBATIS 3提供了2种transactionManager类型,分别为JDBC和MANAGED,如果设定为MANAGED,则将整个Transaction的生命周期交由J2EE Container管理;至于JDBC就不用说了吧,这个地球人都晓得的:-D

  至于Datasource的类型,iBATIS 3提供了UNPOOLED、POOLED和JNDI三种方式,

  • UNPOOLED:不使用连接池连接Database,每次请求时Open Connection,结束时Close Connection;
  • POOLED:以池化方式连接Database,它有许多属性可供设置,像poolMaximumActiveConnections、poolMaximumIdleConnections、poolMaximumCheckoutTime、poolPingQuery等等;
  • JNDI:在J2EE Container中配置Datasource。

  <Mapper>标签指定要使用的Mapping文件。

 

  下面来看Mapping文件内容,这是iBATIS 3改动最多的地方。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper  
    PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="NewsNotice">
	<resultMap type="org.newsnotice.domain.NewsNoticeModel" id="resultMap-getNewsNotice1">
		<id column="NN_ID" property="id" />
		<result column="CATEGORY" property="category" />
		<result column="SUBJECT" property="subject" />
		<result column="POSTED_DATE" property="postedDate" />
		<result column="EXPIRY_DATE" property="expiryDate" />
		<result column="ALERT" property="alert" />
		<result column="EMAIL_ALERT" property="emailAlert" />
		<result column="AUDIENCE" property="audience" />
		<result column="FILTER" property="filter" />
		<result column="FILTER_VALUE" property="filterValue" />
		<result column="SUB_FILTER_VALUE" property="subFilterValue" />
		<result column="EXCLUDE_USER_ID" property="excludeUserId" />
		<result column="WF_DEPARTMENT" property="department" />
		<result column="WF_STATUS" property="status" />
		<result column="WF_NOTES" property="notes" />
		<result column="DEFUNCT_IND" property="defunctInd" />
		<result column="APPROVER" property="approver" />
		<association property="newsNoticeContent" column="CONTENT_ID" javaType="org.newsnotice.domain.NewsNoticeContentModel">
			<id column="CONTENT_ID" property="id" />
			<result column="PARENT_NN_ID" property="parentId" />
			<result column="CONTENT" property="content" />
		</association>
		<collection property="newsNoticeMsgBoxList" ofType="org.newsnotice.domain.NewsNoticeMsgBoxModel" >
			<id column="MSG_BOX_ID" property="id"/>
			<result column="USER_ID" property="userId" />
			<result column="MSG_BOX_NN_ID" property="nnId" />
			<result column="FOLDER" property="folder" />
			<result column="READ" property="read" />			
			<result column="READ_ON" property="readOn" />
			<result column="MSG_BOX_DEFUNCT_IND" property="defunctInd" />
			<result column="MSG_BOX_PI_NO" property="piNo" />
		</collection>
	</resultMap>
	
	<select id="getNewsNotice" parameterType="org.newsnotice.domain.NewsNoticeModel" resultMap="resultMap-getNewsNotice1" >
		SELECT A.NN_ID, A.CATEGORY, A.SUBJECT, A.POSTED_DATE, A.EXPIRY_DATE, A.ALERT, A.EMAIL_ALERT, A.AUDIENCE,
			A.FILTER, A.FILTER_VALUE, A.SUB_FILTER_VALUE, A.EXCLUDE_USER_ID, A.WF_DEPARTMENT, A.WF_STATUS, A.WF_NOTES,
			A.DEFUNCT_IND, A.APPROVER, B.ID CONTENT_ID, B.PARENT_NN_ID, B.CONTENT, C.ID MSG_BOX_ID, C.USER_ID, 
			C.NN_ID MSG_BOX_NN_ID, C.FOLDER, C.READ, C.READ_ON, C.DEFUNCT_IND MSG_BOX_DEFUNCT_IND, C.PI_NO MSG_BOX_PI_NO
		FROM NN_MSTR A, NN_CONTENT B, NN_MSG_BOX C
		WHERE A.NN_ID = B.PARENT_NN_ID
		AND A.NN_ID = C.NN_ID
		<if test="id != null">
			AND A.NN_ID = #{id}
		</if>
		<if test="category != null">
			AND A.CATEGORY = #{category}
		</if>
		<if test="status != null">
			AND A.WF_STATUS = #{status}
		</if>
	</select>
   先说动态SQL,这是iBATIS最强大的地方,如果熟悉iBATIS 2的话,一眼可以看出没有了<isNotNull>、<isNotEmpty>、<isLessThan>等熟悉的标签,不错,iBATIS使用了类似JSTL的标签<if>、<choose>、<when>、<otherwise>、<foreach>等来代替原来的标签,并且传值方式由#property name#, $property name$变为了#{property name}和${property name},就我个人而言,这些标签感觉没有iBATIS2用上去爽。

  此外根元素<mapper>的属性namespace在iBATIS 3中是required,而不像iBATIS 2中是可选的,可要可不要。

  下面来说说新增元素<association>和<collection>,<association>对应于Java中的Has A模型,也可以理解为数据库中一对一关系,拿上述例子来说,每条消息的概要信息与消息内容是分别存放在两张Table中的,可以通过上述方法一次性将其取出来,而不需要执行多次查询。而<collection>有点类型主从表关系,即one-to-many模型。

  查询标签<select>也有所改变,首先是属性名称,由原来的parameterClass改为了parameterType,resultClass与变为了resultType,此外需要注意的是如果传入的参数类型为复杂对象,如Bean,则需要在参数后面加上jdbcType属性来指定对应数据库表列的类型,如#{userName, jdbcType=VARCHAR},如果传入的是基本类型,像int,long之类的,则不需要指定。

  另外的变化就是执行方法上的变化,使用select, selectOne, selectList等替代了原来的方法,大家可以参考其API,我在些就不多说了。

分享到:
评论

相关推荐

    ibatis-2.3

    PreparedStatement更安全,能有效防止SQL注入,而SimpleStatement则更适合简单的、不常变动的SQL。 标签“ibatis jar”表明这是一个包含Ibatis库的JAR文件,其中可能包括了`ibatis-core.jar`、`ibatis-sqlmap.jar`...

    IBatisVSHibernate

    4. **维护性**:Hibernate的ORM特性使得代码更少受数据库结构变动的影响,增强了代码的可维护性;IBatis则需要在数据库结构调整时更新SQL映射文件。 **总结**: 在选择IBatis和Hibernate时,需要根据项目需求来决定...

    ibatis教程.ppt

    2. 当数据库字段变动时,Hibernate的改动通常较少,而iBATIS需要更新所有受影响的SQL映射。 3. 在可维护性上,由于iBATIS的SQL存储在独立的XML文件中,查找和修改更加方便。 iBATIS的工作流程主要包括: 1. 接收...

    实现ibatis手动控制加载sqlmap文件,终于不用重启应用了

    3. **刷新缓存**:当SQL映射文件更新后,需要确保iBatis的本地缓存和二级缓存被清空,以避免使用旧的SQL语句。可以通过`SqlSession.clearCache()`方法清除当前SqlSession的缓存,或者通过`Configuration....

    Ibatis入门资料(PPT)

    然而,这也意味着在数据库结构变动时,Ibatis需要更多地手动维护SQL映射文件。 Ibatis 的工作流程包括三个主要步骤: 1) 接收对象参数,这些参数将用于设置更新语句的输入值或查询语句的WHERE子句。 2) 执行映射的...

    ibatis和mybatis的前世今生.txt

    - **适用场景**:如果项目中数据库结构稳定且不常变动,iBATIS可能是更好的选择;而如果希望减少对SQL的直接操作并提高开发效率,则Hibernate更为合适。 #### 五、ibatis的配置详解 1. **配置文件示例**:ibatis...

    ant ibatis 软件工程思想

    而iBatis则能够简化数据库操作,使得数据库的迁移和更新更加顺畅,减少因数据库变动对应用程序造成的影响。 此外,结合提供的资源,如《UNIX操作系统教材》可以帮助理解底层系统如何支持这些工具的运行,而《软件...

    hibernateVSibatis

    3. **开发与维护**:在开发效率上,二者相差不大,但iBatis的SQL保存于独立文件中,便于集中管理和维护,相较于Hibernate可能在Java代码中混合SQL/HQL,iBatis在可维护性方面略胜一筹。 ### 结论:选择的智慧 选择...

    ibatis 多表

    3. **动态 SQL**:iBatis 的动态 SQL 功能使得在 XML 映射文件中编写条件查询变得简单。你可以使用 `&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;foreach&gt;` 等标签构建动态的 SQL 语句,根据传入参数...

    java项目应用中自定义sql在ibaits框架中的使用.docx

    3. iBatis框架中执行自定义SQL字符串 在DAO层定义方法,接受SQL字符串作为参数,然后在iBatis的配置文件中添加自定义查询方法。在配置时,要注意使用`&lt;![CDATA[]]&gt;`避免XML特殊字符导致的解析错误。使用`$`符号传递...

    my_springboot_01.rar

    2. 修改时间:对于更新操作,我们需要在更新前获取旧的数据,比较是否有变动,若有变动则更新修改时间。同样,通过SqlCommandType检查是否为UPDATE,并在合适的时机插入当前时间。 3. 创建人与修改人:通常,这些...

    Mybatis核心应用配置与原理解析1

    6. 查询语句中间没有执行 insert update delete 方法(无论变动记录是否与缓存数据有无关系) 一级缓存的实现是通过 PerpetualCache 来实现的。PerpetualCache 是一个 Map 结构,其中 key 是一个缓存 Key,value 是...

    企业管理系统,jsp.对企业的财产,员工,等资源管理

    4. **财产管理模块**:这个系统包含了对企业财产的管理功能,可能包括资产登记、分类、折旧计算、资产变动记录等功能,帮助企业管理其固定资产,确保财产信息的准确性和完整性。 5. **员工管理模块**:员工管理模块...

    Generic Architecture架构更新

    **3. 实现范型开发** 范型开发(Generic Development)是一种将通用逻辑提取出来,用于解决相似问题的策略。在Java中,这主要通过泛型(Generics)来实现。在Generic Architecture中,我们利用泛型来定义`GenericDao...

    OA权限管理

    当员工职位变动或业务需求变化时,可以通过角色分配或直接赋予权限的方式进行调整。同时,系统应具备权限审计功能,能够记录和追踪用户的所有操作,以便于监控和排查问题。 总的来说,基于SpringMVC+iBatis开发的OA...

    mybatis框架课程.docx

    MyBatis是Apache的一个开源项目,始于iBatis,2010年迁移到Google Code并改名为MyBatis。MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装,使开发者只需要关心业务逻辑,而不需要关心复杂的...

    ibator的学习

    在实际开发中,配合Maven或Gradle等构建工具,可以方便地将ibator集成到构建流程中,每次数据库表结构变动时自动更新相应的Java代码,确保代码与数据库的一致性。 总的来说,ibator是提高开发效率的利器,熟练掌握...

    通用管理框架正式版1.1源码

    编译已有代码,建立测试服务器虚拟目录,上传编译文件,初始化角色信息,整理开会讨论的个性模块变动和需求 编写获取页面标题函数,编写页面模块导航函数 弹出消息框代码编写 设计发送/接收消息模块的数据结构 ...

    人力资源管理(基于ssh的j2ee项目)附带lib包

    - `ibatis-2.3.0.677.jar`:MyBatis的早期版本,也可能用于数据库操作,与Hibernate共同使用或替换部分功能。 5. **功能模块**: - **人力资源档案管理**:包括员工基本信息录入、修改、查询等操作。 - **调动...

Global site tag (gtag.js) - Google Analytics