`
C_J
  • 浏览: 127891 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

My Date-Behavior in 2009

阅读更多

@Author: cjcj  cj.yangjun@gmail.com <c-j.iteye.com>



两种设计思想:


1、数据库操作与业务操作分开
2、业务操作进行调用DB层时是面向OO的

 

两种模型:

什么叫模型?

 对于DBA来说,表就是他的模型,定义了字段名、类型、主外键关系;

 对于程序员来说,Entity就是他的模型,定义了变量名、类型、对象关系;

1、“贫血”模型(大家都这样叫,也就这样叫了)

    就是 “数据”的Entity;

2、“充血”模型
    就是 “数据”+“行为”的Entity;
也是目前流行的hibernate的思想。

 

现实中一些项目做法:

1、static方式,纯JDBC,纯sql

2、JavaBean方式,部分JDBC

3、Hibernate方式,业务层面向OO

讨论最多的应该是方式3,但是我感觉频繁的创建很多DAO是很繁琐的。所以想寻索到一种更好的方法。

iBATIS项目思想:

1、sql语句与代码分离

2、select语句where条件可写死在xml或在代码中指定

3、运用IOC的构造sqlMapClient和targetType成员属性



 

 

 

IBATIS框架涉及的文件  

 IBATIS配置文件(XML)

1、配置缓存 setting

2、配置连接和连接池 transactionManager

3、配置sqlMap资源 sqlMap

 

如:对于容器没有提供连接池的情况,配置一个DBCP连接池

  

IBATIS MAP文件(XML)

 

<parameterMap id=”parameterMapName” [class=”com.domain.Product”]>
<parameter property =”propertyName” [jdbcType=”VARCHAR”] [javaType=”string”]
[nullValue=”NUMERIC”] [null=”-9999999”]/>
<parameter …… />
<parameter …… />
</parameterMap>
<resultMap id=”resultMapName” class=”some.domain.Class” [extends=”parent-resultMap”]>
<result property=”propertyName” column=”COLUMN_NAME”
[columnIndex=”1”] [javaType=”int”] [jdbcType=”NUMERIC”]
[nullValue=”-999999”] [select=”someOtherStatement”]
/>
<result ……/>
<result ……/>
<result ……/>
</resultMap>

 

 

 
对于复杂查询1:1的情况,有两种查询方式:延迟加载VS联合查询。
如果您要缓存查询结果,则使用子查询(而不是联合查询)来缓存查询结果。

对于复杂查询1:M or M:N的情况,2.x目前还没有更好的解决方案,只能采用“延迟加载”

 

 

<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
<result property=”id” column=”CAT_ID”/>
<result property=”productList” column=”CAT_ID” select=”getProductsByCatId”/>
</resultMap>

<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
<result property=”id” column=”PRD_ID”/>
</resultMap>

<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
select * from CATEGORY where CAT_ID = #value#
</statement>
<statement id=”getProductsByCatId” parameterClass=”int” resultMap=”get-product-result”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>

 


对于多个参数属性

IBATIS的client实例

    IBATIS提供的数据库操作实例是sqlMapClient,里面包括了query,update,delete的方法,还有transaction,datasource(DBCP);sqlMapClient实例的query方法是用ThreadLocal保证线程安全。

IBATIS的事务管理

    因为IBATIS本身只是轻封装了JDBC,所以事务也是JDBC本身控制的。运用事务很简单,只需要获得sqlMapClient实例调用相应方法就可以了,如下:

  

  sqlMap=new MapClientConfigLoader(SqlMapClientSingleton.sqlMapConfig).loadSMC();
  sqlMap.startTransaction();
 // 事务操作,在同一个Session里
 sqlMap.endTransaction();

 

IBATIS的Cache

 

    采用简单查询缓存;

    采用Hibernate 等的两级缓存
   对象缓存(Object Cache),将对象像库表记录一样,按主键进行缓存,相当于建立一个简单的内存数据库;
   查询缓存(Query Cache),但它只缓存结果集的主键,因此 cache.value 空间消耗大大减少。

 

Some public websites that utilize IBatis

1up.com - Gaming community 
http://www.1up.com 
Abebooks.com - Worlds largest online marketplace for books 

 http://www.abebooks.com 
AccesStream.com - Open Source Identity and Access Management Suite 

http://www.accesstream.com 
BullionVault.com - Online gold trading 

http://www.bullionvault.com 
www.druckdiskont.at -

Online print portal (Web To Print) 

http://www.druckdiskont.at 
Fiskars - Consumer products manufacturer
 http://www.fiskars.com 
GalMarley.com - Gold prices, facts, figures and charts 

http://www.galmarley.com 
GAPay - General Agent Payment System 
http://www.gapay.com
Ideal Financial Services 
http://www.idealfsi.com  ....

 

于是也简单查了下IBATIS的Cache源码;

- 三种模式

/**
   * Constant for weak caching
   * This cache model is probably the best choice in most cases. It will increase
   * performance for popular results, but it will absolutely release the memory to
   * be used in allocating other objects, assuming that the results are not currently
   * in use.
   */
  public final static MemoryCacheLevel WEAK;

  /**
   * Constant for soft caching.
   * This cache model will reduce the likelihood of running out of memory in case the
   * results are not currently in use and the memory is needed for other objects.
   * However, this is not the most aggressive cache-model in that regard. Hence,
   * memory still might be allocated and unavailable for more important objects.
   */
  public final static MemoryCacheLevel SOFT;

  /**
   * Constant for strong caching.
   * This cache model will guarantee that the results stay in memory until the cache
   * is explicitly flushed. This is ideal for results that are:
   * <ol>
   * <li>very small</li>
   * <li>absolutely static</li>
   * <li>used very often</li>
   * </ol>
   * The advantage is that performance will be very good for this particular query.
   * The disadvantage is that if the memory used by these results is needed, then it
   * will not be released to make room for other objects (possibly more important
   * objects).
   */
  public final static MemoryCacheLevel STRONG;



 

- 4种策略

FIFO
LRU
MEMORY
OS

 

研究dao-zone项目中...   

 

 

疑难杂症:

1:classNotFound, 找不到Resource类的问题,用户会出现打成JAR包的时候无法找到IBATIS的类错误;

   解决:这个属于ECLIPSE打包的问题,在你的JAR所在目录下新建LIB文件夹,并在工程MANIFEST.MF修改如下:

Manifest-Version: 1.0
Main-Class: com.hp.CcdMain
Class-Path: lib/ibatis-common-2.jar lib/ibatis-sqlmap-2.jar lib/log4j.jar lib/commons-dbcp-1.2.2.jar lib/mysql-connector-java-5.1.8-bin.jar lib/commons-pool-1.5.2.jar

Class-Path为第三方JAR包的路径

 

 

2:Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: org.xml.sax.SAXParseException: Element "sqlMap" requires additional elements.异常问题

解决:IBATIS支持JRE1.4,刚开始我怀疑是JRE版本的问题,不是,这类问题大多数跟IBATIS的XML配置文件有关;

sqlMap必须要有<sqlMap>和<statement>标签,否则IBATIS将报错

 

  3:SqlMapConfig.xml加载外部资源文件相对路径问题:

    提供了两种方式:resource和url

    今天实验下url好像不能用相对路径如 ..  ,只能用绝对路径,郁闷了,如<properties url="file:///G:/SRC/testccd/config.properties" />


 

  • 大小: 26.1 KB
  • 大小: 35.4 KB
0
0
分享到:
评论

相关推荐

    elementui elementUI - date-picker.zip

    在给定的资源 "elementUI - date-picker.zip" 中,主要涉及的是 ElementUI 中的日期选择器(date-picker)组件的修改,特别是关于时间步长(time-step)的调整。 日期选择器是用户界面中常见的一种交互元素,用于让...

    obs-文本-脚本 date-and-time.lua

    obs-文本-脚本 date-and-time.lua

    vue element-ui el-date-picker限制选择时间为当天之前的代码

    其中,`el-date-picker`组件是一个非常实用的日期选择器,它可以轻松集成到各种表单中。但有时候开发者需要根据实际需求对日期选择范围做出限制,比如限制用户只能选择当天或之前的时间。 本文的核心知识点是探讨...

    最全 element UI el-date-picker组件换色(less)

    element UI el-date-picker组件样式更改 popper-class="down-time" 原码是body下的弹出器

    el-date-picker 英文改中文.doc

    https://blog.csdn.net/xuelang532777032/article/details/121287203,内有博客截图,方便没有vip的小伙伴下载

    perl-Email-Date-Format-1.5.0-3

    搭建MHA时所需的包,MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10—30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新服务器的费用...

    前端项目-tiny-date-picker.zip

    【tiny-date-picker】是一个专为前端开发设计的轻量级、无依赖的日期选择器组件。这个项目的主要目标是提供一个简单易用、性能高效且功能完备的日期选择解决方案,适用于各种网页应用。由于它不依赖任何外部库,如...

    前端开源库-date-utils

    "date-utils" 是一个专为前端开发者设计的开源库,致力于提供一系列强大的日期处理功能,它作为一个node.js的日期加载项,能够方便地在Node.js环境中使用,同时也支持浏览器环境,使得前端开发人员可以更高效地处理...

    Date-Calc-5.4.tar.gz_Date-Calc-5.4

    标题中的"Date-Calc-5.4.tar.gz_Date-Calc-5.4"指的是一个名为"Date-Calc"的Perl模块的版本5.4的压缩文件,它采用tar.gz格式进行打包。这种格式通常用于在Unix/Linux环境中归档和压缩文件,方便传输和存储。".tar"是...

    date-picker_date-picker_时间选择_

    时间选择器,可以选择时间段内的时间,有效提高jsp代码

    chartjs-adapter-date-fns:适用于Chart.js的date-fns适配器

    npm install date-fns chartjs-adapter-date-fns@next --save import { Chart } from 'chart.js' ; import 'chartjs-adapter-date-fns' ; CDN 默认情况下, ...

    date-picker

    "date-picker"是一个开源项目,主要关注日期选择功能的实现,尤其强调其梯度依赖特性。在IT领域,"date-picker"通常指的是一个允许用户在用户界面中选择日期的组件,广泛应用于各种Web和移动应用中,如日历应用、...

    angular-date-time

    为了更好地理解如何使用这个插件,你可以查看`angular-date-time-input-master`压缩包中的示例代码。它通常包括一个运行的实例,展示了如何在实际项目中集成和使用Angular Date Time 插件。 ### 7. 兼容性与版本...

    vue-ctk-date-time-picker:VueJS组件选择日期和时间,包括范围模式

    查找v1文档暗模式演示版安装纱yarn add vue-ctk-date-time-picker NPM npm i --save vue-ctk-date-time-picker用法ES6模块/ CommonJS import VueCtkDateTimePicker from 'vue-ctk-date-time-picker' ;import 'vue-...

    perl-TimeDate-1.1301-1.noarch.rpm

    perl-TimeDate-1.1301-1.noarch.rpm

    boost-date-time-1.41.0-11.el6_1.2.i686.rpm

    boost-date-time-1.41.0-11.el6_1.2.i686.rpm是centos工具包。

    Angular-ngx-date-fns.zip

    Angular-ngx-date-fns.zip,角度大于等于2.0的日期fns管道 =ngx日期fns,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入。angular的设计目的是全面解决开发人员的web...

    Python库 | mkdocs-git-revision-date-localized-plugin-0.4.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:mkdocs-git-revision-date-localized-plugin-0.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    前端项目-date-fns.zip

    import { subDays, differenceInDays, format } from 'date-fns'; const targetDate = new Date('2023-05-01'); const now = new Date(); const remainingDays = differenceInDays(targetDate, now); const ...

    date-fns-module:现代JavaScript日期实用程序库-Nuxt.js的date-fns

    @ nuxtjs / date-fns 现代JavaScript日期实用程序库-Nuxt.js的date-fns 设置将@nuxtjs/date-fns依赖项添加到您的项目中yarn add --dev @nuxtjs/date-fns # or npm install --save-dev @nuxtjs/date-fns 添加@nuxtjs/...

Global site tag (gtag.js) - Google Analytics