随笔:93 文章:11 评论:22 引用:0
首页 发新随笔
发新文章 联系 聚合管理

                                                                                          作者hitlermen
有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它能被实例化。例如:有一个父类“ 水果(Fruit)”,它有几个子类“苹果(Apple)”、“橘子(Orange)”、“香蕉(Banana)”等。水果在这里仅仅只是作为一个分类,显然水果的实例没有什么意义(就好像一个人如果告诉你他买了一些水果但是却不告诉你是苹果还是橘子,你很难想象他到底买的是什么。)。而水果类又要能被子类化,这就要求我们使用抽象类(abstract class)来解决这个问题。
在java中,通过在class关键字前增加abstract修饰符,就可以将一个类定义成抽象类。抽象类不能被实例化。例如:
          定义抽象类水果(Fruit)
          public abstract class Fruit {
                  ……
          }
           如果我们试图用以下语句来获得一个实例,将无法编译成功。
           Fruit fruit = new Fruit();
而我们仍然可以构造水果类的子类,如:
          子类“苹果(Apple)”
           public class Apple extends Fruit {
                   ……
           }
          子类“橘子(Orange)”
           public class Orange extends Fruit {
                   ……
           }
这样就达到我们的目的了。
抽象类除了能象普通类一样可以拥有一般的属性和方法,也可以拥有抽象方法(abstract method)。例如:
           抽象类“形状(Shape)”拥有抽象方法draw()。
           public abstract class Shape {
                  ……
                  public abstract void draw();
                  ……
           }
抽象方法与抽象的行为相对应,通常是这个行为对父对象没有意义,而子对象有具体动作。例如方法draw()对于类Shape没有意义,而类Shape的子类矩形(Rectangle)的方法draw()可以有实际的动作(根据矩形的四个顶点画出矩形的四个边),子类圆(Circle)的方法draw()也可以有实际的动作(根据圆心和半径画出圆周)。
抽象类可以有抽象方法也可以没有抽象方法;但是如果一个类有抽象方法,那这个类只能定义为抽象类。
           如果按照以下代码类“形状(Shape)”仍然拥有抽象方法draw(),但没有定义为抽象类,将会编译失败。
           public class Shape {
                  ……
                  public abstract void draw();
                  ……
           }
抽象方法还有一个特点是,它强迫子类要么仍然保持抽象性(即不具体实现该方法并仍然定义为抽象类),要么具体表现出这个方法的行为(实现具体的动作或者通过抛出UnsupportedOperationException异常来表明不支持该行为)。这样也可以强化多态性。
上面简要分析了抽象类,下面谈谈接口(interface)。java语言使用关键字interface定义一个接口。接口也是抽象对象,它甚至比抽象类更抽象。接口中的方法都是抽象方法。
一个接口可以继承其他接口;一个类通过关键字implements声明要实现一个接口,并具体实现接口的方法。
           例如:有一个接口InterfaceA,

Java代码
  1. public   interface  InterfaceA {   
  2.          void  methodA();   
  3. }  
 

           类ClassA实现接口InterfaceA。

Java代码
  1. public   class  ClassA implements InterfaceA {   
  2.           public   void  methodA() {   
  3.                System.out.println( "methodA of ClassA implements InterfaceA" );   
  4.          }   
  5. }  
 

如果是抽象类实现一个接口,那么抽象类中可以不具体实现接口的方法(保持其抽象性),而由其子类去实现。
           抽象类ClassB实现接口InterfaceA,但是没有具体实现方法methodA(),

Java代码
  1. public   abstract   class  ClassB  {           }  
 

           子类ClassBSub实现接口InterfaceA,但是没有具体实现方法methodA(),

Java代码
  1. public   class  ClassBSub {   
  2.          public   void  methodA() {   
  3.               System.out.println( "methodA of ClassBSub the subclass of ClassB" );   
  4.         }   
  5. }  
 

接口和抽象类显著的共同点是接口和抽象类都可以有抽象方法。
接口和抽象类的不同点有:
           (1)抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态(static)的常量(final)。
           (2)抽象类可以有非抽象方法,而接口只能有抽象方法。
java中,类与类之间是不能多继承的。java之所以禁止类与类之间的多继承是因为多继承有很大的缺点。
多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。例如:
           类ClassA:

Java代码
  1. public   class  ClassA {   
  2.         protected   int  varSame =  0 ;   
  3. }  
 

           类ClassB:

Java代码
  1. public   class  ClassB {   
  2.          protected   int  varSame =  1 ;   
  3. }  
 

           子类ClassC:(假设允许类与类之间多继承)

Java代码
  1. public   class  ClassC  extends  ClassA, ClassB {   
  2.          public   void  printOut() {   
  3.                 System.out.println( super .varSame);   
  4.         }   
  5.          public   static   void  main(String[] args) {   
  6.                 ClassC classC =  new  ClassC();   
  7.                 classC.printOut();   
  8.         }   
  9. }  
 


           上面程序的运行结果会是什么呢?输出0还是1?
(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法。例如:
           类ClassA:

Java代码
  1. public   class  ClassA {   
  2.          public   void  printOut() {   
  3.                 System.out.println( 0 );   
  4.         }   
  5. }  

 

           类ClassB:

 

Java代码
  1. public   class  ClassB {   
  2.          public   void  printOut() {   
  3.                 System.out.println( 1 );   
  4.         }   
  5. }  
 

           子类ClassC:(假设允许类与类之间多继承)

Java代码
  1. public   class  ClassC  extends  ClassA, ClassB {   
  2.                     public   static   void  main(String[] args) {   
  3.                            ClassA classA =  new  ClassC();   
  4.                            classA.printOut();       // -------------------------  A行   
  5.                            ClassB classB =  new  ClassC();   
  6.                            classB.printOut();       // -------------------------  B行   
  7.                            ClassC classC =  new  ClassC();   
  8.                            classC.printOut();        //-------------------------  C行   
  9.                    }   
  10.            }  
 

           上面程序的运行结果会是什么呢?A、B、C三行的输出是0还是1?
正因为有以上的致命缺点,所以java中禁止一个类继承多个父类;但是幸运的是java提供了接口,并能通过接口的功能获得多继承的许多优点而又摒弃了类与类多继承的缺点。
java允许一个接口继承多个父接口,也允许一个类实现多个接口,而这样的多继承有上面提到的缺点马?
答案是没有,这是由接口的抽象性决定的。
正如前面介绍的,在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。
对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),因此不存在多继承的第二个缺点;而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
对于一个接口继承多个父接口的情况也一样不存在这些缺点。
请看以下示例。
            接口A:

Java代码
  1. public   interface  InterfaceA {   
  2.          int  len =  1 ;   
  3.          void  output();   
  4. }  
 

            接口B:

Java代码
  1. public   interface  InterfaceB {   
  2.            int  len =  2 ;   
  3.            void  output();   
  4. }  
 

            接口Sub继承接口A和接口B:

Java代码
  1. public   interface  InterfaceSub  extends  InterfaceA, interfaceB {            }  
 

            类Xyz实现接口Sub:

Java代码
  1. public   class  Xyz  implements  InterfaceSub {   
  2.          public   void  output() {   
  3.                 System.out.println( "output in class Xyz." );   
  4.         }   
  5.           public   void  outputLen( int  type) {   
  6.                   switch (type) {   
  7.                           case  InterfaceA.len:   
  8.                                  System.out.println( "len of InterfaceA=." +type);   
  9.                                   break ;   
  10.                           case  InterfaceB.len:   
  11.                                  System.out.println( "len of InterfaceB=." +type);   
  12.                                   break ;   
  13.                  }   
  14.         }   
  15.         public   static   void  main(String[] args) {   
  16.                Xyz xyz=  new  Xyz ();   
  17.                xyz .output();   
  18.                xyz .outputLen();   
  19.        }   
 


           以上代码不存在什么问题,但是如果试图编写以下存在冲突的代码,则会编译失败。

Java代码
  1. Xyz xyz =  new  Xyz();   
  2. int  len = xyz.len;   
  3. System.out.println(len);  
 


由于引入了接口,java显得非常灵活,也使得java中的多态性更加富有魔力。

posted @ 2008-12-15 10:36 redcoatjk 阅读(234) | 评论 (0)编辑 收藏
 
accesskey 属性 -- 代表链接的快捷键访问方式
  • 定义了accesskey的链接可以使用快捷键(ALT+字母)访问.
  • 主菜单与导航菜单使用accesskey,通常是不错的选择.
  • 取值:
    • 字母
  • 引用网址:http://www.dreamdu.com/xhtml/attribute_accesskey/

示例

<a href="http://www.dreamdu.com/xhtml/" accesskey="h">
(按住Alt键)点击键盘上的h按钮就可以直接链接到HTML教程.
</a>
posted @ 2008-11-28 10:00 redcoatjk 阅读(154) | 评论 (0)编辑 收藏
 

 

 
1、什么是iBATIS
1.1作者
       Clinton Begin,很牛X的名字
1.2背景故事
    Clinton Begin于2001年启动iBATIS项目,最先的焦点是发展密码软件解决方案。第一个iBATIS产品是Secrets,是一个象PGP的个人数据加密器和签名工具。Secrets完全用Java编写并在一个开源许可下发布。
    在发布Secrets Java版后不久,iBATIS项目陷入困境转而关注Web和其它internet相关的技术,在接下来的一年中,两个有趣的软件开发完成,包括Axle web 框架,一个JSP可选工具。Lookout邮件客户端差不多完成90%在 being set on the back burner之前,同时更多有趣的挑战接踵而来…
1.3加入Pet Store“基准”
    在2002年早些时候,Microsoft发布一个纸面文档声称.NET有10倍于J2EE的速度和4倍多的生产效率。事实是这只是简单的而不是典型的。iBATIS项目在2002年7月1日快速回应,JPetStore 1.0发布了。基于相同的Pet Store需求,JPetStore证明了Java不仅比.NET更有生产效率,同时比Microsoft的实现拥有更好的架构
    JPetStore利用有趣的持久层迅速地引起了开源社区的关注。在JPetStore发布不久,对SQL Maps和DAO框架的问题和要求使大家知道的iBATIS Database Layer产生了。iBATIS Database Layer包含两个被打包在一起的框架:SQL Maps和DAO。
       如今iBATIS项目重点关注持久层框架并以SQL Maps 和 Data Access Objects (DAO)著称。JPetStore继续作为这些框架典型应用的官方示例程序。
1. 4“iBATIS”是什么意思
    现在,单词“ibatis”和SQL Maps 与 DAO 框架同义――就象“xerox”『施乐复印机(商标名称),译者著』和“photocopy” 『影印,译者著』同义。
    回想起iBATIS来源于密码系统软件。iBATIS实际上用两个单词的组合来命名:“internet” 和 “abatis”。
Reference.com 如此定义 abatis:
ab-a-tis
n. pl. ab-a-tis (-tz) or ab-a-tis-es (-t-sz)
将伐倒的树木树枝相互交叉,放置,有时削尖,面对敌人一种防御障碍物。
将“Internet”中象征性的“i”和abatis中的“batis”组合所以暗示了抵御Internet的意思。-in the case of iBATIS它是Secrets提供的关于密码防御的东西。
所以iBATIS正确的写法应该是:iBATIS
1.5 iBATIS怎么念?
    因为我们发明了这个单词,我们以自己喜欢的读音念它
    我们这样读:eye-BAT-iss
但是按照传统,它可能应该被读作:eye-BATE-iss,但就象我们说的,我们创造了它。
1.6许可(License)
iBATIS的源码和文档在Apache License 2.0许可下发布。
 
以上部分文字翻译自http://ibatis.apache.org,不妥之处,请指正。
1.7版本情况
iBATIS有for Java,for .NET,for Ruby三个语言的版本,以下主要讨论for Java版,也是最重要的版本。
      
       关于版本,看下面一段英文:
 
iBATIS 3.0 Whiteboard
 
January 11th, 2007 marks the 3rd Anniversary(周年纪念) of the iBATIS 2.0. It has served the community well for three years, but times change. The year 2006 was full of innovation(改革、创新) and shifts in technology and mindset. The impact(冲击,碰撞) of frameworks like Ruby on Rails cannot be ignored. The industry has noticed and finally invested in lightweight frameworks, agile principles and simple solutions first.
 
最新版本:iBATIS2.3.0 build667,非常稳定。
 
1.8 典型用户
       MySpace.com - A place for friends
       …
 
2、当前Java平台下的一些DAO框架
2.1Hibernate
       应该是最好的ORM框架,ORM:Object Relation Mapping,即对象关系映射。
了解不是很多,不多作评价。不过应该是很好的框架,EJB3里的JPA所说差不多就是简化版的Hibernate,侧重于对象模型设计,系统设计中数据库设计让位于对象模型设计。
2.2 Apache JDO
       Apache组织的一个比较早的开源框架,影响力不大。
2.3 Spring DAO(Template)
       Spring DAO对JDBC进行了封装
       用得最多的还是各种Template:
JdbcTemplate
       HibernateTemplate
       SqlMapTemplate
       JdoTemplate
       JpaTemplate
2.4 JDBC
       对数据库操作最原始的办法,也是根本,无所不能的。
2.5 iBATIS
       又称为SQL Map或 Data Map(2.0以后)
       SQL Mapping framework 更准确地说是 SQL Mapping tool,是一个SQL语句映射的框架(工具)
2.5.1介绍(Introduction)
The iBATIS Data Mapper framework will help you to significantly(意味深长地,值得注目地) reduce the amount of Java code that you normally need to access a relational database. iBATIS simply maps(此处应译作映射) JavaBeans to SQL statements using a very simple XML descriptor. Simplicity(简单) is the key advantage(优势,有利条件) of iBATIS over other frameworks and object relational mapping tools. To use the iBATIS Data Mapper you need only be familiar with JavaBeans, XML and SQL. There is very little else to learn. There is no complex scheme required to join tables or execute complex queries. Using Data Mapper you have the full power of real SQL at your fingertips.
2.5.2 概念(Concept)
The iBATIS Data Mapper API allows programmers to easily map JavaBeans objects to PreparedStatement parameters and ResultSets. The philosophy behind Data Mapper is simple: provide a simple framework to provide 80% of JDBC functionality using only 20% of the code.
 
3、学习iBATIS
3.1 一个简单的iBATIS原型
       SELECT COUNT(*) FORM USER
       讨论:
一、用JDBC直接在页面中如何写程序
二、多个JSP文件同时出现此功能时
三、出现不同的版本,SELECT COUNT(*) FORM USER WHERE USER_TYPE=1 AND IS_DEL=0…
四、讨论各个版本的输入输出参数
3.2 iBATIS 藏宝图
讨论:iBATIS各种输入输出参数
3.3 iBATIS API(Spring SqlMapClientTemplate API)
第一个参数statementName都是必须的,其它参数都是可选的
增、删、改
public Object insert(String statementName, Object parameterObject)
public int update(String statementName, Object parameterObject)
public int delete(String statementName, Object parameterObject)
 
查询
public Object queryForObject(String statementName, Object parameterObject)
public List queryForList(String statementName, Object parameterObject)
void queryWithRowHandler (String statementName, Object parameterObject, RowHandler rowHandler) 不常用
public PaginatedList queryForPaginatedList(String statementName, Object parameterObject, int pageSize) 性能问题,已经被废弃(deprecated)
public Map queryForMap (String statementName, Object parameterObject, String keyProperty, String valueProperty)
没有了…
 
4.使用iBATIS的好处
       4.1简单,学习曲线低
       4.2使用公司投资回报率提高,一般是5到8倍
       4.3喝着Java(咖啡)写Java代码,节省大量编码维护时间
       4.4提高员工土气
       4.5性能好,灵活性强
       4.6集中管理后,DAO的实现简单,使用开发人员更专心于业务逻辑的处理。修改时不用修改Java代码。
       4.7使用preparedStatement,性能,安全性提高,代码简洁。
       4.8配置log4j在调试时输出SQL语句和返回记录集,漫天飞舞的System.out.print不见了。
       4.9不用担心,连接、记录集的关闭
       4.10缓存,讨论:很小变动的基础数据。
       4.11写程序时很自然地优化SQL,减少数据库的连接次数和操作次数
       讨论:
       一级分类1
              二级分类1.1 二级分类1.2
       一级分类2
              二级分类2.1 二级分类2.2
       一级分类3
              二级分类3.1 二级分类3.2
       讨论遗漏的好处。
       讨论缺点
5.iBATIS的配置文件
有两种:
5.1 sqlMapConfig文件
       只有一个,集中管理配置文件的“中央文件”
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
       PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
       "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
 
<sqlMapConfig>
    <settings cacheModelsEnabled="true"
              enhancementEnabled="true"
              lazyLoadingEnabled="true"
useStatementNamespaces="false"
statementCachingEnabled="true"
             classInfoCacheEnabled="true" />
    <sqlMap resource="com/ahtec/ssi/dao/ibatis/maps/SysModule.xml" />
    <sqlMap resource="com/ahtec/ssi/dao/ibatis/maps/EudProject.xml" />
</sqlMapConfig>
 
5.1 各个SQL Map 文件
<?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 namespace="dv_bbslink">
<typeAlias alias="link" type="com.ahtec.ssi.domain.Link" />
 
<cacheModel id="oneDayCache" type="OSCACHE">
<flushInterval hours="24" />
<flushOnExecute statement="insertLink" />
<flushOnExecute statement="updateLinkByPrimaryKey" />
<flushOnExecute statement="updateLinkByPrimaryKeySelective" />
<flushOnExecute statement="deleteLinkByPrimaryKey" />
<flushOnExecute statement="deleteLink" />
</cacheModel>
 
<resultMap class="com.ahtec.ssi.domain.Link" id="LinkResult">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="boardname" jdbcType="VARCHAR" property="boardname" />
<result column="readme" jdbcType="VARCHAR" property="readme" />
<result column="url" jdbcType="VARCHAR" property="url" />
<result column="logo" jdbcType="VARCHAR" property="logo" />
<result column="islogo" jdbcType="INTEGER" property="islogo" />
</resultMap>
 
<sql id="whereClause">
<isNotNull property="map.boardname"> and boardname like #map.boardname#</isNotNull>
<isNotNull property="islogo"> and islogo=#islogo#</isNotNull>
</sql>
 
<select id="selectLinkByPrimaryKey" parameterClass="link" resultMap="LinkResult" cacheModel="oneDayCache">
select id, boardname, readme, url, logo, islogo from dv_bbslink where id = #id:INTEGER#
</select>
 
<select id="selectLinkList" parameterClass="link" resultMap="LinkResult">
select id, boardname, readme, url, logo, islogo from dv_bbslink where 1=1
<isParameterPresent>
<include refid="whereClause" />
</isParameterPresent>
<isNotNull property="row.count">limit 0, #row.count#</isNotNull>
</select>
 
<select id="selectLinkCount" parameterClass="link" resultClass="int">
select count(*) from dv_bbslink where 1=1
<isParameterPresent>
<include refid="whereClause" />
</isParameterPresent>
</select>
 
<select id="selectLinkPaginatedList" parameterClass="link" resultMap="LinkResult">
select id, boardname, readme, url, logo, islogo from dv_bbslink where 1=1
<isParameterPresent>
<include refid="whereClause" />
</isParameterPresent>
<isNotNull property="row.count">limit #row.first#, #row.count#</isNotNull>
</select>
 
<insert id="insertLink" parameterClass="link">
insert into dv_bbslink (boardname, readme, url, logo, islogo) values (
#boardname#,
#readme#,
#url#,
#logo#,
#islogo#)
<selectKey keyProperty="id" resultClass="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
 
<update id="updateLinkByPrimaryKey" parameterClass="link">
update dv_bbslink set
boardname = #boardname#,
readme = #readme#,
url = #url#,
logo =#logo#,
islogo = #islogo#
where id = #id:INTEGER#
</update>
 
<update id="updateLinkByPrimaryKeySelective" parameterClass="link">
</update>
 
<delete id="deleteLinkByPrimaryKey" parameterClass="link">
delete from dv_bbslink where id = #id#
</delete>
 
<delete id="deleteLink" parameterClass="link">
delete from dv_bbslink
<include refid="whereClause" />
</delete>
 
</sqlMap>
 
6、实例(MySQL)
一个论坛链接的表,分为LOGO链接,文字链接,有如下字段
6.1 数据库表(dv_bbslink
Id                  自增ID(INTEGER
Boardname     论坛名称(VARCHAR
Readme          说明(VARCHAR
url                 链接地址(VARCHAR
logo               LOGO图片地址(VARCHAR
islogo             是否是LOGO链接(INTEGER
 
6.2 写一个Domain(POJO,Model)
Link.java
    private Integer id;
    private String boardname;
    private String readme;
    private String url;
    private String logo;
    private Integer islogo;
   //getters and setters
 
6.3 写接口(LinkDao)
       常用接口
       根据业务逻辑生成特定的接口
 
LinkDao.java
publicinterface LinkDao {
    Integer insertLink(Link link);
    int updateLinkByPrimaryKey(Link link);
    int updateLinkByPrimaryKeySelective(Link link);
    int deleteLink(Link link);
    int deleteLinkByPrimaryKey(Integer id);
    List selectLinkList(Link link);
    List selectLinkPaginatedList(Link link);
    Link selectLinkByPrimaryKey(Integer id);
    Integer selectLinkCount(Link link);
}
6.4 写实现(LinkDaoSqlMapImpl)
public class LinkDaoSqlMapImpl extends SqlMapClientDaoSupport implements LinkDao {
 
public int deleteLink(Link link) {
int rows = super.getSqlMapClientTemplate().delete("deleteLink", link);
return rows;
}
 
public Integer insertLink(Link link) {
Object newKey = super.getSqlMapClientTemplate().insert("insertLink", link);
return (Integer) newKey;
}
 
public Link selectLinkByPrimaryKey(Integer id) {
Link key = new Link();
key.setId(id);
Link record = (Link) super.getSqlMapClientTemplate().queryForObject("selectLinkByPrimaryKey", key);
return record;
}
 
public Integer selectLinkCount(Link link) {
return (Integer) super.getSqlMapClientTemplate().queryForObject("selectLinkCount", link);
}
 
public List selectLinkList(Link link) {
return (List) super.getSqlMapClientTemplate().queryForList("selectLinkList", link);
}
 
public List selectLinkPaginatedList(Link link) {
return (List) super.getSqlMapClientTemplate().queryForList("selectLinkPaginatedList", link);
}
 
public int updateLinkByPrimaryKey(Link link) {
int rows = getSqlMapClientTemplate().update("updateLinkByPrimaryKey", link);
return rows;
}
 
public int updateLinkByPrimaryKeySelective(Link link) {
int rows = getSqlMapClientTemplate().update("updateLinkByPrimaryKeySelective", link);
return rows;
}
 
public int deleteLinkByPrimaryKey(Integer id) {
int rows = super.getSqlMapClientTemplate().delete("deleteLinkByPrimaryKey", id);
return rows;
}
}
 
6.5配置SQL Map
       分析SQL Map 文件
6.7 配置 Spring Struts,写Action, View,OK。
       此讨论在本文范围外
 
7.其它
7.1 学习资源
       wiki
       faq
       maillist
       jpetstore 5.0
       Spring包里也有个JPetStore 建议学习
 
7.2 自动化工具
       Abatorhttp://ibatis.apache.org
       容易使用,三步:
       一、下载eclipse plug in
       二、新建并配置一个abatorConfig.xml
       三、生成model,sqlmap, dao和daoImpl
       最后一步,加工它生成的代码。
       再一步,喝咖啡
 
8 名人名言
if you are starting a new project and you&apos;re in full control of your object model and database design, Hibernate is a good choice of O/R tool.
Clinton Begin
 
if you are accessing any 3rd party databases (e.g. vendor supplied), or you&apos;re working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That&apos;s were  an SQL Mapper comes in handy
Clinton Begin
 
In the end the choice is yours and nobody can tell you what the right one is, Trust only yourself, draw your own conclusions and do lots of testing!
posted @ 2008-11-17 16:20 redcoatjk 阅读(2047) | 评论 (0)编辑 收藏
 

statement中的参数简介:
1. parameterClass
parameterClass 属性的值是Java类的全限定名(即包括类的包名)。parameterClass属性是可选的,目的是限制输入参数的类型为指定的Java 类。虽然Parameter-class属性是可选的,建议你为每一个SQL都指定parameterClass。如果不指定parameterClass 参数,任何带有合适属性(get/set 方法)的Java Bean 都可以作为输入参数。如果你使用了parameterMap, 那么你就不需要再使用parameterClass属性了。
下面是例子:
例1:
<insert id="insertAuthor2" parameterClass="Author">
       INSERT INTO author (auth_name,auth_age,auth_tel,auth_address) VALUES (#name#,#age#,#telephone#,#address#)
</insert>
 
在上面的语句中,你指定的parameterClass=Author,那么在你的Author类中要有name,age,telephone和address属性,并且要有相应的get和set方法
例2:
你可以使用基本类型作为parameterClass,如:
<delete id="deleteAuthor" parameterClass="int">
       delete from author WHERE auth_id = #id#
</delete>
例3:
你可以使用HashMap作为parameterClass,如:
<insert id="insertAuthor3" parameterClass="java.util.HashMap">
       INSERT INTO author (auth_name,auth_age,auth_tel,auth_address) VALUES (#name#,#age#,#telephone#,#address#)
</insert>
这时候,在你调用insertAuthor3的时候,你首先应该给传入的Map对象赋值,调用代码如下:
       HashMap paramMap = new HashMap();
       paramMap.put("name", "作者三");
       paramMap.put("age",new Integer(31));
       paramMap.put("address","南京");
       paramMap.put("telephone","025-987654321");
       sqlMapClient.insert("insertAuthor3", paramMap);
2. parameterMap
parameterMap 定义一系列有次序的参数用于匹配PreparedStatement 的JDBC值符号。
parameterMap属性很少使用,parameterMap 属性的值等于指定的parameterMap元素的name属性值。通常(和缺省的)的方法是使用inline parameters。
 
注意!动态mapped statement 只支持inline parameter,不支持parameter map。关于动态mapped statement,将在后文中介绍。
 
例如:
<parameterMap id="authorParameter" class="Author">
       <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
       <parameter property="age" jdbcType="INTEGER" javaType="java.lang.Integer" mode="INOUT"/>
       <parameter property="telephone" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
       <parameter property="address" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<insert id="insertAuthor1" parameterMap="authorParameter">
       INSERT INTO author (auth_name,auth_age,auth_tel,auth_address) VALUES (?,?,?,?)
</insert>
 
上面的例子中,parameterMap的参数按次序匹配SQL语句中的值符号(?)。因此,第一个"?"号将被"name"属性的值替换,而第二个"?"号将被"age"属性的值替换,依此类推。
 
记住:使用parameterMap的时候,SQL中的参数用"?"来代替,并且每个"?"的顺序要与parameterMap中的定义完全匹配;如果使用parameterClass,那么SQL中的参数用"#parameterName#"来代替,如果传入的参数类为Bean,那么要有get和set这个参数名的方法。
3. resultClass
resultClass 属性可以让您指定一个Java 类,根据ResultSetMetaData 将其自动映射到JDBC ResultSet。只要是JavaBean 的属性、方法名称和ResultSet的列名匹配,属性自动赋值列值。
 
例1:
<select id="getAuthor1" parameterClass="int" resultClass="Author">
       SELECT auth_id as id,auth_name as name,auth_age as age,auth_tel as telephone,auth_address as address FROM author WHERE auth_id = #id#
</select>
在上面的语句中,你指定的resultClass=Author,那么在你的Author类中要有id,name,age,telephone和address属性,并且要有相应的get和set方法。
如果你写成:
<select id="getAuthor1" parameterClass="int" resultClass="Author">
       SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_id = #id#
</select>
那么在你的Author类中,要有auth_id,auth_name,auth_age,auth_tel,auth_address属性,并且要有相应的get和set方法。
例2:
你还可以使用基本类型作为resultClass,如:
<statement id="getAuthorNumber" resultClass="int">
       <![CDATA[SELECT count(auth_id) as totalAuthor FROM author]]>
</statement>
例3:
你还可以使用HashMap作为resultClass,如:
<select id="getAuthor4" resultClass="java.util.HashMap">
       SELECT a.auth_id as authorid,a.auth_name as authname,a.auth_age as authage,a.auth_tel as authtel,a.auth_address as authaddress,b.art_title as arttitle FROM author a, article b WHERE a.auth_id=b.art_author
</select>
下面是调用代码:
List authorList = (List)sqlMapClient.queryForList("getAuthor4",null);
showMethod("getAllAuthor");
for(int i=0;i<authorList.size();i++)
{
       HashMap authMap = (HashMap)authorList.get(i);
       System.out.println("auth_id="+authMap.get("authid")+"; auth_name="+authMap.get("authname")+"; auth_age="+authMap.get("authage")+"; auth_tel="+authMap.get("authtel")+"; auth_address="+authMap.get("authaddress")+";auth_article="+authMap.get("arttitle"));
}
 
但是,使用resultClass 的自动映射存在一些限制,无法指定输出字段的数据类型,无法自动装入相关的数据(复杂属性),并且因为需要ResultSetMetaData的信息,会对性能有轻微的不利影响。但使用resultMap,这些限制都可以很容易解决。
4. resultMap
使用resultMap 属性可以控制数据如何从结果集中取出,以及哪一个属性匹配哪一个字段。不象上面使用resultClass 属性的自动映射方法,resultMap属性可以允许指定字段的数据类型,NULL 的替代值。
例如:
<resultMap id="authorResult" class="Author">
       <result property="id" column="auth_id"/>   
       <result property="age" column="auth_age"/>
       <result property="name" column="auth_name"/>
       <result property="telephone" column="auth_tel"/>
       <result property="address" column="auth_address"/>
</resultMap>
 
<select id="getAuthor3" resultMap="authorResult">
       SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_address like #%address%#
</select>

<statement id="getAllAuthor" resultMap="authorResult">
       SELECT * FROM author
</statement>
 
在上面的语句中,你指定的resultClass=Author,那么在你的Author类中要有id,name,age,telephone和address属性,并且要有相应的get和set方法。
 
通过resultMap 的定义,查询语句得到的ResultSet 被映射成Author对象。resultMap定义"id"属性值将赋予"auth_id"字段值,而"telephone"属性值将赋予"auth_tel"字段值,依次类推。
 
注意:在resultMap中所指定的字段必须是下面的select中的子集。
也就是说,你不能写成
<select id="getAuthor3" resultMap="authorResult">
       SELECT auth_address FROM author WHERE auth_address like #%address%#
</select>
但是你可以在resultMap中去掉<result property="id" column="auth_id"/>这行,仍然可以执行下面的语句:
<select id="getAuthor3" resultMap="authorResult">
       SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_address like #%address%#
</select>
这样的话,你就无法取得auth_id的值。
5. cacheModel
定义查询mapped statement 的缓存。每一个查询mapped statement 可以使用不同或相同的cacheModel。
<cacheModel id="author-cache" imlementation="LRU">
       <flushInterval hours="24"/>
       <flushOnExecute statement="insertProduct"/>
       <flushOnExecute statement="updateProduct"/>
       <flushOnExecute statement="deleteProduct"/>
       <property name="size" value="1000" />
</cacheModel>
<select id="getAuthor3" resultMap="authorResult" cacheModel="author-cache">
       SELECT auth_id,auth_name,auth_age,auth_tel,auth_address FROM author WHERE auth_address like #%address%#
</select>
 
上面的配置说明:"getAuthor3"的缓存使用WEAK引用类型,当你通过调用"getAuthor3"的时候,Ibatis将会把结果缓存起来。每24 小时缓存刷新一次,或当更新的操作(即上面配置的insertProduct、updateProduct或deleteProduct)发生时刷新。
 
当你对某些表中的记录操作频繁时,可以考虑使用缓冲,但是如果数据量过大的话,最好另想办法。
6. xmlResultName
当映射结果指向一个XML文档的时候,xmlResultName的值是指那个XML文档的root标签的名字。例如:
<select id="getAuthor1" parameterClass="int" resultClass="Author" xmlResultName="author">
       SELECT auth_id as id,auth_name as name,auth_age as age,auth_tel as telephone,auth_address as address FROM author WHERE auth_id = #id#
</select>
上面的select将产生如下的XML对象:
<author>
       <id>1</id>
       <name>作者三</name>
       <age>31</age>
       <telephone>025-987654321</telephone>
       <address>南京</address>
</author>

本篇文章来源于 新技术天空 原文链接:http://203.208.35.101/search?q=cache:VGS9aOGcGUkJ:www.ntsky.com/tech/java/opensource/ibatis/2007-06-29/7acdecd3b19824d6.html+parameterMap+%E7%94%A8%E6%B3%95&hl=zh-CN&ct=clnk&cd=5&gl=cn&lr=lang_zh-CN|lang_zh-TW&st_usg=ALhdy28HV28RUvZvcFSoHJtrbuRTGrXRLg

posted @ 2008-11-17 14:51 redcoatjk 阅读(168) | 评论 (0)编辑 收藏
仅列出标题
共8页: 上一页 1 2 3 4 5 6 7 8 
CALENDER
<2025年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(3)

随笔分类(22)

随笔档案(76)

文章分类(12)

文章档案(17)

搜索

  •  

积分与排名

  • 积分 - 250317
  • 排名 - 227

最新评论

评论排行榜


Powered By: 博客园
模板提供沪江博客