iBatis 简介:

iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

官网为:http://www.mybatis.org/

二、iBatis的工作原理与流程

iBatis使用简单的xml描述文件将JavaBean,Map实现和基本数据类型的包装类(String,Integer等)映射成JDBC的PreparedStatement的输入参数和ResultSet结果集,流程如下:

1、在sqlMapConfig的XML配置文件中进行数据库连接的配置,XML配置文件名称任意,比如SqlMapConfig.xml

2、在sqlMapConfig的XML配置文件中引用sqlMap的XML配置文件

  <sqlMap resource="User.xml"/>

  <sqlMap url="file://User.xml"/>

3、在sqlMap的XML配置文件中进行SQL的配置,文件名称任意

4、通过SqlMapClientBuilder生成具体的操作sqlMap配置文件中的SQL文的ibatis对象SqlMapClient

  String resource="SqlMapConfig.xml"

  Reader reader=Resources.getResourceAsReader(resource);

  SqlMapClient  sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader);

5、SqlMapClient对象提供函数,函数的参数对应替换sqlMap配置文件中的id,parameter等属性,完成SQL文的执行。

  public List queryForList(String statementName, Object parameterObject, int skipResults, int maxResults)

  statement:SqlMap配置中id属性,parameterObject:sqlMap配置中parameter###属性

搭建iBatis 开发环境:

1 、创建工程,导入相关的jar 包,ibatis.jar 、mysql.jar

2 、编写配置文件:

总属性文件:application-global.properties

总配置文件:SqlMapConfig.xml

每个实体的映射文件(Map 文件):User.xml

application-global.properties

  1. driverClass=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/ibatis
  3. username=root
  4. password=

SqlMapConfig.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2.  
  3. <!DOCTYPE sqlMapConfig
  4. PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
  5. "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
  6.  
  7. <sqlMapConfig>
  8.  
  9. <!-- 引用JDBC属性的配置文件 -->
  10. <properties resource="application-global.properties" />
  11.  
  12. <!-- 默认配置 -->
  13. <settings cacheModelsEnabled="true" enhancementEnabled="true"
  14. lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests=""
  15. maxSessions="" maxTransactions="" useStatementNamespaces="false" />
  16.  
  17. <!-- Configure a built-in transaction manager. If you're using an app server,
  18. you probably want to use its transaction manager and a managed datasource -->
  19. <transactionManager type="JDBC">
  20. <dataSource type="SIMPLE">
  21. <property name="JDBC.Driver" value="${driverClass}" />
  22. <property name="JDBC.ConnectionURL" value="${url}" />
  23. <property name="JDBC.Username" value="${username}" />
  24. <property name="JDBC.Password" value="${password}" />
  25. </dataSource>
  26. </transactionManager>
  27.  
  28. <!-- 这里可以写多个实体的映射文件 -->
  29. <sqlMap resource="User.xml" />
  30.  
  31. </sqlMapConfig>

User.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <!DOCTYPE sqlMap
  4. PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
  5. "http://ibatis.apache.org/dtd/sql-map-2.dtd">
  6.  
  7. <sqlMap namespace="user">
  8.  
  9. <typeAlias alias="User" type="org.apache.ibatis.bo.User" />
  10.  
  11. <insert id="insertUser" parameterClass="User">
  12. insert into user values (#id#,#name#,#sex#)
  13. </insert>
  14.  
  15. <delete id="deleteById" parameterClass="int">
  16. delete from user where id=#id#
  17. </delete>
  18.  
  19. <update id="updateUser" parameterClass="User">
  20. update user set name=#name#,sex=#sex# where id=#id#
  21. </update>
  22.  
  23. <select id="queryById" parameterClass="int" resultClass="User">
  24. select * from user where id=#id#
  25. </select>
  26.  
  27. <select id="queryAllUsers" resultClass="User">
  28. select * from user
  29. </select>
  30. </sqlMap>

User.java

  1. package org.apache.ibatis.bo;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5.  
  6. public class User implements Serializable {
  7.  
  8. /**
  9. *
  10. */
  11. private static final long serialVersionUID = -5560728144383386239L;
  12.  
  13. int id;
  14. String name;
  15. int sex;
  16. List<Role> roles;
  17.  
  18. public int getId() {
  19. return id;
  20. }
  21.  
  22. public void setId(int id) {
  23. this.id = id;
  24. }
  25.  
  26. public String getName() {
  27. return name;
  28. }
  29.  
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33.  
  34. public int getSex() {
  35. return sex;
  36. }
  37.  
  38. public void setSex(int sex) {
  39. this.sex = sex;
  40. }
  41.  
  42. public List<Role> getRoles() {
  43. return roles;
  44. }
  45.  
  46. public void setRoles(List<Role> roles) {
  47. this.roles = roles;
  48. }
  49.  
  50. @Override
  51. public String toString() {
  52. return "id=" + id + ",name=" + name + ",sex=" + sex;
  53. }
  54. }

IbatisUtils.java

  1. package org.apache.ibatis.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.Reader;
  5. import java.sql.SQLException;
  6. import java.util.List;
  7.  
  8. import org.apache.ibatis.bo.User;
  9.  
  10. import com.ibatis.common.resources.Resources;
  11. import com.ibatis.sqlmap.client.SqlMapClient;
  12. import com.ibatis.sqlmap.client.SqlMapClientBuilder;
  13.  
  14. /**
  15. * This is not a best practices class. It's just an example to give you an idea
  16. * of how iBATIS works. For a more complete example, see JPetStore 5.0 at
  17. * http://www.ibatis.com.
  18. */
  19. public class IBatisUtils {
  20.  
  21. /**
  22. * SqlMapClient instances are thread safe, so you only need one. In this
  23. * case, we'll use a static singleton. So sue me. ;-)
  24. */
  25. private static SqlMapClient sqlMapper;
  26.  
  27. /**
  28. * It's not a good idea to put code that can fail in a class initializer,
  29. * but for sake of argument, here's how you configure an SQL Map.
  30. */
  31. static {
  32. try {
  33. Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
  34. sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
  35. reader.close();
  36. } catch (IOException e) {
  37. // Fail fast.
  38. throw new RuntimeException(
  39. "Something bad happened while building the SqlMapClient instance."
  40. + e.getMessage(), e);
  41. }
  42. }
  43.  
  44. public static void createUser(String paramString) throws SQLException {
  45. sqlMapper.update(paramString, null);
  46. }
  47.  
  48. public static void dropUser(String paramString) throws SQLException {
  49. sqlMapper.update(paramString, null);
  50. }
  51.  
  52. public static List<?> queryAllUsers(String paramString) throws SQLException {
  53. return sqlMapper.queryForList(paramString);
  54. }
  55.  
  56. public static User selectUserById(String paramString, int id)
  57. throws SQLException {
  58. return (User) sqlMapper.queryForObject(paramString, id);
  59. }
  60.  
  61. public static void insertUser(String paramString, User user)
  62. throws SQLException {
  63. sqlMapper.insert(paramString, user);
  64. }
  65.  
  66. public static void updateUser(String paramString, User user)
  67. throws SQLException {
  68. sqlMapper.update(paramString, user);
  69. }
  70.  
  71. public static void deleteUser(String paramString, int id)
  72. throws SQLException {
  73. sqlMapper.delete(paramString, id);
  74. }
  75.  
  76. }

Main.java

  1. package org.apache.ibatis.test;
  2.  
  3. import java.sql.SQLException;
  4. import java.util.Arrays;
  5. import java.util.List;
  6.  
  7. import org.apache.ibatis.bo.User;
  8. import org.apache.ibatis.util.IBatisUtils;
  9.  
  10. public class Main {
  11.  
  12. public void insertUser() throws SQLException {
  13. User user = new User();
  14. user.setId();
  15. user.setName("张三");
  16. user.setSex();
  17. IBatisUtils.insertUser("insertUser", user);
  18. System.out.println("insert success!, user = " + user);
  19. }
  20.  
  21. private void queryAllUsers() throws SQLException {
  22. List<?> list = IBatisUtils.queryAllUsers("queryAllUsers");
  23. for (int i = ; i < list.size(); i++) {
  24. User user = (User) list.get(i);
  25. System.out.println(user);
  26. }
  27. System.out.println(Arrays.toString(list.toArray()));
  28. }
  29.  
  30. public static void main(String[] args) {
  31. Main main = new Main();
  32. try {
  33. main.queryAllUsers();
  34. } catch (SQLException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38.  
  39. }

至此,测试结束

FAQ:

1、com.ibatis.sqlmap.client.SqlMapException: There is already a statement named xxx in this SqlMap.

  1. Exception in thread "main" java.lang.ExceptionInInitializerError
  2. at org.apache.ibatis.data.Main.selectAllAccounts(Main.java:23)
  3. at org.apache.ibatis.data.Main.main(Main.java:59)
  4. Caused by: java.lang.RuntimeException: Error occurred.
    Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'.
    Cause: com.ibatis.sqlmap.client.SqlMapException: There is already a statement named selectById in this SqlMap.
  5. at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:89)
  6. at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:63)
  7. at org.apache.ibatis.data.IBatisUtils.<clinit>(IBatisUtils.java:35)
  8. ... 2 more

这个是因为存在相同的SQL ID

解决方案如下:

  1. <!-- 启用命名空间 -->
    <settings useStatementNamespaces="true" />

useStatementNamespaces
如果启用本属性,必须使用全限定名来引用 mapped useStatementNamespaces statement

Mapped statement 的全限定名由 sql-map 的名称和 mapped-statement 的名称合成。例如: queryForObject("sqlMapName.statementName");
缺省值:false(禁用)

2、org.xml.sax.SAXParseException: The content ofelement type “sqlMapConfig” must match“(properties?,settings?,resultObjectFactory?,ypeAlias*,typeHandler*,transactionManager?,sqlMap+)+”

  1. Exception in thread "main" java.lang.ExceptionInInitializerError
  2. at org.apache.ibatis.data.Main.selectAllAccounts(Main.java:23)
  3. at org.apache.ibatis.data.Main.main(Main.java:59)
  4. Caused by: java.lang.RuntimeException: Error occurred. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: org.xml.sax.SAXParseException: The content of element type "sqlMapConfig" must match "(properties?,settings?,resultObjectFactory?,typeAlias*,typeHandler*,transactionManager?,sqlMap+)+".
  5. at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:89)
  6. at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:63)
  7. at org.apache.ibatis.data.IBatisUtils.<clinit>(IBatisUtils.java:35)
  8. ... 2 more
  9. Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: org.xml.sax.SAXParseException: The content of element type "sqlMapConfig" must match "(properties?,settings?,resultObjectFactory?,typeAlias*,typeHandler*,transactionManager?,sqlMap+)+".
  10. at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:53)
  11. at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:86)
  12. ... 4 more
  13. Caused by: org.xml.sax.SAXParseException: The content of element type "sqlMapConfig" must match "(properties?,settings?,resultObjectFactory?,typeAlias*,typeHandler*,transactionManager?,sqlMap+)+".
  14. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
  15. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
  16. at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
  17. at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
  18. at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(XMLDTDValidator.java:2017)
  19. at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(XMLDTDValidator.java:901)
  20. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
  21. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939)
  22. at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
  23. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
  24. at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
  25. at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
  26. at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
  27. at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:232)
  28. at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
  29. at com.ibatis.common.xml.NodeletParser.createDocument(NodeletParser.java:157)
  30. at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:50)
  31. ... 5 more

这个是因为ibatis配置文件sqlMapConfig的属性是有顺序的,配置顺序properties,settings,resultObjectFactory,typeAlias*,typeHandler*,transactionManager,sqlMap 。

附录:

1、SqlMapConfig.xml中的setting属性

<settings
cacheModelsEnabled="true"
lazyLoadingEnabled="false"
enhancementEnabled="true"
maxSessions="64"
maxTransactions="8"
maxRequests="128"
useStatementNamespaces="false"
classInfoCacheEnabled="true"
errorTracingEnabled="true"
defaultStatementTimeout=""
statementCachingEnabled="true"
/>
<!--
maxRequests
同时执行 SQL 语句的最大线程数。大于这个值的线程将阻塞直到另一个线程执行完成。不同的 DBMS有不同的限制值,但任何数据库都有这些限制。通常这个值应该至少是maxTransactions(参见以下)的 10 倍,并且总是大于 maxSessions 和maxTranactions。减小这个参数值通常能提高性能。

例如:maxRequests=“256”
缺省值:512

maxSessions
同一时间内活动的最大 session 数。一个 session 可以maxSessions是代码请求的显式 session,也可以是当线程使用SqlMapClient 实例(即执行一条语句)自动获得的session。它应该总是大于或等于 maxTransactions 并小于 maxRequests。减小这个参数值通常能减少内存使用。

例如:maxSessions=“64”
缺省值:128

maxTransactions
同时进入 SqlMapClient.startTransaction()的最大线程maxTransactions 数。大于这个值的线程将阻塞直到另一个线程退出。不同的 DBMS 有不同的限制值,但任何数据库都有这些限制。这个参数值应该总是小于或等于maxSessions 并总是远远小于 maxRequests。减小这个参数值通常能提高性能。

例如:maxTransactions=“16”
缺省值:32

cacheModelsEnabled
全局性地启用或禁用 SqlMapClient 的所有缓存cacheModelsEnabled model。调试程序时使用。

例如:cacheModelsEnabled=“true”
缺省值:true(启用)

lazyLoadingEnabled
全局性地启用或禁用SqlMapClient的所有延迟加载。lazyLoadingEnabled 调试程序时使用。
例子:lazyLoadingEnabled=“true”
缺省值:true(启用)

enhancementEnabled
全局性地启用或禁用运行时字节码增强,以优化访enhancementEnabled
问Java Bean属性的性能,同时优化延迟加载的性能。

例子:enhancementEnabled=“true”
缺省值:false(禁用)

useStatementNamespaces
如果启用本属性,必须使用全限定名来引用 mapped useStatementNamespaces
statement。Mapped statement 的全限定名由 sql-map 的名称和 mapped-statement 的名称合成。例如: queryForObject("sqlMapName.statementName");

例如:useStatementNamespaces=“false”
缺省值:false(禁用)

defaultStatementTimeout
此设置值必须为一个整数,作为JDBC连接超时的时间,这个值可以被任意一个映射文件的statement属性来重新设置,
如果没有指明,查询将无超时时间限制除非在映射文件中设置statement属性值。被设置的值以秒为单位等待连接失效

classInfoCacheEnabled 
With this setting enabled, iBATIS will maintain a cache of introspected
classes. This will lead to a significant reduction in startup time if many
classes are reused.
例如: classInfoCacheEnabled=“true”
缺省值: true (启用)

statementCachingEnabled (iBATIS 2.3.0以后版本中有)
With this setting enabled, iBATIS will maintain a local cache of
prepared statements. This can lead to significant performance
improvements.
例如: statementCachingEnabled=“true”
缺省值: true (启用)

IBatis入门的更多相关文章

  1. 一个简单的iBatis入门例子

    一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...

  2. Ibatis入门基本语法(转) good

    Ibatis入门基本语法 一个项目中在写ibatis中的sql语句时,where user_id in (#user_id_list# ), 运行时总是不行,后来上网查了查,才知道这里不该用#,而应该 ...

  3. ibatis入门教程

    转载自  http://www.cnblogs.com/ycxyyzw/archive/2012/10/13/2722567.html iBatis 简介: iBatis 是apache 的一个开源项 ...

  4. Ibatis入门基本语法

    1.       Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...

  5. ibatis 入门

     iBatis 简单介绍: iBatis 是apache 的一个开源项目.一个O/R Mapping 解决方式,iBatis 最大的特点就是小巧.上手非常快.假设不须要太多复杂的功能.iBatis ...

  6. ibatis入门教程一

    这几天研究ibatis玩,参考一篇贴子进行安装配置:蓝雪森林 选择这个帖子来跟随配置是因为这个帖子看着比较干净,但是我仍旧在配置得过程中出现了好几个问题,所以我决定在这个帖子的基础上将更多细节加上,做 ...

  7. ibatis入门实例(完整)

    一:首先展示一下我的web文件结构,首先导入Ibatis所需jar和数据库驱动,从第二步开始跟着笔者一步步来 二:数据库建测试表 CREATE TABLE STUDENT ( ID NUMBER(5) ...

  8. Java后台技术IBATIS入门

    做过.net后台开发的同志一定用过Entity FrameWork,该框架实现了实体Entity到数据库行的映射,通过操作实体DataSet,就能够直接同步修改到数据库.但是Java暂时没有类似的技术 ...

  9. IBatis和Hibernate区别

    1. 简介 Hibernate是当前最流行的O/R mapping框架.它出身于sf.net,现在已经成为Jboss的一部分了.iBATIS是另外一种优秀的O/R mapping框架,现已改名叫myB ...

随机推荐

  1. Django performance

    Reference: https://impythonist.wordpress.com/2016/02/21/building-high-performance-django-systems/ Th ...

  2. TCP carries HTTP data in order, and without corruption

    wTCP/IP承载几乎所有的HTTP通信. HTTP The Definitive Guide

  3. Mysql 多列形成主键(复合主键 )

    什么是数据表的复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成 比如 create table test (    name varchar(19),    id number,    ...

  4. CART分类与回归树 学习笔记

    CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...

  5. Redis 排行榜 自己简单练习

    <?php class Ranks{ const PREFIX = 'zhengban'; protected $redis = ''; /* 初始化 */ public function __ ...

  6. DEV控件的Gridview1

    DEV控件的Gridview小技巧总结 1.设置Gridview控件的某列不可编辑 this.gridData.gridView1.Columns["change_date"].O ...

  7. 使用(Drawable)资源——LayerDrawable资源

    与StateListDrawable有点类似,LayerDrawable也可包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会 ...

  8. SecureCRT 使用

    1. 连接linux 服务器 http://www.cnblogs.com/SimonGao/p/4959274.html

  9. Refused to set unsafe header "Connection"

    参考 http://stackoverflow.com/questions/7210507/ajax-post-error-refused-to-set-unsafe-header-connectio ...

  10. JQuery hover toggle事件使用

    JQuery hover toggle事件使用: <%@ page language="java" import="java.util.*" pageEn ...