首页 > 其他分享 >iBATIS 3 试用手记 - The FUTURE

iBATIS 3 试用手记 - The FUTURE

时间:2022-11-29 13:42:59浏览次数:69  
标签:ibatis NN database iBATIS FUTURE 手记 org ID

iBATIS 3 试用手记 - The FUTURE -

 

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

  首先是初始化的改变:

Java代码  

iBATIS 3 试用手记 - The FUTURE_apache

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代码  

iBATIS 3 试用手记 - The FUTURE_sql_02

<?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内容:

Java代码  

iBATIS 3 试用手记 - The FUTURE_oracle_03

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代码  

iBATIS 3 试用手记 - The FUTURE_2.5.5 Ibatis_04

<?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,NN,database,iBATIS,FUTURE,手记,org,ID
From: https://blog.51cto.com/u_15683012/5894821

相关文章

  • ibatis参数传递小技巧 - 疯狂的菠菜
    ibatis参数传递小技巧-疯狂的菠菜-ITeye技术网站使用ibatis操作数据库的时候,如果这个操作需要一些参数,一般我们会使用map将这些参数封装起来,然后调用SqlMapClie......
  • JSP知识随手记
    目录​​目录​​​​介绍​​​​JSP运行原理​​​​JSP最佳实践​​​JSP指令​​​page指令​​​​include指令​​​​taglib指令​​​JSP九大内置对象​​​out隐式......
  • The road to future is beneath our feet.
    虽然我已经高一了从初一开始学OI初二就停了但这是我第一次参加的NOIP只能说竞赛太菜其实不是NOIP游寄。可以算是进入高中之后的一些零碎的记录吧。这是前言。-??......
  • Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML.
    错误Causedby:org.apache.ibatis.builder.BuilderException:ErrorparsingMapperXML.Cause:org.apache.ibatis.builder.BuilderException:Parsingerrorwasfou......
  • CompletableFuture异步任务编排
    业务场景:查询详情页的逻辑比较多,有些数据还需要远程调用,必然要花费更多的时间。1、获取SKU的基本信息0.5s2、获取SKU的图片信息0.5s3、获取SKU的促销信息1s4、获取SPU的......
  • nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX
    问题:开发过程中碰到错误nestedexceptionisorg.apache.ibatis.binding.BindingException:Parameter‘XXX’notfound.解决思路:1.排查Dao层没有加@Param注解出现......
  • CompletableFuture异步编程
    1、创建/***publicstatic<U>CompletableFuture<U>supplyAsync(Supplier<U>supplier){..}*publicstatic<U>CompletableFuture<U>supplyAsync(Suppl......
  • Spring2.5、Struts2、Ibatis开发框架搭建之二
      Spring2.5、Struts2、Ibatis开发框架搭建(二) 二、向项目中加入SpringStrutsiBATIS框架2.1准备工作      将下载的三个框架分......
  • Python | Python中 from __future__ import * 的作用
    我们在读代码的时候,总是会看到代码开头会加上from__future__import*这样的语句。这样的做法的作用就是将新版本的特性引进当前版本中,也就是说我们可以在当前版本使用新......
  • GL-Predicting the future 20221116
    Time2022.11.16WednesdayTopicPredictingthefuturewhatdoyouthinkthefuturewilllooklike?ourcitywillbemoreandmoreintelligent,Ourcitywillus......