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

ibatis3 beta 1 发布,新功能介绍

阅读更多

ibatis 3 beta 1 发布,可以去下载试用一下了,http://ibatis.apache.org/java.cgi?Preferred=http://www.apache.org/dist

 

大概读了一下User Guide,值得关注的几点:

* Namespace 现在不是optional了,是required

* 可以使用Java Annotation来配置这些sql了,不过由于java本身和annotation本身的限制,更复杂的sql还是建议使用xml

* 强类型的接口(interface binding),可以使用:

 

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
package org.apache.ibatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

 

 * 增加了很多扩展点,可以写不用的plugin来扩展功能,

  Executor : (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 

 

  ParameterHandler : (getParameterObject, setParameters) 

 

  ResultSetHandler :  (handleResultSets, handleOutputParameters) 

 

  StatementHandler :   (prepare, parameterize, batch, update, query) 

 

* Configuration本身可以被替换,这个是很核心的东西了

* 动态sql增强了不少:

<select id=”findActiveBlogLike”
      parameterType=”Blog” resultType=”Blog”>
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test=”title != null”>
      AND title like ${title}
    </when>
    <when test=”author != null && author.name != null”>
      AND title like ${author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select> 

 * 其他的一些增强

 

看的出来,ibatis 3.0做了很多事情,开放了很多精心设计的扩展点,使用上灵活很多,也友好很多,非常值得关注啊

 

说实话,从wiki上最早的关于3.0的讨论开始,我就开始关注相关信息了,svn,wiki,maillist,非常不错,推荐大家看看。

 


分享到:
评论
33 楼 hst1189 2010-08-06  
evaspring 写道
是否增强了?


同问分页机制 ?
32 楼 evaspring 2010-07-21  
分页机制是否增强了?
31 楼 bluethink 2010-07-04  
还没用过,正要试试
30 楼 luoxj 2010-04-06  
3是否有解决1:M和M:N的问题了。
29 楼 kaki 2010-02-20  
Spring2.5 还是不支持啊!郁闷中!
28 楼 tobackfurture 2009-10-29  
要不我们一起把文档给翻译了吧,一人一张!
中不?
27 楼 reniaL 2009-09-29  
出来后有简单试用了一下。

文档还不完善,甚至有错误的地方(例如hyxw5890说的resultType和resultClass的问题),新人的话还是先用2吧,毕竟现在3还是beta。

还有那个iBatis Migrations,用来管理数据库变更的,感觉跟ROR的模式很像,不过功能也忒简单了点,还不实用。

希望正式版能有所改进吧~
26 楼 raymond2006k 2009-09-27  
ibatis 3 貌似对 SessionFactory 也支持了,向 Hibernate,toplink 等架构靠拢了。

ibatis 对分布式缓存支持的不太好,希望能有实质性的改进。
25 楼 lixjluck 2009-09-24  
jones_ahk 写道
下载了IBatis3的源码,编译通过后,结合Spring2.5,发现原来IBatis2中的一些class都不存在了,不知道是什么原因??
由于IBatis3与2的区别太大了,现在想用2吧又不敢(后续升级简直太困难了),不用2吧3又不稳定,而且与Spring集成有问题,现在都不知道咋办了!!


3不兼容2的,且spring目前也不支持3
如项目用,那就先用2.3的版本吧
24 楼 lggege 2009-09-18  
1. 我一直都觉得没必要写一个DAO impl类, 太麻烦了, 还不如直接使用DAO的方法名去SQL-MAP文件去找呢.

2. 我也认为namespace没有那么必要, 可以直接使用DAO的类名.
23 楼 lnaigg 2009-08-18  
一向对anotation不感兴趣,对动态SQL感兴趣。

不过不明白动态SQL这部分为什么不直接用模版语言实现(velocity或freemarker).
现在的风格像XSL,比较笨拙,看着累。
22 楼 argan 2009-08-17  
jones_ahk 写道
下载了IBatis3的源码,编译通过后,结合Spring2.5,发现原来IBatis2中的一些class都不存在了,不知道是什么原因??
由于IBatis3与2的区别太大了,现在想用2吧又不敢(后续升级简直太困难了),不用2吧3又不稳定,而且与Spring集成有问题,现在都不知道咋办了!!


ibatis3 现在还是beta,不建议在生产环境中使用,当然如果愿意承担一些风险另说
21 楼 jones_ahk 2009-08-17  
下载了IBatis3的源码,编译通过后,结合Spring2.5,发现原来IBatis2中的一些class都不存在了,不知道是什么原因??
由于IBatis3与2的区别太大了,现在想用2吧又不敢(后续升级简直太困难了),不用2吧3又不稳定,而且与Spring集成有问题,现在都不知道咋办了!!
20 楼 totobacoo 2009-08-16  
Spring 还没跟上,暂时只有等待
19 楼 jones_ahk 2009-08-16  
Spring还没有发布对其新版本的整合,com.ibatis.sqlmap.client.SqlMapClient这个文件不知道在新版本中哪个jar中,貌似新版本中没有找到该类。
18 楼 moss 2009-08-15  
弱弱的问下,如果 "".equals(title)类似这样的如何判断,或者num>10这样的条件如何来写呢?
如此来写吗?
<when test=”title != ‘’ ”> 
      AND title like ${title} 
</when> 

<when test=”num>10 ”> 
      AND title like ${title} 
</when> 
17 楼 lixjluck 2009-08-14  
动态SQL增强了
期待它的的稳定
16 楼 zeroxin 2009-08-14  
什么好东西用滥了都不好了,anotation在有的地方使用还是方便的。
15 楼 kqy929 2009-08-13  
<p>ibatis 3.0中将DAO Interface给完全真空了。</p>
<p>AuthorMapper.class</p>
<pre name="code" class="java">public interface AuthorMapper {

Author selectAuthor(int id);

void insertAuthor(Author author);

void updateAuthorIfNecessary(Author author);

}
</pre>
<p> </p>
<p>AuthorMapper.xml</p>
<pre name="code" class="java">&lt;mapper namespace="domain.blog.mappers.AuthorMapper"&gt;

  &lt;parameterMap id="selectAuthor" type="domain.blog.Author"&gt;
    &lt;parameter property="id"/&gt;
  &lt;/parameterMap&gt;
   &lt;!-- id 对应接口中的方法 --&gt;
  &lt;resultMap id="selectAuthor" type="domain.blog.Author"&gt;
    &lt;id column="id" property="id"/&gt;
    &lt;result property="username" column="username"/&gt;
    &lt;result property="password" column="password"/&gt;
    &lt;result property="email" column="email"/&gt;
    &lt;result property="bio" column="bio"/&gt;
    &lt;result property="favouriteSection" column="favourite_section"/&gt;
  &lt;/resultMap&gt;

  &lt;select id="selectAuthor"
          parameterMap="selectAuthor"
          resultMap="selectAuthor"&gt;
    select id, username, password, email, bio, favourite_section
    from author where id = ?
  &lt;/select&gt;

  &lt;insert id="insertAuthor"
          parameterType="domain.blog.Author"&gt;
    insert into Author (id,username,password,email,bio)
    values (#{id},#{username},#{password},#{email},#{bio})
  &lt;/insert&gt;

  &lt;update id="updateAuthorIfNecessary"
          parameterType="domain.blog.Author"&gt;
    update Author
      &lt;set&gt;
        &lt;if test="username != null"&gt;username=#{username},&lt;/if&gt;
        &lt;if test="password != null"&gt;password=#{password},&lt;/if&gt;
        &lt;if test="email != null"&gt;email=#{email},&lt;/if&gt;
        &lt;if test="bio != null"&gt;bio=#{bio}&lt;/if&gt;
      &lt;/set&gt;
    where id=#{id}
  &lt;/update&gt;
&lt;/mapper&gt;</pre>
<p>   Client:</p>
<p>   </p>
<pre name="code" class="java">public class SimpleSqlSessionTest {
private static SqlSessionFactory sqlMapper;

@Before
public void setUp() throws Exception {
final String resource = "org/apache/ibatis/builder/MapperConfig.xml";
final Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
}

@Test
public void shouldSelectOneAuthor() throws Exception {
SqlSession session = sqlMapper.openSession();
try {
Author author = (Author) session.selectOne( "domain.blog.mappers.AuthorMapper.selectAuthor",
new Author(101));
assertEquals(101, author.getId());
assertEquals(Section.NEWS, author.getFavouriteSection());
} finally {
session.close();
}
}

@Test
public void shouldUpdateAuthorIfNecessary() throws Exception {
SqlSession session = sqlMapper.openSession();
Author original;
Author updated;
try {
original = (Author) session.selectOne( "domain.blog.mappers.AuthorMapper.selectAuthor", 101);
original.setEmail("new@email.com");
original.setBio(null);
session.update( "domain.blog.mappers.AuthorMapper.updateAuthorIfNecessary", original);

updated = (Author) session.selectOne( "domain.blog.mappers.AuthorMapper.selectAuthor", 101);
assertEquals(original.getEmail(), updated.getEmail());
session.commit();
} finally {
session.close();
}

try {
session = sqlMapper.openSession();
updated = (Author) session.selectOne( "domain.blog.mappers.AuthorMapper.selectAuthor", 101);
assertEquals(original.getEmail(), updated.getEmail());
} finally {
session.close();
}
}
}</pre>
<p> </p>
<p> </p>
<p>至于anotations<span style="">完全是画蛇添足,华而不实。</span></p>
14 楼 walle1027 2009-08-13  
期待出正式版

相关推荐

Global site tag (gtag.js) - Google Analytics