posts - 262,  comments - 221,  trackbacks - 0
     摘要: 设置列格式的相关命令  阅读全文
posted @ 2008-05-26 23:15 Paul Lin 阅读(929) | 评论 (0)编辑 收藏
     摘要: 设置标题的相关命令  阅读全文
posted @ 2008-05-26 22:54 Paul Lin 阅读(773) | 评论 (0)编辑 收藏
     摘要: 和执行相关的命令  阅读全文
posted @ 2008-05-26 22:50 Paul Lin 阅读(1134) | 评论 (0)编辑 收藏

如题,Oracle数据库里面有一批记录,现在我想根据其中一个叫:txn_date的字段来查询记录,在Hbm文件中我配置了该HQL,如下所示:

<sql-query name="job.getJobByDate">
    select {job.*} from Newsletter_Message job 
     where to_char(:dateType,'yyyy-mm-dd hh24:mi') = 
           to_char(:jobDate, 'yyyy-mm-dd hh24:mi')
<return alias="job"
        class
="com.newsletter.domain.job.Job" />
</sql-query>


在DAO方法中我使用了Spring的HibernateTemplate,方法如下:

public List<Job> getJobByDate(final Date jobDate, final String dateType) {
 
return (List<Job>
  getHibernateTemplate().executeFind(
    
new HibernateCallback() 

      
public
 Object doInHibernate(Session session)
          
throws HibernateException 
{
        Query query 
= session.getNamedQuery("job.getJobByDate"
);
        query.setString(
"dateType"
, dateType);
        query.setDate(
"jobDate"
,jobDate);
        
return
 query.list();
      }

 }
);
}


Hibernate生成的SQL语句如下

select job.TXN_NO as TXN1_5_0_,
       job.TXN_TYPE 
as
 TXN2_5_0_,
       job.TXN_DATE 
as
 TXN3_5_0_, 
  
from
 Newsletter_Message job
 
where to_char(?, 'yyyy-mm-dd hh24:mi'= to_char(?, 'yyyy-mm-dd hh24:mi')


每次执行时,总是抛异常,说:
org.springframework.dao.DataIntegrityViolationException: Hibernate operation: could not execute query;
.....
Caused by: java.sql.SQLException: ORA-01722: invalid number

我实在不明白为什么会报这个错误,难道Hibernate在set date或者set string之前不会对其进行格式的转换吗?于是我又换了另外一个HQL语句,在代码里面提前将Date格式成String,但还是报错:

where to_char(dateType,'yyyy-mm-dd hh24:mi') = :strDate

后来实在没办法了,用了一阴招,代码如下,测试通过,但是觉得这种代码太丑陋了。

public List<Job> getJobByDate(final Date jobDate, final String dateType) {
  
return getHibernateTemplate().executeFind(new HibernateCallback() 
{
    
public
 Object doInHibernate(Session session)
        
throws HibernateException 
{

     String strDate 
=
 DateUtil.convertDateToString(jobDate,
                            
"yyyy-MM-dd HH:mm"
);
    Query query 
= session.createQuery("from Job job where "

                        
+ "to_char(" + dateType + ",'yyyy-mm-dd hh24:mi') = '"
                         
+ strDate + "'");
    
return (List<Job>
) query.list();
    }

  }
);
}


不知道各位能否解析一下上面那个报错的原因,谢谢先了!

posted @ 2008-05-22 16:40 Paul Lin 阅读(2250) | 评论 (0)编辑 收藏

【1】pfile:初始化参数文件

包含了init.ora文件,该文件定义了几个非常重要的参数:

·db_domain:数据库域名
·db_name:数据库名
·control_files:控制文件的路径,通常有3个文件
·shared_pool_size=共享池的大小
·background_dump_dest=后台进程日志、跟踪文件路径
·core_dump_dest=操作系统崩溃的日志、跟踪文件路径
·user_dump_dest=用户进程的跟踪文件路径

【2】budmp:存放由后台进程所生成的数据库Alert日志文件和跟踪文件

典型的包含了一个.log文件和一个.trc文件。

打开.log文件我们可以看到里面有很多后台进程的启动及运行信息,其中最关键的就是加载init.ora文件和起点后台进程的日志了


Starting up ORACLE RDBMS Version: 9.2.0.1.0.
System parameters with non-default values:
  processes                = 150
  timed_statistics         = TRUE
  shared_pool_size         = 50331648
  large_pool_size          = 8388608
  java_pool_size           = 33554432
  control_files            = C:\oracle\oradata\paullin\control01.ctl, C:\oracle\oradata\paullin\control02.ctl, C:\oracle\oradata\paullin\control03.ctl
  db_block_size            = 8192
  db_cache_size            = 25165824
  compatible               = 9.2.0.0.0
  db_file_multiblock_read_count= 16
  fast_start_mttr_target   = 300
  undo_management          = AUTO
  undo_tablespace          = UNDOTBS1
  undo_retention           = 10800
  remote_login_passwordfile= EXCLUSIVE
  db_domain                =
  instance_name            = paullin
  dispatchers              = (PROTOCOL=TCP)
  job_queue_processes      = 10
  hash_join_enabled        = TRUE
  background_dump_dest     = C:\oracle\admin\paullin\bdump
  user_dump_dest           = C:\oracle\admin\paullin\udump
  core_dump_dest           = C:\oracle\admin\paullin\cdump
  sort_area_size           = 524288
  db_name                  = paullin
  open_cursors             = 300
  star_transformation_enabled= FALSE
  query_rewrite_enabled    = FALSE
  pga_aggregate_target     = 25165824
  aq_tm_processes          = 1
PMON started with pid=2
DBW0 started with pid=3
LGWR started with pid=4
CKPT started with pid=5
SMON started with pid=6
RECO started with pid=7
CJQ0 started with pid=8
QMN0 started with pid=9

而.trc文件里面则保存了当前会话的ID


【3】cdump:存放发生崩溃的操作系统的系统进程信息

【4】create:存储创建数据库的SQL脚本

【5】udmp:存储用户进程所生成的跟踪文件
posted @ 2008-05-04 17:41 Paul Lin 阅读(560) | 评论 (0)编辑 收藏

1.关于单元测试:

单元测试中的Test Case在设计时,有两点要注意的:

a. 测试的方法最好短小精悍,每个test case只测试一个关注的功能,假如一个方法的处理逻辑里面包含了对几种可能情况的处理,那么测试案例最好分成几个来测试,举例如下
  
   方法: public void convertStringToDate(String string)
 
   在实际应用过程中,传入参数string的值可能有下面几种情况:
  
   1). Null
   2). 空格
   3). 非空但格式错误
   4). 非空且格式正确,但值错误(如:2008-02-31 23:59:59)
   5). 非空且格式、值均正确

   那么如果我们在同一个测试方法中: public void testConvertStringToDate()测试所有的可能情况,会有下面两个问题:

   1). 代码量增多
   2). 不利于修改,假如由于业务方法中某个处理逻辑改变了,此时重新测试时必须测试所有其它的方法
   3). 可能造成测试案例的顺序依赖,比如其中某个方法会抛出异常,之后的测试案例可能不会被执行到

如果我们按照上面可能出现的情况来分的话,那么就有五个测试案例,从数量上看是多了,但是后果就是每个方法都非常短小(不超过6行),简单明了,一目了然,即便测试案   例错了,我也能马上看出来。其次一个测试案例的修改不会影响到其它的测试案例。

b.测试方法是否抛出异常,可以参考下面的代码结构:
 
  try{
      调用被测试代码 // 此处的代码必须是明确会抛出异常的,因为这是我们要测试的目的
      fail("Error: Must throw an exception here.");
  } catch(Exception e){
      assertTrue(true);
  }


2.关于使用DateFormat及其子类进行字符串和日期转换的注意点:

使用DateFormat将字符串转换成Date对象时,必须注意在转换前,先调用:setLinient(false);否则的话即使实际的日期数值有问题,例如2008-04-32 23:59:59,只要格式正确,也能够被转换成功,但这在实际的应用中是没有意义的。

posted @ 2008-04-28 00:37 Paul Lin 阅读(207) | 评论 (0)编辑 收藏
     摘要: 最近在使用Oracle9i数据库进行数据插入、查询、导入/出,有时会出现乱码的情况,具体的情形有以下两种:

1.首次插入/显示乱码

2.首次插入/显示正常、但把数据用工具导出为本地文件(例如TXT)文件,再在另一个客户端中打开该文件并执行时
再次插入的数据显示为乱码。

遂在本地创建两个数据库,一个为AL32UTF8字符集,一个为ZHS16GBK字符集,配合客户端NLS_LANG的不同设置,测
试乱码的情况及进行原因分析。

希望本文能够对仍处于Oracle字符集泥潭的同仁一点帮助  阅读全文
posted @ 2008-04-23 14:59 Paul Lin 阅读(7825) | 评论 (0)编辑 收藏
<project name="autobuildtest" default="test">    
    
<target name="setProperties">

        
<property name="src.dir" value="src"/>
        
<property name="classes.dir" value="classes"/>
       
</target>
    
    
<target name="prepareDir" depends="setProperties">
        
<delete dir="${classes.dir}"/>
        
<mkdir dir="${classes.dir}"/>
    
</target>
    
    
    
<target name="compile" depends="prepareDir">
        
<javac srcdir="./src" destdir="${classes.dir}"/>     
    
</target>

    
    
<target name="test" depends="compile">
        
<junit printsummary="yes">
            
<test name="onlyfun.caterpillar.test.MathToolTest"/>
          
<classpath>
              <pathelement location="${classes.dir}"/>
          </classpath>
        
</junit>
    
</target> 
</project>
 

上面XML文件高亮处描述了Ant如何与JUnit结合进行自动化测试,name属性是你要测试的TestCase,classpath元素指明了TestCase的路径,printsummary说明了要将测试的结果简单的显示出来。

如何吧JUnit测试的详细信息显示出来呢?我们可以采用<formatter>元素,如下所示:

<junit printsummary="yes">

    
<formatter type="plain" usefile="false"/>

    
<test name="onlyfun.caterpillar.test.MathToolTest"/>
      
<classpath>
        
<pathelement location="${classes.dir}"/>
      
</classpath>         
</junit>

当usefile属性设定为true时,会自动帮您将产生的结果储存在档案中,预设是TEST-*.txt,其中*是您的测试案例类别名称。除此之外,我们也可用采用XML的格式来保存测试结果。如下所示:

<formatter type="xml"/>

也可以将测试结果所产生的XML文件转换为HTML文件,使用Ant可以直接帮您完成这个工作,<junitreport>标签使用 XSLT将XML文件转换为HTML文件

<project name="autobuildtest" default="report">

    
<target name="setProperties">
        
<property name="src.dir" value="src"/>
        
<property name="classes.dir" value="classes"/>
        
<property name="report.dir" value="report"/>    
    
</target>
    
    
<target name="prepareDir" depends="setProperties">
        
<delete dir="${report.dir}"/>
        
<delete dir="${classes.dir}"/>
        
<mkdir dir="${report.dir}"/>
        
<mkdir dir="${classes.dir}"/>
    
</target>

    
<target name="compile" depends="prepareDir">
        
<javac srcdir="./src" destdir="${classes.dir}"/>
    
</target>
    
    
<target name="test" depends="compile">
        
<junit printsummary="yes">
            
<formatter type="xml"/>
            
<test name="onlyfun.caterpillar.test.MathToolTest"
                    todir="${report.dir}"
/>
            
<classpath>
                
<pathelement location="${classes.dir}"/>
            
</classpath>
        
</junit>
    
</target>

    
<target name="report" depends="test">
        
<junitreport todir="${report.dir}">
        
<fileset dir="${report.dir}">
            
<include name="TEST-*.xml"/>
        
</fileset>
        
<report format="frames" todir="${report.dir}/html"/>
    </junitreport>
    
</target> 
</project>

上面的例子,首先定义了一个property,用于指向保存测试结果的目录,接着在<test>元素中通过<todir>将结果指向该目录。然后report目标首先在todir属性指定的目录下查找名称包含:TESTd的XML文件,找到之后通过XSL转换成带frame的HTML页面,存放到子目录html下面

最终的结果可能如下:


posted @ 2008-04-21 15:21 Paul Lin 阅读(649) | 评论 (0)编辑 收藏

【1】path和location属性的区别:
 
<classpath>
    <pathelement path="${classpath}"/>
     <pathelement location="lib/helper.jar"/>
</classpath>
 
原文:The location attribute specifies a single file or directory relative to the project's base directory (or an absolute filename), while the path attribute accepts colon- or semicolon-separated lists of locations. The path attribute is intended to be used with predefined paths - in any other case, multiple
elements with location attributes should be preferred.
 
从中我们可以看出path可以用于指向存在多个文件的位置,而location只能指向单个的文件或目录。另外path可以被设定id,供其它的path或classpath引用。如:<path id="main-classpath">,而classpath则没有

【2】综合示例:
In addition, DirSets, FileSets, and FileLists can be specified via nested <dirset>, <fileset>, and <filelist> elements, respectively. Note: The order in which the files building up a FileSet are added to the path-like structure is not defined.
 
    <classpath>
      <pathelement path="${classpath}"/方式① :引用特定的变量

      <fileset dir="lib"方式② :指向特定的文件集
        <include name="**/*.jar"/>
      </fileset>

      <pathelement location="classes"/方式③:指向单个目录

      <dirset dir="${build.dir}"方式④:指向特定目录集
        <include name="apps/**/classes"/>
        <exclude name="apps/**/*Test*"/>
      </dirset>

      <filelist refid="third-party_jars"/> 方式⑤:引用指定文件列表
    </classpath>
 
This builds a path that holds the value of ${classpath}, followed by all jar files in the lib directory, the classes directory, all directories named classes under the apps subdirectory of ${build.dir}, except those that have the text Test in their name, and the files specified in the referenced FileList.

posted @ 2008-04-21 14:28 Paul Lin 阅读(1915) | 评论 (0)编辑 收藏
     摘要: Visitor模式的一个优点体现在对集合元素的访问中:由于集合中的可访问元素都实现了Visitable接口,所以在迭代集合的过程中,我们可以将每个元素都看成是接口类型。

其次由于JAVA语言的多态性,虽然每个元素都是接口类型(Visitable),但每个元素的实现类不同,所以在调用accept方法时,虚拟机“知道”应该调起那个正确的方法(例如:集合中的一个String元素,会调用StringElement的accept方法)  阅读全文
posted @ 2008-04-15 17:38 Paul Lin 阅读(4464) | 评论 (2)编辑 收藏
仅列出标题
共26页: First 上一页 18 19 20 21 22 23 24 25 26 下一页 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜