(经典)从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>。

   <?xml version="1.0" encoding="UTF-8" ?>
   <!--iBatis 和 MyBatis 的全局配置文件使用不同的 DTD 约束,在将应用由
   iBatis 升级至 MyBatis 时需要注意(两者的映射文件 DTD 约束也不相同)-->
   <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
   <configuration>
   <!-- 配置数据源相关的信息 -->
   <environments default="demo">
   <environment id="demo">
   <transactionManager type="JDBC"/>
   <dataSource type="POOLED">
   <property name="driver" value= … />
   <property name="url" value= … />
   <property name="username" value="root"/>
   <property name="password" value="root"/>
   </dataSource>
   </environment>
   </environments>
   <!-- 列出映射文件 -->
   <mappers>
   <mapper resource="footmark/mybatis/demo/UserInfoMapper.xml"/>
   </mappers>
 </configuration>

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

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

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

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

   <transactionManager type="JDBC" >
   <dataSource type="SIMPLE">
   <property name="JDBC.Driver" value="${driver}"/>
   <!-- 其他数据源信息省略 -->
   </dataSource>
    </transactionManager>

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

  <environments default="demo">
   <environment id="demo">
   <transactionManager type="JDBC"/>
   <dataSource type="POOLED">
   <property name="JDBC.Driver" value="${driver}"/>
   <!-- 其他数据源信息省略 -->
   </dataSource>
   </environment>
   </environments>

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

   <sqlMap resource=... />
   	<sqlMap resource=... />
    <sqlMap resource=... />

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

    <mappers>
   	<mapper resource=... />
   	<mapper resource=... />
     </mappers>

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

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

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

     // 映射 SQL 绑定接口
   public interface UserInfoMapper
   {
   @Select("select * from userinfo where userid = #{userid}")
   public UserInfo getUserInfo(int userid);
   }
   // 接口绑定对应的数据访问方法
   try
   {
   //UserInfo userinfo = (UserInfo) sqlSession.selectOne
   ("mybatis.demo.UserInfoMapper.selectUser", 2);
   UserInfoMapper userinfoMapper =
   sqlSession.getMapper(UserInfoMapper.class);
   UserInfo userinfo = userinfoMapper.getUserInfo(1);
   System.out.println(userinfo);
   } finally
   {
   sqlSession.close();
    }

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

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

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

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

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

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

  insert into M_HEALTHSPECIALYTYPE(FCODE,FCHARGE,FTYPECONTENT,FID,FMARK)
   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  语句

   try
   {
   UserInfo userinfo = (UserInfo) sqlSession.selectOne
   ("mybatis.demo.UserInfoMapper.getUser", 2);
   System.out.println(userinfo);
   } finally
   {
   sqlSession.close();
 }

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

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

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

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

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

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

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

总结:

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

时间: 2024-10-11 23:18:44

(经典)从Ibatis过度到Mybatis---比较Mybaits较与Ibatis有哪些方面的改进的相关文章

【Mybatis异常】 org.apache.ibatis.binding.BindingException: Parameter &#39;storeId&#39; not found. Available parameters are [form, param1]

一.异常信息 2019-05-31 16:06:25.272 [http-nio-10650-exec-3] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver.logException(AbstractHandlerExceptionResolver.java:192) - Resolved exception caused by Handler execution: org.mybatis.spring.MyBatisSystemExce

ibatis 开发中的经验 (三)ibatis与spring2集成配置

ibatis项目中用到了一些基本配置,需要和spring集成,看了看这些配置大部分同hibernate中是一样的,也比较好理解,只是需要他们的配置中每个类的含义,还有其中的一些细节还是需要我们了解的,知识不在多,而在不断吸收和重复,在使用和练习中加深对各种问题的理解. 读取属性文件配置 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceho

ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解

这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉ibatis xml文件都提供的一些标签,这些标签大部分是用来处理推断.逻辑,使得sql能够动态组装变的更灵活. 在写代码的工作量上ibatis要比hibernate高一些,在你写了服务层后还须要些dao层,dao层实现,然后这些在hibernate中不须要自己写,仅仅写到服务层就能够调用hiber

【ide】MyBatis报错: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:225) at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48) at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65) at org.a

mybatis错误之org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

玩了MyBatis差不多有两年了,中间也玩过MyBatis-Plus,这个MyBatis-Plus其实与MyBatis的区别并不大.今天写博客业务代码的时候,犯一个初学者犯过的错误. 错误信息如下:org.apache.ibatis.binding.BindingException: Invalid bound statement(not found) 通常原因是因为Mapper interface和xml文件的定义对不上,通常需要检查包名.namespace.函数名等. 出现这个错误的原因是我

【java经典框架搭建】Springmvc+Mybatis+Shiro+REST+WebService+JMS+Lucene+Bootstrap

1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库访问)2. 提供高并发JMS消息处理机制3. 所有功能模块化.所有模块服务化.所有服务原子化的方式,提供可拓展的服务模型,使程序稳定运行,永不宕机4. 提供Wink Rest.Webservice服务,故可作为独立服务平台部署 框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + W

【mybatis】mybaits generator 逆向工程的使用

mybatis逆向工程官方网站:http://www.mybatis.org/generator/quickstart.html 准备xml文件.如下generator.xml全部内容 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configurat

Maven项目使用mybatis报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

maven项目使用mybatis时,找不到mapper文件(.xml) 错误信息提示: 项目可以正常运行,但是在有请求到达服务器时(有访问数据库的请求),会出现报错!! 错误原因: mybatis没有找到对应的请求调用持久层的方法 查错方法: 首先检查target-->classes文件夹被dao层文件夹内是否有对应mapper.xml文件,如果有xml文件,则一般是配置文件出现的错误,如果没有xml类型的文件,则是没有拷贝资源文件的原因.下面是对应的解决方法. 1.名称不一致问题 排查步骤:

mybatis Caused by: org.apache.ibatis.reflection.ReflectionException: Error instantiating class .. with invalid types () or values (). Cause: java.lang.NoSuchMethodException: ...&lt;init&gt;()

此类错误需要在无参构造器中调用父类 public Test(){ super(); }