- 浏览: 435402 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (145)
- spring (14)
- struts (3)
- hibernate (3)
- ibatis (6)
- web容器 (3)
- java (51)
- 哈希 (1)
- 认证 (1)
- 设计模式 (2)
- 部署_系统 (9)
- hadoop (5)
- shell (5)
- python (2)
- 数据库 (6)
- javascript (3)
- ajax (1)
- servlet (1)
- web前端 (5)
- linux (3)
- ubuntu (5)
- svn (3)
- 报错积累 (1)
- REST (1)
- maven (1)
- josso (2)
- interview (0)
- 其他 (6)
- find . -type f -mmin -10 //10分钟内修改过的 (0)
最新评论
-
cuqing:
下说法有误!如果两个对象的hashCode值相同,我们应该认为 ...
为什么在重写了equals()方法之后也必须重写hashCode()方法 -
Tough小白:
11111111 11111111 11111111 1111 ...
为什么byte取值是-128到127 -
世界尽头没有你:
Cloudera Hadoop5&Hadoop高阶管理 ...
hadoop版本及cloudera的CDH3 CDH4 -
00915132:
感谢楼主~~~~长知识了
java Process的waitFor() -
david8866:
非常感谢楼主的分享,解决了我的问题
java Process的waitFor()
ibatis版本号:
2.3.0
Build Date: 2006/11/30 17:16
Build Number: 677
ibatis的技术是从xml里面字符串转换成JAVA对象,对象填充JDBC的statement查询,然后从resultset取对象返回,另外利用ThreadLocal实现线程安全,JDBC保证了事务控制,cache(三方库)实现缓存的dao框架。
各大包结构和作用:
1,accessplan—
2,builder.xml
3,cache
4,datasource
5,exchange—ResultMap(sql结果类型结构)和ParameterMap(sql条件类型结果)与值的相互转换
6,execution
7,impl
8,mapping
9,scop
10,transaction
11,type—jdbc的Statement和ResultSet 与 java.lang.Object对象的相互转换。
Accessplan
uml:
Accessplan对外只提供个Factory,这种“封闭”设计可以借鉴:
对外接口调用如下:
- parameterPlan = AccessPlanFactory.getAccessPlan(parameterMap.getParameterClass(), parameterPropNames);
其中parameterMap.getParameterClass(),是映射的CLASS,就是XML里parameterXXX里的类,后面那个是类的成员变量,ParameterMapping是映射元素类,如下:
// 从某个映射对象中取出所有元素
ParameterMapping[] parameterMappings = parameterMap.getParameterMappings();
String[] parameterPropNames = new String[parameterMappings.length];
for (int i = 0; i < parameterPropNames.length; i++) {
// 从元素中取出被映射对象的成员名
parameterPropNames[i] = parameterMappings[i].getPropertyName();
}
UML:
ResultGetter和ParameterSetter的设计看来是为了TypeHandlerCallback扩展的复杂数据类型所用。为什么需要在这中间加一层呢? 可能是因为数据的复杂性吧,把特例和一般分离出来,代码看上去似乎优雅些。继续深入。
元数据接口
TypeHandler接口的抽象意义——Interface for getting data into, and out of a mapped statement,主要的作用是把Object那些对象set到jdbc的statement,以及从resultset结果集中获取那些Object对象。
- /**
- * Interface for getting data into, and out of a mapped statement
- */
- public interface TypeHandler {
- // para向第i个位置填充ps.
- public void setParameter(PreparedStatement ps, int i, Object parameter, String jdbcType)
- throws SQLException;
- // 根据rs结果集某字段名取值
- public Object getResult(ResultSet rs, String columnName)
- throws SQLException;
- public Object getResult(ResultSet rs, int columnIndex)
- throws SQLException;
- /**
- * Converts the String to the type that this handler deals with
- */
- public Object valueOf(String s);
- public boolean equals(Object object, String string);
- }
TypeHandlerCallback接口抽象意义为:
A simple interface for implementing custom type handlers.
Using this interface, you can implement a type handler that
will perform customized processing before parameters are set
on a PreparedStatement and after values are retrieved from
a ResultSet.
- public interface TypeHandlerCallback {
- public void setParameter(ParameterSetter setter, Object parameter) // 同上
- throws SQLException;
- public Object getResult(ResultGetter getter) // 同上
- throws SQLException;
- public Object valueOf(String s);
- }
StringTypeHandler——String类型帮助类
- public class StringTypeHandler extends BaseTypeHandler implements TypeHandler {
- public void setParameter(PreparedStatement ps, int i, Object parameter, String jdbcType)
- throws SQLException {
- ps.setString(i, ((String) parameter));
- }
- public Object getResult(ResultSet rs, String columnName)
- throws SQLException {
- Object s = rs.getString(columnName); // 很熟悉的jdbc编程吧
- if (rs.wasNull()) {
- return null;
- } else {
- return s;
- }
- }
- public Object getResult(ResultSet rs, int columnIndex)
- throws SQLException {
- Object s = rs.getString(columnIndex);
- if (rs.wasNull()) {
- return null;
- } else {
- return s;
- }
- }
- }
最后“元数据”这块剩下最后一个Factory管理类:TypeHandlerFactory
- /**
- * Not much of a suprise, this is a factory class for TypeHandler objects.
- */
- public class TypeHandlerFactory {
- private final Map typeHandlerMap = new HashMap(); // 用final Map来存储类型转换的帮助类
- private final TypeHandler unknownTypeHandler = new UnknownTypeHandler(this);
- private final HashMap typeAliases = new HashMap();// 保存type助记符,为什么呢?
- /**
- * Default constructor
- */
- public TypeHandlerFactory() {
- TypeHandler handler;
- handler = new BooleanTypeHandler();
- register(Boolean.class, handler);// 实际上把handler放入布尔值的map,然后再放入typeMap里。
- register(boolean.class, handler);
- handler = new ByteTypeHandler();
- register(Byte.class, handler);
- register(byte.class, handler);
- register(String.class, new StringTypeHandler());
- register(String.class, "CLOB", new CustomTypeHandler(new ClobTypeHandlerCallback()));
- register(String.class, "LONGVARCHAR", new CustomTypeHandler(new ClobTypeHandlerCallback()));
- register(byte[].class, new ByteArrayTypeHandler());
- register(byte[].class, "BLOB", new CustomTypeHandler(new BlobTypeHandlerCallback()));
- register(byte[].class, "LONGVARBINARY", new CustomTypeHandler(new BlobTypeHandlerCallback()));
- ....
- putTypeAlias("string", String.class.getName());
- putTypeAlias("byte", Byte.class.getName());
- putTypeAlias("long", Long.class.getName());
- ....
- }
- /* Public Methods */
- public TypeHandler getTypeHandler(Class type, String jdbcType) {
- Map jdbcHandlerMap = (Map) typeHandlerMap.get(type);
- TypeHandler handler = null;
- if (jdbcHandlerMap != null) {
- handler = (TypeHandler) jdbcHandlerMap.get(jdbcType);
- if (handler == null) {
- handler = (TypeHandler) jdbcHandlerMap.get(null);
- }
- }
- return handler;
- }
- /**
- * When in doubt, get the "unknown" type handler
- *
- * @return - if I told you, it would not be unknown, would it?
- */
- public TypeHandler getUnkownTypeHandler() {
- return unknownTypeHandler;
- }
- /**
- * Tells you if a particular class has a TypeHandler
- *
- * @param type - the class
- *
- * @return - true if there is a TypeHandler
- */
- public boolean hasTypeHandler(Class type) {
- return getTypeHandler(type) != null;
- }
- /**
- * Register (add) a type handler for a class and JDBC type
- *
- * @param type - the class
- * @param jdbcType - the JDBC type
- * @param handler - the handler instance
- */
- public void register(Class type, String jdbcType, TypeHandler handler) {
- Map map = (Map) typeHandlerMap.get(type);
- if (map == null) {
- map = new HashMap();
- typeHandlerMap.put(type, map);
- }
- map.put(jdbcType, handler);
- }
- /**
- * Lookup an aliased class and return it's REAL name
- *
- * @param string - the alias
- *
- * @return - the REAL name
- */
- public String resolveAlias(String string) {
- String key = null;
- if(string != null)
- key = string.toLowerCase();
- String value = null;
- if (typeAliases.containsKey(key)) {
- value = (String) typeAliases.get(key);
- } else {
- value = string;
- }
- return value;
- }
- /**
- * Adds a type alias that is case insensitive. All of the following String, string, StRiNg will equate to the same alias.
- * @param alias - the alias
- * @param value - the real class name
- */
- public void putTypeAlias(String alias, String value) {
- String key = null;
- if(alias != null)
- key = alias.toLowerCase();
- if (typeAliases.containsKey(key) && !typeAliases.get(key).equals(value)) {
- throw new SqlMapException("Error in XmlSqlMapClientBuilder. Alias name conflict occurred. The alias '" + key + "' is already mapped to the value '" + typeAliases.get(alias) + "'.");
- }
- typeAliases.put(key, value);
- }
- }
Mapping包
--parameter包意义——主要负责数据类型转换,把xml写的字符串映射成正确的类型,以上type包是解决了object到type的转换。
UML:
ParameterMap接口
- public interface ParameterMap {
- public String getId();
- public void setParameters(RequestScope request, PreparedStatement ps, Object[] parameters)
- throws SQLException;
- public Object[] getParameterObjectValues(RequestScope request, Object parameterObject);
- public CacheKey getCacheKey(RequestScope request, Object parameterObject);
- public void refreshParameterObjectValues(RequestScope request, Object parameterObject, Object[] values);
- public ParameterMapping[] getParameterMappings();
- public Class getParameterClass();
- }
ParameterMapping接口
- public interface ParameterMapping {
- public String getPropertyName();
- public boolean isOutputAllowed();
- }
BasicParameterMapping实现类:
- public class BasicParameterMapping implements ParameterMapping {
- private static final String MODE_INOUT = "INOUT";
- private static final String MODE_OUT = "OUT";
- private static final String MODE_IN = "IN";
- private String propertyName; // 从XML文件里读取需要转换的类型名
- private TypeHandler typeHandler; // 对象转换相应类型的工具map
- private String typeName; // this is used for REF types or user-defined types
- private int jdbcType;
- private String jdbcTypeName;
- private String nullValue;
- private String mode;
- private boolean inputAllowed;
- private boolean outputAllowed;
- private Class javaType; // 需要转换的类型class
- private String resultMapName; // 结果map名称
- private Integer numericScale;
- private String errorString;
- public BasicParameterMapping() {
- mode = "IN";
- inputAllowed = true;
- outputAllowed = false;
- }
- public void setJavaTypeName(String javaTypeName) {
- try {
- if (javaTypeName == null) {
- this.javaType = null;
- } else {// 通过getClassLoader().loadClass(className);来获得实例
- this.javaType = Resources.classForName(javaTypeName);
- }
- } catch (ClassNotFoundException e) {
- throw new SqlMapException("Error setting javaType property of ParameterMap. Cause: " + e, e);
- }
- }
- }
BasicParameterMap实现类
- public class BasicParameterMap implements ParameterMap {
- private String id;
- private Class parameterClass;
- private ParameterMapping[] parameterMappings;
- private DataExchange dataExchange;
- private String resource;
- private Map parameterMappingIndex = new HashMap();
- private SqlMapExecutorDelegate delegate;
- public void setParameterMappingList(List parameterMappingList) {
- this.parameterMappings = (BasicParameterMapping[]) parameterMappingList.toArray(new BasicParameterMapping[parameterMappingList.size()]);
- for (int i = 0; i < parameterMappings.length; i++) {
- parameterMappingIndex.put(parameterMappings[i].getPropertyName(), new Integer(i));
- }
- Map props = new HashMap();
- props.put("map", this);
- dataExchange = delegate.getDataExchangeFactory().getDataExchangeForClass(parameterClass);
- dataExchange.initialize(props);
- }
- /**
- * @param ps
- * @param parameters
- * @throws java.sql.SQLException
- */
- public void setParameters(RequestScope request, PreparedStatement ps, Object[] parameters)
- throws SQLException {
- ErrorContext errorContext = request.getErrorContext();
- errorContext.setActivity("applying a parameter map");
- errorContext.setObjectId(this.getId());
- errorContext.setResource(this.getResource());
- errorContext.setMoreInfo("Check the parameter map.");
- if (parameterMappings != null) {
- for (int i = 0; i < parameterMappings.length; i++) {
- BasicParameterMapping mapping = (BasicParameterMapping) parameterMappings[i];
- errorContext.setMoreInfo(mapping.getErrorString());
- if (mapping.isInputAllowed()) {
- setParameter(ps, mapping, parameters, i);
- }
- }
- }
- }
- public Object[] getParameterObjectValues(RequestScope request, Object parameterObject) {
- return dataExchange.getData(request, this, parameterObject);
- }
- public CacheKey getCacheKey(RequestScope request, Object parameterObject) {
- return dataExchange.getCacheKey(request, this, parameterObject);
- }
- public void refreshParameterObjectValues(RequestScope request, Object parameterObject, Object[] values) {
- dataExchange.setData(request, this, parameterObject, values);
- }
- protected void setParameter(PreparedStatement ps, BasicParameterMapping mapping, Object[] parameters, int i) throws SQLException {
- Object value = parameters[i];
- // Apply Null Value
- String nullValueString = mapping.getNullValue();
- if (nullValueString != null) {
- TypeHandler handler = mapping.getTypeHandler();
- if (handler.equals(value, nullValueString)) {
- value = null;
- }
- }
- // Set Parameter
- TypeHandler typeHandler = mapping.getTypeHandler();
- if (value != null) {
- typeHandler.setParameter(ps, i + 1, value, mapping.getJdbcTypeName());
- } else if (typeHandler instanceof CustomTypeHandler) {
- typeHandler.setParameter(ps, i + 1, value, mapping.getJdbcTypeName());
- } else {
- int jdbcType = mapping.getJdbcType();
- if (jdbcType != JdbcTypeRegistry.UNKNOWN_TYPE) {
- ps.setNull(i + 1, jdbcType);
- } else {
- ps.setNull(i + 1, Types.OTHER);
- }
- }
- }
- }
发表评论
-
ibatis配置
2012-03-31 15:43 1177核心提示:SqlMap的配置是iBatis中应用的核心。这部分 ... -
ibatis sql基础1
2012-03-14 11:41 0<select id="getTracking ... -
ibatis sql基础
2013-09-09 12:52 14091.sqlMapConfig <sqlMapC ... -
selectkey
2012-03-13 15:56 16852ibatis的selectkey 在使用i ... -
ibatis源码学习2_初始化和配置文件解析
2012-03-12 11:58 2812在ibatis整体设计和核心 ... -
ibatis源码学习1_整体设计和核心流程
2012-03-12 11:58 1254转自http://www.iteye.com/topic/11 ...
相关推荐
ibatis源码 学习参考 对于学习ibatis很有帮助
《深入解析iBatis源码》 iBatis,一个优秀的Java持久层框架,以其轻量级、灵活的特性在众多ORM(Object-Relational Mapping)框架中独树一帜。iBatis的核心在于它的SQL映射机制,它将数据库操作与业务逻辑解耦,...
描述中的"ibatis框架源码剖析书中附带的光盘,ibatis源码分析"暗示这可能是一个学习资源,用于深入理解iBATIS的工作原理,可能包括了对源码的详细解读和分析。 **iBATIS核心知识点** 1. **SQL映射**:iBATIS的核心...
3. 学习设计模式:Ibatis的源码中应用了许多经典的设计模式,如工厂模式、单例模式、代理模式等,这对于提升编程技能非常有帮助。 最后,API文档是开发者的重要参考材料,它详细解释了每个类、接口和方法的功能、...
通过深入分析iBATIS的源码,开发者不仅可以了解其工作原理,还能学习到设计模式、数据库访问的最佳实践以及如何优雅地处理数据库操作。对于提升Java开发者的技能和理解数据库访问层的实现有极大的帮助。在实际开发中...
总的来说,ibatis框架源码的学习不仅可以帮助我们理解其工作原理,提升开发效率,还能为我们提供一种思考问题的角度,理解数据访问层的设计模式。通过对源码的深入剖析,我们可以更好地解决实际项目中的问题,进行...
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" ...
通过学习和分析这个源码,开发者不仅可以深入了解SpringMVC和iBatis的协同工作原理,还可以掌握如何在Eclipse这样的IDE中配置和运行这样的项目。这有助于提升对MVC模式的理解,提高数据库操作的能力,以及熟练运用...
这个“iBatis源码jar包以后上传”可能指的是将要分享或者提供iBatis的源码jar包,以便于开发者深入学习和理解其内部工作原理。 首先,让我们来了解一下iBatis的基本概念和工作流程。iBatis的核心是SQL Map配置文件...
对于开发者来说,源码能够帮助他们深入了解iBATIS的工作原理,便于学习、调试和扩展。如果在使用过程中遇到问题,查看源码可以快速定位并解决问题。通常,将源码放在`lib`目录下并不常见,因为源码主要用于开发和...
深入研究iBatis源码有助于理解其内部工作原理,包括如何解析XML配置文件,如何执行SQL语句,以及如何进行结果映射。源码分析可以帮助开发者更好地定制和优化自己的应用。 六、iBatis实践项目 通过实践项目,可以...
通过深入研究iBATIS 2.3的源码,开发者不仅可以了解其实现细节,还可以学习到如何设计一个高效的持久层框架,提升自己的编程技巧和设计能力。同时,这也为那些希望在现有基础上定制或优化iBATIS功能的开发者提供了...
一、**IBatis源码分析** IBatis的源码是开源的,这对于开发者来说是一份宝贵的资源,可以让我们深入了解其工作原理和内部机制。通过阅读源码,我们可以学习到以下知识点: 1. **动态SQL**:IBatis的核心功能之一...
《IbatisDemo入门源码详解》 IbatisDemo是一个典型的基于Ibatis框架的入门示例,它为我们展示了如何在Java项目中使用Ibatis进行数据库操作。Ibatis,一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件...
在"iBATIS框架源码剖析pdf第二部分"中,我们将深入探讨iBATIS的核心组件、工作原理以及其实现细节。 首先,我们来了解一下iBATIS的基本架构。iBATIS由四大核心部分组成:SqlMapConfig.xml配置文件、SqlMap接口、SQL...
尽管现代有许多更先进的ORM框架如MyBatis(iBATIS的后继者),但iBATIS的历史地位和其开创性的设计理念仍然值得我们学习和借鉴。通过深入理解iBATIS,开发者可以更好地掌握数据库操作的技巧,提升项目开发效率。
标题 "ibatis学习" 暗示我们即将探讨的是关于Ibatis,一个著名的Java持久层框架,它允许开发者将SQL语句直接写在配置文件中,以实现灵活的数据访问。Ibatis提供了简单易用的API,使得数据库操作与业务逻辑解耦,提高...
apache开源项目源码ibatis-3-core-src-3.0.0.227 ibatis框架java源程序 spring,struts,hibernate,ibatis,框架源码 ...apache开源组织开发的开源项目源码,其优良的代码风格和高质量的源码是学习者难得的学习资料!