- 浏览: 128015 次
- 性别:
- 来自: 北京
最新评论
-
C_J:
有必要这么鸡冻咩?
编写自己的ClassLoader知识点 -
jason61719:
你这不是说了等于没说吗……就解析个loadClass(),谁不 ...
编写自己的ClassLoader知识点 -
jiming:
tedeyang 写道很好的改进,不过话说回来,mybatis ...
开源,从关注产品社区做起(ibatis3.x的最近一个issue展示) -
C_J:
独爱Java 写道好像实际用处并不是很大,只是多了解了有这个东 ...
Java内存模型笔记 -
独爱Java:
好像实际用处并不是很大,只是多了解了有这个东西而已。。。
Java内存模型笔记
Accessplan包
UML:
接口和实现类的组织结构如下(很典型的3层,1层Interface,2层abstract,3层实现class:
Accessplan是用来保存JavaBean对象的Method[]、成员变量类型Class[]的工具类。
protected Class clazz; protected String[] propertyNames; protected ClassInfo info;
Accessplan对外只提供个Factory,这种“封闭”设计可以借鉴:
对外接口调用如下:
parameterPlan = AccessPlanFactory.getAccessPlan(parameterMap.getParameterClass(), parameterPropNames);
其中parameterMap.getParameterClass(),是需要映射的CLASS,就是XML里parameterXXX里的类,后面那个是类的成员变量名,其中ParameterMapping是映射元素类(在Mapping模块详细介绍),如下:
// 从某个映射对象中取出所有元素
ParameterMapping[] parameterMappings = parameterMap.getParameterMappings();
String[] parameterPropNames = new String[parameterMappings.length];
for (int i = 0; i < parameterPropNames.length; i++) {
// 从元素中取出被映射对象的成员名
parameterPropNames[i] = parameterMappings[i].getPropertyName();
}
AccessPlanFactory取出的是AccessPlan接口,抽象类为:BaseAccessPlan,总计有4种实现类:ComplexAccessPlan、EnhancedPropertyAccessPlan、MapAccessPlan、PropertyAccessPlan。
其中用到ClassInfo这个工具类(如果没有缓存的话,就为每个Class配属都new一个ClassInfo工具类),另外接口为:ClassInfo.getInstance(clazz),其中clazz就是parameterMap.getParameterClass()传递过来的。
如下:
public static ClassInfo getInstance(Class clazz) { if (cacheEnabled) {//这里的ClassInfo是可缓存的(缓存到一个static synchronizedMap里),并不是每次都申请新的ClassInfo对象 synchronized (clazz) { ClassInfo cache = (ClassInfo) CLASS_INFO_MAP.get(clazz); if (cache == null) { cache = new ClassInfo(clazz); CLASS_INFO_MAP.put(clazz, cache); } return cache; } } else { return new ClassInfo(clazz); } }
ClassInfo的作用是加载clazz类(POJO)的set*或get*或is方法及方法的参数(Class[])对象存储到Map里。为POJO的后续处理做准备。(看到其中取set*方法对象判断语句为:if (name.startsWith("set") && name.length() > 3&&methods[i].getParameterTypes().length == 1),记得一定要name.length()>3,并这里参数为1)
另外 name = null;// help GC
PropertyAccessPlan(for working with beans)和MapAccessPlan(for working with Maps):
上面BaseAccessPlan实现了获取set,get方法以及她们的参数类型。那么剩下工作就需要赋值了。AccessPlan的实现类各自实现setProperties和getProperties。
其中setProperties可借鉴下:
public void setProperties(Object object, Object[] values) { int i = 0; try { Object[] arg = new Object[1]; for (i = 0; i < propertyNames.length; i++) { arg[0] = values[i]; try { setters[i].invoke(object, arg); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } } } catch (Throwable t) { throw new RuntimeException("Error setting property '" + setters[i].getName() + "' of '" + object + "'. Cause: " + t, t); } }
public Object[] getProperties(Object object) { int i = 0; Object[] values = new Object[propertyNames.length]; try { for (i = 0; i < propertyNames.length; i++) { try { values[i] = getters[i].invoke(object, NO_ARGUMENTS); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } } } catch (Throwable t) { throw new RuntimeException("Error getting property '" + getters[i].getName() + "' of '" + object + "'. Cause: " + t, t); } return values; }
注意到所有的AccessPlan都没有包含POJO的实例,包含的是POJO的某些Method[]和Class[],为什么呢?
整个AccessPlan类似一个很大的工具类,用于给POJO进行赋值和取值操作。
Exchange Package包
UML
dataExchange用于数据交换的工具类,主要工作是对象的获取和赋值,结构很简约,而涉及的对象有Primitive,POJO,List,MAP,DOM,复杂对象。
public void initialize(Map properties); public Object[] getData(RequestScope request, ParameterMap parameterMap(对象描述类), Object parameterObject(对象实例)); public Object setData(RequestScope request, ResultMap resultMap(描述类), Object resultObject(对象实例), Object[] values(需要赋的值));
这里参数有 parameterMap和parameterObject是为了“定制对象”,简单说就是parameterMap描述了需要获取和赋值的成员变量名,并不是parameterObject所有的成员我都需要获取,从而实现定制,比如ibatis的sqlXML写成如下形式:
<insert id="test" parameterClass="com.company.cjcj.User"> insert into t_user values(#id#,#name#) </insert>
这里只需要获取User这个POJO的id和name就够了。
基本实现思路:
getData()
public Object[] getData(RequestScope request, ParameterMap parameterMap, Object parameterObject) { // 获取参数实例需要获取的成员变量名 Object result[]=new Object[变量个数]; for(int i=0;i<个数;i++{ // 从parameterObject中取出相应的值 } }
setData()
public Object setData(RequestScope request, ParameterMap parameterMap, Object parameterObject, Object[] values) { // 获取需要赋值的变量名 for(int i=0;i<个数;i++){ // 对需要复制的每个变量进行赋值values[i] } }
实现类:
PrimitiveDataExchange(如果是单一对象)
public Object[] getData(RequestScope request, ParameterMap parameterMap, Object parameterObject),很简单把parameterObject直接赋值给Object[]
JavaBeanDataExchange(如果是POJO对象)
借助AccessPlan工具类,进行赋值和取值操作,利用反射知识匹配方法名获取、赋值对象成员变量,详情见AccessPlan实现。
ListDataExchange(如果是List)
直接调用List的get和set方法。
MapDataExchange(如果是Map)
直接调用Map的get和put方法。
DomDataExchange(如果是Document)
ibatis为处理dom对象实现了DomProbe类(commons.beans包)来处理,利用的是w3c.dom的包来处理dom对象,从而实现取值和赋值操作。
ComplexDataExchange(复杂对象)
发表评论
-
iOS入门(ongoing)
2012-09-13 11:32 1302Record it: The overview of ... -
Stuff about Android
2011-07-09 16:15 1067Foreword: long time ... -
JQuery初体验(Demo)
2011-05-22 13:43 1459Demo:Show <meta content ... -
Java内存模型笔记
2011-04-13 15:48 1539题记: 看到C/C++ ... -
Radiant_The Popular Ruby's CMS Demo篇
2011-04-02 14:49 1243题记: 上篇 记录我第一次安装Rodiant经过和 ... -
Radiant_The Popular Ruby’s CMS安装篇
2011-03-28 00:48 1281题记: 今天第一次参加JE的线下活动,robbin等 ... -
关于Azul 并发垃圾回收器
2011-03-26 14:40 1320题记: 总感觉JE讨论的帖子的东西都比较滞后,所以会 ... -
phpCMS & jQuery是我该做的(阉割了)
2011-02-27 23:02 81WD讲究以plugin挂载为结构,我需要构造一个p ... -
我的玩意:J2ME的Criteria初探
2011-01-20 21:59 1020题记: 前几天跟初中同学聊天,他问我能不能做一个GP ... -
编写自己的ClassLoader知识点
2011-01-13 14:41 1873题记: 看到InfoQ关于ClassLoader的文 ... -
周末好玩,用短信控制你的计算机
2011-01-10 16:34 2991Snapshot: 详情 ... -
About Dock Plugin on Mac
2010-11-21 22:47 1465题记: 第一次接触MAC的开发..... ... -
可变hashcode的隐患和序列化安全
2010-10-25 00:55 1372可变hashcode的隐患 为识别对象,JDK ... -
体验OSGi(helloworld.jar)—富app的热拔插
2010-10-18 23:22 2440记得以前工作的时候,有天direct manager问 ... -
MongoDB on DAO with Java Language
2010-08-26 19:17 1431A Quick Tour Using the Java d ... -
Getting Start on Mongodb
2010-08-26 01:29 1511题记: 最近老和同学聊到non-relational ... -
Java Media Framework本地玩转摄像头
2010-08-04 00:57 17371、简介The JavaTM Media Framework ... -
从WeakLogHandler应用看Java的引用、引用队列
2010-06-14 00:58 1501题记: 前几天讨论到WeakHashMap(这个是个弱引用的 ... -
《重构》读书笔记
2010-05-09 00:05 1047Martin Fowler于2003年出版 ... -
RPC之WebServices&RMI&JMS,phprpc框架?(待续)
2010-05-06 22:31 55前段时间写过基本的WebServices,也没再做深入 ...
相关推荐
《深入解析iBatis 2.3源码》 iBatis,作为一款经典的Java持久层框架,以其轻量级、灵活的特性深受开发者喜爱。本文将深入剖析iBatis 2.3的源码,帮助读者理解其内部机制,提升开发与优化数据库访问的能力。 1. **...
【标题】"ibatis2.3源码"指的是开源的SQL映射框架iBATIS的2.3版本的源代码。iBATIS是Java平台上的一种轻量级持久层框架,它将SQL语句与Java代码分离,使得开发者可以更加灵活地处理数据库操作。 【描述】中的"可以...
这个"ibatis2.3例子代码"是为了演示如何在实际项目中集成并使用iBatis进行数据操作。 首先,我们需要了解iBatis的核心概念。主要包括XML配置文件、SQL映射文件、SqlSession和Mapper接口。XML配置文件通常包含数据库...
在本实例中,"ibatis2.3.4.726增删改查源码实例" 提供了一个完整的基于Ibatis 2.3.4.726版本的开发案例,涵盖了数据库的基本操作,即增(INSERT)、删(DELETE)、改(UPDATE)和查(SELECT)。 首先,我们来了解...
*架构struts2_spring2.5_ibatis2.3 *mysql5.0 *jdk 1.6 *带有所有jar包,可直接运行 本实例实现了用户登陆,用户信息CRUD相关操作。让你感受到了ibatis做o/r mapping的方便快捷。 下次集成dwr进来 create ...
**Ibatis 2.3 Jar 包详解** Ibatis 是一款流行的数据持久层框架,它在Java开发领域中被广泛使用,特别是在处理数据库操作时。Ibatis 2.3 版本是该框架的一个重要里程碑,它提供了许多关键功能,以帮助开发者更有效...
在本主题中,我们将深入探讨Ibatis的两个特定版本:ibatis2.3.4.8.jar和ibatis-2.3.4.726.jar。 Ibatis的核心概念包括映射器(Mapper)、SQL映射文件和SqlSession。映射器是Ibatis的主要组件,它定义了数据库操作与...
**Ibatis 2.3 Jar 文件详解** Ibatis 是一款著名的Java持久层框架,它将SQL语句与Java代码分离,使得开发者可以更加灵活地控制SQL执行,同时保持了DAO层的良好封装。在Ibatis 2.3版本中,这个理念得到了充分的体现...
标题中的“spring3.0.3+ibatis2.3.4.7分页”指的是在Spring 3.0.3版本与iBATIS 2.3.4.7版本结合下实现的一种分页功能。这是一个常见的Java Web开发场景,其中Spring作为依赖注入和框架管理工具,iBATIS作为数据访问...
ibatis2.3 api,chm 格式,方面快速查询ibatis 的相关接口
这个压缩包“iBATIS2.3-JavaDoc.rar”包含了iBATIS 2.3版本的Java文档,通常以CHM(Compiled Help Manual)格式提供,方便开发者查阅API和了解其功能。JavaDoc是一种用于生成API文档的工具,它从Java源代码中的注释...
ibatis2.3.4.726.jar ibatis2.3.4.726.jar ibatis2.3.4.726.jar ibatis2.3.4.726.jar
提供ibatis2.3.4.8.jar包下载.
ibatis2.3 API CHM 帮助文档 ibatis 开发人员必备
本资料包含了iBATIS 2.3版本的jar包以及相关的说明文档,还有iBATIS 3的学习文档,旨在帮助开发者深入理解和使用这一框架。 iBATIS 2.3是iBATIS框架的一个重要版本,它主要包含以下核心概念和技术: 1. SQL Maps:...
在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好地掌握其实现细节。 首先,iBATIS DAO的核心概念是SQL Maps,它们定义了数据库操作的SQL语句,并将其映射到Java...
总结来说,iBATIS 2.3.0.677版是一个强大的持久层框架,它通过SQL Maps和映射器接口实现了SQL与Java代码的解耦,简化了数据库操作,提高了开发效率,同时也提供了诸如动态SQL、缓存和事务管理等高级功能,使开发者...
对于iBATIS 2.3,你可以在这里找到以下关键知识点: 1. **SqlMapClient**:这是iBATIS的核心组件,负责与数据库的交互。它提供了执行SQL映射文件中定义的SQL语句的方法,如`queryForObject`,`queryForList`,`...
这里提到的是iBATIS的三个不同版本的jar包:ibatis-2.3.4.726.jar、ibatis-2.3.0.677.jar以及ibatis-2.3.3.720.jar。 首先,让我们深入了解iBATIS的核心概念和功能: 1. **SQL Map配置**:iBATIS的核心是SQL Map...