当前位置: 首页 > news >正文

iBatis:又一个O/R Mapping解决方案

iBatis是又一个O/R Mapping解决方案,j2ee的O/R方案真是多,和Hibernate相比,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。

iBatis最大的特点是简单,最新版本2.0(下载),和1.0相比,主要改动在XML配置文件上,不过,只要有SQL基础,相信你不用教程也能看明白。下面我们看一个最简单的例子入门。

我们先建一个表Account,包括字段username,varchar(20), pk和password, varchar(20),随便填入一些数据。然后编写iBatis必须的配置文件sql-map-config.xml,文件名随意,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//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"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>
<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="sun.jdbc.odbc.JdbcOdbcDriver"/>
<property name="JDBC.ConnectionURL" value="jdbc:odbc:Blog"/>
<property name="JDBC.Username" value="admin"/>
<property name="JDBC.Password" value=""/>
</dataSource>

</transactionManager>
<sqlMap resource="Account.xml" />
</sqlMapConfig>


其他部分你不用管它,我是直接copy的示例配置,只需注意红色部分,配置好数据源即可。我用的是Access,所以用JdbcOdbc驱动。如果你用MySQL或其他数据库,更改相应的属性。

然后注意到这个配置文件还引用了一个Account.xml,没错,iBatis把每个需要O/R Mapping的Java对象关联到一个xml配置文件,我们需要把一个Account表映射到一个Account类:

package example;
public class Account {
private String username;
private String password;

public String getUsername() { return username; }
public void setUsername(String username) { this.username=username; }

public String getPassword() { return password; }
public void setPassword(String password) { this.password=password; }
}


编写Account.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"
http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Account">

<select id="getAccount" parameterClass="java.lang.String" resultClass="example.Account">
select * from Account whereusername = #value#
</select>


<insert id="createAccount" parameterClass="example.Account">
insert into Account (username, password)
values ( #username#, #password# )
</insert>

</sqlMap>

我们主要关心红色部分。以<select ...>为例,这里定义了一个查询方法,名字为getAccount,传入参数为String,返回类型resultClass就是example.Account类,select语句相信你已经很熟悉了,#value#是我们将要传进去的String。

<insert...>与之类似,不过注意到#username#和#password#,由于参数是Account类,它们将被Account.getUsername()和Account.getPassword()替换。所以,只要你会写SQL,就能非常容易地写出配置文件。

最后便是如何使用iBatis实现O/R映射。首先初始化iBatis获得一个SqlMapClient对象:

com.ibatis.sqlmap.client.SqlMapClient sqlMap = null;
try {
java.io.Reader reader = om.ibatis.common.resources.Resources.getResourceAsReader ("sql-map-config.xml");
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
}


然后就可以异常方便地使用O/R Mapping了,比如查询username=admin的Account:

try {
Account accout = (Account)sqlMap.queryForObject("getAccount", "admin");
...
}


或者创建一个新的Account:

try {
Account account = new Account();
account.setUsername("micheal");
account.setPassword("1234");
sqlMap.insert("createAccount", account);
}


运行时把两个配置文件和iBatis的3个jar包放到classpath中,要求jdk1.4版本。

总结:iBatis确实简单灵活,上手容易,代码很少,配置稍嫌复杂。不足之处一是没有方便的工具来自动生成xml配置文件,二是没有办法看到生成的SQL语句(还是我没有正确配置?),调试比较麻烦。另外对常见的1:1,1:N关系的支持不如Hibernate。不过,大多数时候iBatis已经完全可以满足我们的需求。Spring很好的集成了iBatis,你可以参考Spring的JPetStore示例。需要注意的是使用iBatis 2.0和1.0有较大区别,主要体现在配置文件上,iBatis 2.0新增了DAO框架,不需要Spring提供的DAO也能很方便地实现DAO模式。

相关文章:

  • 关于对数据库的操作。
  • Recordset对象方法详解
  • 利用lagrange插值法计算函数值
  • css使两个盒子并列_CSS常见面试题
  • [原创]排列问题:每行显示4张图片,如果超过4张就换行
  • layuiajax提交表单控制层代码_3分钟短文:Laravel控制器用法光速入门
  • [转贴]建立高效的数据库连接
  • C语言存数组_C语言|学生成绩管理系统
  • 程序设计之道
  • 通信原理包络是什么意思_通信之路——网桥,网关,交换机,路由器都是什么意思?...
  • iphone屏幕上的圆圈怎么设置_苹果系统升级之后,出现iphone屏幕失灵怎么办?
  • Use Orastress! to test your database
  • win10应用商店打不开_Win10商店中你不知道的好应用汇总说明
  • u 20ubuntu 安装 postfix_U型玻璃在幕墙中的应用(超多案例)
  • 从黑白到黑白
  • ----------
  • @angular/forms 源码解析之双向绑定
  • Gradle 5.0 正式版发布
  • HTTP中的ETag在移动客户端的应用
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Node 版本管理
  • Python_OOP
  • Python学习之路16-使用API
  • Ruby 2.x 源代码分析:扩展 概述
  • vue-cli3搭建项目
  • vuex 笔记整理
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 阿里云应用高可用服务公测发布
  • 对象引论
  • 给Prometheus造假数据的方法
  • 猴子数据域名防封接口降低小说被封的风险
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 入门级的git使用指北
  • 深度学习入门:10门免费线上课程推荐
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 用Canvas画一棵二叉树
  • 数据库巡检项
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​水经微图Web1.5.0版即将上线
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (42)STM32——LCD显示屏实验笔记
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (vue)页面文件上传获取:action地址
  • (一)u-boot-nand.bin的下载
  • (转载)虚函数剖析
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • //解决validator验证插件多个name相同只验证第一的问题
  • /usr/bin/env: node: No such file or directory
  • [ACM] hdu 1201 18岁生日
  • [C/C++]关于C++11中的std::move和std::forward