从Ibatis过度到Mybatis---比较Mybaits较与Ibatis有哪些方面的改进

随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis。那么mybatis较于ibatis做了哪些方面的突破呢?这里我总结些:(不一定完整,是本人整理总结的)

1.全局文件的配置:

         MyBatis 全局配置文件的各主要元素基本和 iBatis 相同,只是在用法和个别名称上做了调整。元素的意义就不再描述,下面主要讲述针对 iBatis 和 MyBatis 配置文件的主要区别之处。

1.1,两个版本的 DTD 约束不同,MyBatis 的 DTD 文件已经包含在发布包下的 mybatis-3.0.x.jar 包中。这直接影响到的是,iBatis 配置文件的根元素是 <sqlMapConfig>,而 MyBatis 使用的是 <configuration>

  1.   <span style="font-size:12px;"> <?xml version="1.0" encoding="UTF-8" ?>  
  2.    <!--iBatis 和 MyBatis 的全局配置文件使用不同的 DTD 约束,在将应用由  
  3.    iBatis 升级至 MyBatis 时需要注意(两者的映射文件 DTD 约束也不相同)-->  
  4.    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  5.   "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  6.    <configuration>  
  7.    <!-- 配置数据源相关的信息 -->  
  8.    <environments default="demo">  
  9.    <environment id="demo">  
  10.    </span><span style="font-size:12px;"><span style="color:#ff0000;"><transactionManager type="JDBC"/>  
  11. </span>   <dataSource type="POOLED">  
  12.    <property name="driver" value= … />  
  13.    <property name="url" value= … />  
  14.    <property name="username" value="root"/>  
  15.    <property name="password" value="root"/>  
  16.    </dataSource>  
  17.    </environment>  
  18.    </environments>  
  19.    <!-- 列出映射文件 -->  
  20.    <mappers>  
  21.    <mapper resource="footmark/mybatis/demo/UserInfoMapper.xml"/>  
  22.    </mappers>  
  23.  </configuration></span>  

      有了这些信息,MyBatis 便能够和数据库建立连接,并应用给定的连接池信息和事务属性。MyBatis 封装了这些操作,最终暴露一个 SqlSessionFactory 实例供开发者使用,从名字可以看出来,这是一个创建 SqlSession 的工厂类,通过 SqlSession 实例,开发者能够直接进行业务逻辑的操作,而不需要重复编写 JDBC 相关的样板代码。根据全局配置文件生成 SqlSession 的代码如下:

  1.  Reader reader = Resources.getResourceAsReader("Configuration.xml");  
  2.  SqlSessionFactory sqlSessionFactory =  
  3.  new SqlSessionFactoryBuilder().build(reader);  
  4.    SqlSession sqlSession = sqlSessionFactory.openSession();  

   可以把上面的三行代码看做是 MyBatis 创建 SqlSession 的样板代码。其中第一行代码在类路径上加载配置文件,Resources 是 MyBatis 提供的一个工具类,它用于简化资源文件的加载,它可以访问各种路径的文件,不过最常用的还是示例中这种基于类路径的表示方式。(mybatis现在已经没有SqlMapClient了,使用的则是SqlSession.在原来的基础上加了像selectMap,selectList,selectOne这样的方法,使用更方便了。)

 

1.2,之前ibatis配置事务管理器和数据源的方式如下:

  1.  <transactionManager type="JDBC" >  
  2.  <dataSource type="SIMPLE">  
  3.  <property name="JDBC.Driver" value="${driver}"/>  
  4.  <!-- 其他数据源信息省略 -->  
  5.  </dataSource>  
  6. bsp;   </transactionManager>  

 在  MyBatis  中配置事务管理器和数据源的方式:

  1. <environments default="demo">  
  2.  <environment id="demo">  
  3.  <transactionManager type="JDBC"/>  
  4.  <dataSource type="POOLED">  
  5.  <property name="JDBC.Driver" value="${driver}"/>  
  6.  <!-- 其他数据源信息省略 -->  
  7.  </dataSource>  
  8.  </environment>  
  9.  </environments>  

       

1.3,在 iBatis 中指定映射文件的方式如下:

  1.    <sqlMap resource=... />  
  2.        <sqlMap resource=... />  
  3.     <sqlMap resource=... />  

  MyBatis  中指定映射文件的方式:

  1.   <mappers>  
  2.    <mapper resource=... />  
  3.    <mapper resource=... />  
  4. bsp;    </mappers>  

 

附:到目前为止,我们主要讨论了 XML 形式的全局配置,其实这也不是唯一选择,MyBatis 还提供了通过代码来进行配置的方式:

  1.  DataSource ds = …… // 获取一个 DataSource  
  2.  TransactionFactory txFactory = new JdbcTransactionFactory();  
  3.  Environment env = new Environment("demo", txFactory, ds);  
  4.  Configuration cfg = new Configuration(env);  
  5.  cfg.addMapper(UserInfoMapper.class);  
  6. bsp;   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfg);  

    结合前面的配置文件,很容易理解这段代码的意思,不过,需要注意的是 Configuration 的 addMapper() 方法,该方法的参数通常是一个接口,可以在接口里面定义若干方法,在方法上使用注解来指定映射的 SQL 语句。   

  1.    // 映射 SQL 绑定接口  
  2.  public interface UserInfoMapper  
  3.  {  
  4.  @Select("select * from userinfo where userid = #{userid}")  
  5.  public UserInfo getUserInfo(int userid);  
  6.  }  
  7.  // 接口绑定对应的数据访问方法  
  8.  try  
  9.  {  
  10.  //UserInfo userinfo = (UserInfo) sqlSession.selectOne  
  11.  ("mybatis.demo.UserInfoMapper.selectUser", 2);  
  12.  UserInfoMapper userinfoMapper =  
  13.  sqlSession.getMapper(UserInfoMapper.class);  
  14.  UserInfo userinfo = userinfoMapper.getUserInfo(1);  
  15.  System.out.println(userinfo);  
  16.  } finally  
  17.  {  
  18.  sqlSession.close();  
  19.   }  

 

2.映射文件中配置  SQL  语句:

  1.   <?xml version="1.0" encoding="UTF-8" ?>  
  2.    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  3.   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  4.    <mapper namespace="mybatis.demo.UserInfoMapper">  
  5.    <select id="selectUser" parameterType="int"  
  6.    resultType="mybatis.demo.UserInfo">  
  7.    select * from UserInfo where userid =#{userid}  
  8.    </select>  
  9.     </mapper>  

  在 iBatis 中,namespace 不是必需的,且它的存在没有实际的意义。在 MyBatis 中,namespace 终于派上用场了,它使得映射文件与接口绑定变得非常自然。Ibatis用的parameterClassmybatis中已经永不了了,mybatis里应该使用parameterType。另外resultMap里面也不能继续使用了改成了type

    同时数据类型的声明和ibatis有了很大的差别,ibatis可以像下面这样写

  1. insert into M_HEALTHSPECIALYTYPE(FCODE,FCHARGE,FTYPECONTENT,FID,FMARK)   
  2. values (#FCODE:VARCHAR2#,#FCHARGE:VARCHAR2#,#FTYPECONTENT:VARCHAR2#,#FID#,#FMARK:VARCHAR2#)  

    而在mybatis的话一般是这样弄的:

  1. insert into M_HEALTHSPECIALYTYPE(FCODE,FCHARGE,FTYPECONTENT,FID,FMARK)   
  2.  values (#{FCODE,jdbcType=VARCHAR},#{FCHARGE,jdbcType=VARCHAR},#{FTYPECONTENT,jdbcType=VARCHAR},#{FID},#{FMARK,jdbcType=VARCHAR})   

 

针对映射文件,首先是一系列的属性名称的改变,这些仅仅是名称的改变,用法和含义并没有发生变化:

· 和全局配置文件一样,由于 DTD 约束发生变化,根元素也由原来的 <sqlMap> 调整为 <mapper>

· <select> 等元素的 parameterClass 属性改为了 parameterType 属性。

· <select> 等元素的 resultClasss 属性改为了 resultType 属性。

· <parameterMap> 等元素的 class 属性改为了 type 属性。

· <result> 元素的 columnIndex 属性被移除了。

· 嵌套参数由 #value# 改为了 #{value}

· <parameter> 等元素的 jdbcType 属性取值中,原来的 "ORACLECURSOR" 取值改为了现在的 "CURSOR""NUMBER" 取值改为了 "NUMERIC"

  

3.使用  SqlSession  执行映射文件中配置的  SQL  语句

  1.    try  
  2.    {  
  3.    UserInfo userinfo = (UserInfo) sqlSession.selectOne  
  4.    ("mybatis.demo.UserInfoMapper.getUser", 2);  
  5.    System.out.println(userinfo);  
  6.    } finally  
  7.    {  
  8.    sqlSession.close();  
  9.  }  

       需要注意的是,SqlSession 的使用必需遵守上面的格式,即在 finally 块中将其关闭。以保证资源得到释放,防止出现内存泄露!以上就是一个简单而完整的 MyBatis 程序。其中涉及了全局配置文件,映射文件,构建 SqlSession 对象,执行数据访问操作等四个步骤。

     

4.iBatis/MyBatis 对存储过程的支持.

iBatis  中调用存储过程的方式(通过使用 <procedure> 元素进行存储过程的定义)

  1. <procedure id="getValues" parameterMap="getValuesPM">  
  2.     { ? = call pkgExample.getValues(p_id => ?) }  
  3.  </procedure>  

在 MyBatis 中,<proccedure> 元素已经被移除,通过 <select><insert> 和 <update> 进行定义:

  1. <select id="getValues" parameterMap="getValuesPM" statementType="CALLABLE">    
  2.   { ? = call pkgExample.getValues(p_id => ?)}     
  3. </select>  

如上所示,通过 statementType 属性将该语句标识为存储过程而非普通 SQL 语句。

 

总结:

      通过前面的示例可以看出,MyBatis 在编码中的最大的改变就是将一个最常用的 API 由 SqlMapClient 改为SqlSessionFactory。另外,类型处理器接口也由原来的 TypeHandlerCallback 改为了 TypeHandler。最后 DataSourceFactory 也进行了调整,移动到 org.apache.ibatis.datasource 包下,其中的方法也作了微调。总之,代码层面公开的部分改动较少,不会给开发者造成较大的移植成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值