简介

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

与 Hibernate 相比 iBatis 是一个半自动化的 ORM 框架,它没有像 Hibernate 一样将对象和表映射起来,而是将对象和 SQL 语句映射起来。


处理流程

从上图可以看出 ibatis 将请求 Java Object(如 JavaBean、Map、基本类型、XML) 加上待执行的 SQL 语句映射成 MappedStatement,解析 MappedStatement 得到 SQL 和 Object 后 组装 ,接着通过 JDBC 查询得到结果后并组装成 Java Object 返回给程序。

具体流程:

(1)加载配置并初始化
触发条件:加载配置文件
处理过程:将 SQL 的配置信息加载成为一个个 MappedStatement 对象(包括了传入参数映射配置、执行的 SQL 语句、结果映射配置),存储在内存中。

(2)接收调用请求
触发条件:调用 Mybatis 提供的API
传入参数:为 SQL 的 ID 和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。

(3)处理操作请求
触发条件:API 接口层传递请求过来
传入参数:为 SQL 的 ID 和传入参数对象
处理过程:

  • 根据 SQL 的 ID 查找对应的 MappedStatement 对象。
  • 根据传入参数对象解析 MappedStatement 对象,得到最终要执行的 SQL 和执行传入参数。
  • 获取数据库连接,根据得到的最终 SQL 语句和执行传入参数到数据库执行,并得到执行结果
  • 根据 MappedStatement 对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
  • 释放连接资源。
  • 返回处理结果将最终的处理结果返回。

架构

  • API 接口层:提供给外部使用的接口 API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

例子:

现有一 APP 中需要对联系方式 Contact 执行 ACID 操作,Contact 包括姓名、性别、电话、地址。我们通过 Spring 和 ibatis 来操控它。

数据库表如下图:


通过 Maven 配置依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.ourpointeer</groupId><artifactId>Contact</artifactId><version>1.0-SNAPSHOT</version><!-- http://mvnrepository.com/artifact/org.springframework/spring-context --><dependencies><!-- http://mvnrepository.com/artifact/org.springframework/spring-test --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>3.0.5.RELEASE</version></dependency><!-- http://mvnrepository.com/artifact/org.springframework/spring-orm --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>3.0.5.RELEASE</version></dependency><!-- http://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.0.5.RELEASE</version></dependency><!-- http://mvnrepository.com/artifact/org.apache.ibatis/ibatis-sqlmap --><dependency><groupId>org.apache.ibatis</groupId><artifactId>ibatis-sqlmap</artifactId><version>2.3.4.726</version><scope>compile</scope></dependency><!-- http://mvnrepository.com/artifact/com.ibatis/ibatis2-common --><dependency><groupId>com.ibatis</groupId><artifactId>ibatis2-common</artifactId><version>2.1.7.597</version></dependency><!-- http://mvnrepository.com/artifact/org.apache.ibatis/ibatis-core --><dependency><groupId>org.apache.ibatis</groupId><artifactId>ibatis-core</artifactId><version>3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.14</version><type>jar</type><scope>compile</scope></dependency><!--bonecp 连接池--><dependency><groupId>com.jolbox</groupId><artifactId>bonecp</artifactId><version>0.7.1.RELEASE</version></dependency><!--slf4j 系统日志--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.0.0</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.0</version><type>jar</type><scope>compile</scope></dependency><!-- http://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency></dependencies><repositories><repository><releases><updatePolicy>always</updatePolicy></releases><snapshots><updatePolicy>always</updatePolicy></snapshots><id>Jolbox</id><name>Jolbox Repositories</name><url>http://jolbox.com/bonecp/downloads/maven</url></repository></repositories>
</project>

联系人方式类:

联系人方式类 field 和数据库表字段是一一对应的。

public class Contact {private Long id;private String name;private String gender;private String mobile;private String address;public void setAddress(String address) {this.address = address;}public void setMobile(String mobile) {this.mobile = mobile;}public void setGender(String gender) {this.gender = gender;}public void setName(String name) {this.name = name;}public void setId(Long id) {this.id = id;}public Contact() {super();}public Contact(String name, String gender, String mobile, String address) {this.name = name;this.mobile = mobile;this.gender = gender;this.address = address;}@Overridepublic String toString() {return "Contact{" +"id=" + id +", name='" + name + '\'' +", gender='" + gender + '\'' +", mobile='" + mobile + '\'' +", address='" + address + '\'' +'}';}
}

DAO 类:

public class BaseDAO {/* Spring 对 ORM 提供支持,包括对 ibatis 提供的带有增删改查操作的模板* 内部实际上是对 ibatis SqlMapClient 的封装*/private SqlMapClientTemplate sqlMapClientTemplate;public SqlMapClientTemplate getSqlMapClientTemplate() {return sqlMapClientTemplate;}public void setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate) {this.sqlMapClientTemplate = sqlMapClientTemplate;}
}

DAO 接口:

public interface ContactDAO  {/* 联系人 DAO 提供对 contact 的操作 */public Contact getContactById(Map<Object, Object> parameterMap);public int insertContact(Contact contact);public int updateContact(Contact contact);
}

DAO 实现类:

public class ContactDAOImpl extends BaseDAO implements ContactDAO {public Contact getContactById(Map<Object, Object> paramenterMap) {return (Contact) getSqlMapClientTemplate().queryForObject("getContactById", paramenterMap);}public int insertContact(Contact contact) {return getSqlMapClientTemplate().update("insertContact", contact);}public int updateContact(Contact contact) {return getSqlMapClientTemplate().update("updateContact", contact);}
}

传入参数为 Map 对象:

public class ParameterMap extends HashMap<Object, Object> {private static final long serialVersionUID = 1L;/** 使我们可以通过如 Name, XXX, gender, XXX 形式来组装 Map */public ParameterMap(Object... parameters) {for (int i = 0; i < parameters.length - 1; i += 2) {super.put(parameters[i], parameters[i + 1]);}}
}

Service 类:

public class ContactService {private ContactDAO contactDAO;public ContactDAO getContactDAO() {return contactDAO;}public void setContactDAO(ContactDAO contactDAO) {this.contactDAO = contactDAO;}public Contact getContactById(long id) {Map<Object, Object> parameterMap = new ParameterMap("ID", id);return getContactDAO().getContactById(parameterMap);}public int insertContact(Contact contact) {return getContactDAO().insertContact(contact);}public int updateContact(Contact contact) {return getContactDAO().updateContact(contact);}
}

测试类:

public class App {private static final Logger logger = (Logger) LoggerFactory.getLogger(App.class);public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//        查询操作
//        ContactService contactService = (ContactService) context
//                .getBean("contactService");
//        Contact contact = contactService.getContactById(1);
//        System.out.println(contact.toString());
//
//        插入操作
//        ContactService contactService = (ContactService) context.getBean("contactService");
//        Contact contact = new Contact("Tom", "male", "188222222", "Dalian");
//        int recordInsertNum = contactService.insertContact(contact);
//        System.out.println(recordInsertNum);//        更新操作ContactService contactService = (ContactService) context.getBean("contactService");Contact contact = contactService.getContactById(1);System.out.println(contact);contact.setAddress("hehehehehehehe");contactService.updateContact(contact);}
}

Spring 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"destroy-method="close"><property name="driverClass" value="com.mysql.jdbc.Driver" /><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" /><property name="username" value="root" /><property name="password" value="wangweihao123" /><property name="maxConnectionsPerPartition" value="30" /><property name="minConnectionsPerPartition" value="10" /><property name="partitionCount" value="3" /><property name="acquireIncrement" value="5" /><property name="statementsCacheSize" value="100" /><property name="releaseHelperThreads" value="3" /></bean><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="sqlMapConfig.xml" /><property name="dataSource" ref="dataSource" /></bean><bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"><constructor-arg><ref bean="sqlMapClient" /></constructor-arg></bean><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource"><ref bean="dataSource" /></property></bean><bean id="baseDAO" class="org.ourpoineer.contact.common.BaseDAO"><property name="sqlMapClientTemplate" ref="sqlMapClientTemplate" /></bean><bean id="contactDAO" class="org.ourpoineer.contact.dao.impl.ContactDAOImpl"parent="baseDAO" /><bean id="contactService" class="org.ourpoineer.contact.service.ContactService"><property name="contactDAO" ref="contactDAO" /></bean></beans>

ibatis 配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfigPUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN""http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig><settings cacheModelsEnabled="true" enhancementEnabled="true"lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"maxSessions="10" maxTransactions="5" /><sqlMap resource="contact.xml" />
</sqlMapConfig>

sqlMap 配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap><typeAlias alias="parameterMap" type="org.ourpoineer.contact.common.ParameterMap" /><typeAlias alias="contact" type="org.ourpoineer.contact.bean.Contact" /><select id="getContactById" parameterClass="parameterMap"resultClass="contact">select *from contactwhere ID=#ID:LONG#</select><!--id 相当于给 sqlmap 对象起了个名字--><!--该方式是以bean的方式实现,name,gender,mobile都要和bean对应--><insert id="insertContact" parameterClass="contact">INSERT INTOcontact(NAME, GENDER, MOBILE, ADDRESS)VALUES(#name:VARCHAR#, #gender:VARCHAR#, #mobile:VARCHAR#, #address:VARCHAR#)</insert><update id="updateContact" parameterClass="contact">UPDATE contactset NAME=#name:VARCHAR#, GENDER=#gender:VARCHAR#, MOBILE=#mobile:VARCHAR#, ADDRESS=#address:VARCHAR#WHERE ID=#id:INT#</update>
</sqlMap>

参考:

Mybatis 中文文档
Mybatis 百度百科

ibatis 使用入门相关推荐

  1. ibatis轻松入门

    近日,由于公司项目应用开发的逻辑层使用的是iBatis.上网查了些资料,自己写了点demo入门.感觉良好.iBatis实在是比Hibernate很容易入门,贡献出来与各路菜鸟分享(后文附源码),希望得 ...

  2. iBatis简单入门教程

    iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足 ...

  3. 计算机科学精彩帖子收集

    linux源码 LXR 源自"the Linux Cross Referencer",中间的"X"形象地代表了"Cross".与 Sourc ...

  4. Mybatis源码分析: MapperMethod功能讲解

    canmengqian </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> ...

  5. 孔浩java爱酷网_JAVA

    http://www.scalachina.com/ scala社区 http://blog.csdn.net/mapdigit/article/details/21878083 Scala教程 ht ...

  6. 计算机科学精彩帖子收集--JAVA和分布式专栏

    之前收集了一个计算机科学精彩帖子收集,渐渐发现帖子越来越大,所以现在干脆把Java和分布式的部分单独一贴. Java jdk下载 http://openjdk.java.net/projects/jd ...

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

    一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. ibatis-2.3.4.726.jar ojdbc14.jar 2.创建类com/ ...

  8. iBatis 的简单入门

    iBATIS一词来源于"internet"和"abatis"的组合,于2010年6月16号被谷歌托管,改名为MyBatis.是一个基于SQL映射支持Java和· ...

  9. IBATIS入门小例子

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

最新文章

  1. TCP/IP详解--第十六章
  2. SQL Server存储过程(转载)
  3. 斐波那契问题的递归和动态规划
  4. 【Python】创建长度为n的全0列表和全1列表
  5. CVPR 2020 | 反传统的无监督人脸旋转方案:旋转-渲染
  6. php 清除英文字母,计算器清除键的字母是什么
  7. jq 通过标签名称获取标签_通过微盛·企微管家如何自动给客户打标签?
  8. 农村民间借贷一分利息,有借条受法律保护吗?
  9. Android堆栈分析
  10. linux图标大全——这些你认识多少?
  11. 认识并学会springCloud的使用
  12. 华为harmonyos公测,华为开启HarmonyOS2.0开发者Beta公测招募第二期
  13. Unix网络编程卷1源代码使用
  14. MATLAB非线性可视化之线性系统相图
  15. ubuntu下播放h264和h265工具vlc的安装使用
  16. matlab 深度网络,深度信念网络matlab代码
  17. android 汉字转字节,安卓汉字转拼音
  18. 《黑客大曝光:移动应用安全揭秘及防护措施》一2.1 基础移动网络功能
  19. C语言#if、##ifdef、#ifndef的用法详解,C语言条件编译详解
  20. Java使用jdbc连接sqlserver2000与2005的语句差别

热门文章

  1. Linux入职基础-3.6_ramdisk提升Apache性能实例(运维必懂)
  2. 【移动端聊天功能模板】Vue实现H5聊天系统,实现上下固定中间滚动布局,微信授权功能,自动滚动到底部【详细注释,一看就会】
  3. 神经网络激活函数及其Katex公式代码模板合集
  4. 使用JOL工具计算Java对象的大小
  5. JOL探索synchronized锁-子路老师
  6. JSP内置对象和四大作用域
  7. 动态数码管显示(单片机)
  8. 基于深度学习的遥感测绘行业解决方案
  9. 哪里可以下载Holer软件包
  10. 你写一个web网页小游戏