List的排序是经常遇到的问题,一般都是用一个实现了Comparator接口的类实现。
.比如我有一个Person类,
它的实例对象存储在ArrayList数组中,现在要把ArrayList数组中的Person对象按照年龄排序.
其实这种情况经常遇到.
下面给出源代码:

1:Person.java文件:-------------------------------
public class Person{
 String name;
 int age;
 
 public Person(String name,int age){
  this.name = name;
  this.age = age;
 
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

}


2:Mycomparator.java-------------------------------
//实现Comparator接口,也就是定义排序规则,你几乎可以定义任何规则
import java.util.*;
public class Mycomparator implements Comparator{

 public int compare(Object o1,Object o2) {
  Person p1=(Person)o1;
  Person p2=(Person)o2; 
  if(p1.age<p2.age)
   return 1;
  else
   return 0;
 }

}

3:ListSort.java------------------------------------

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class ListSort {
 public static void main(String[] args){
  ArrayList list = new ArrayList();
  list.add(new Person("lcl",28));
  list.add(new Person("fx",23));
  list.add(new Person("wqx",29));
  Comparator comp = new Mycomparator();
  Collections.sort(list,comp); 
  for(int i = 0;i<list.size();i++){
   Person p = (Person)list.get(i);
   System.out.println(p.getName());
  } 
 
 }

}

posted @ 2006-07-06 18:18 负人博客 阅读(1184) | 评论 (0)编辑 收藏

一:取得数据库连接
   1.用DriverManager取数据库连接
    例子
      String className,url,uid,pwd;
      className = "oracle.jdbc.driver.OracleDriver";
      url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
      uid = "system";
      pwd = "manager";
      Class.forName(className);
  Connection cn = DriverManager.getConnection(url,uid,pwd);
   2.通过JNDI取得数据库连接
 用jndi(java的命名和目录服务)方式
   例子
      String jndi = "jdbc/db";
      Context ctx = (Context) new InitialContext().lookup("java:comp/env");
      DataSource ds = (DataSource) ctx.lookup(jndi);
      Connection cn = ds.getConnection();
二:执行sql语句
 1.用Statement来执行sql语句
     String sql;
     Statement sm = cn.createStatement();
     sm.executeQuery(sql); // 执行数据查询语句(select)
     sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
   2.用PreparedStatement来执行sql语句
     String sql;
     sql  = "insert into user (id,name) values (?,?)";
     PreparedStatement ps = cn.prepareStatement(sql);
     ps.setInt(1,xxx);
     ps.setString(2,xxx);
    ...
     ResultSet rs = ps.executeQuery(); // 查询
     int c = ps.executeUpdate(); // 更新
三:处理执行结果
   查询语句,返回记录集ResultSet
   更新语句,返回数字,表示该更新影响的记录数
   ResultSet的方法
    1、next(),将游标往后移动一行,如果成功返回true;否则返回false
    2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
四:释放连接
  cn.close();
  一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection


可滚动、更新的记录集
 1、创建可滚动、更新的Statement
  Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
  该Statement取得的ResultSet就是可滚动的
 2、创建PreparedStatement时指定参数
  PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

  ResultSet.absolute(9000); 
批量更新
 1、Statement
  Statement sm = cn.createStatement();
  sm.addBatch(sql1);
  sm.addBatch(sql2);
  ...
  sm.executeBatch()
  一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
 2、PreparedStatement
  PreparedStatement ps = cn.preparedStatement(sql);
  {
   ps.setXXX(1,xxx);
   ...
   ps.addBatch();
  }
  ps.executeBatch();
  一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。

 
事务的处理
 1、关闭Connection的自动提交
  cn.setAutoCommit(false);
 2、执行一系列sql语句
  要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
 Statement sm ;
 sm = cn.createStatement(insert into user...);
 sm.executeUpdate();
 sm.close();

 sm = cn.createStatement("insert into corp...);
 sm.executeUpdate();
 sm.close();

 3、提交
  cn.commit();
 4、如果发生异常,那么回滚
  cn.rollback();

posted @ 2006-07-06 18:15 负人博客 阅读(1237) | 评论 (0)编辑 收藏

1 Properties类直接读取属性文件
 
public class Test {
 public static void main(String[] args) {
  InputStream is = Test.class.getResourceAsStream("nojar.properties");
  if (is == null)
   System.out.println("文件找不到");
  Properties prop = new Properties();
  try {
   prop.load(is);
  } catch(Exception e) {
   e.printStackTrace();
  }
  System.out.println(prop.getProperty("test"));
 }
}
2 通过ResourceBundle读取属性文件

public class Test {
 public static void main(String[] args) {
  ResourceBundle rb = ResourceBundle.getBundle("test");
  System.out.println(rb.getString("test"));
 }
}

posted @ 2006-07-06 18:13 负人博客 阅读(367) | 评论 (0)编辑 收藏

对于protected关键字经常在使用中弄混,特写一小例进行测试
Protected方法或属性例子:


Package com.first;

Public class Test1 {
 Protected String a;
Protected void test() {
  System.out.println(“it is a test”);
}
}
package com.second;
import com.first.*;
public class Test2 extends Test1 {
 Test1 test1 = new Test1();
Test2 test2 = new Test2();
test1.a = “test”;//错误
test2.a = “test”; //正确
test1.test();//错误
test2.test();//正确
}
///原因,protected定义的东西在不同包内不能访问,只有继承的子类可以访问

posted @ 2006-07-06 18:13 负人博客 阅读(307) | 评论 (0)编辑 收藏

由于公司的项目需要这几天一直在研究jasperreport和ireport,到现在已经研究了一段时间了,在学习过程中遇到了一些问题同时也学到了一些技巧,特做小文以享于他人.
1。工具简介
      jasperreport和ireport都是开源软件,可以免费下载。
ireport使jasperreport的一个可视化设计工具,里面集成了一些画图工具和数据库的操作,用ireport做出来的是一个jrxml文件也可以在里面直接编辑此文件(比较麻烦)。经过运行编译后生成jasper文件,这个文件是我们需要的东西,将来我们做报表读取的就是这个文件。工具的其他一些东西像下载地址之类的网上到处都是,在此就不细说了。下面我就把我这段时间遇到的问题在这做一个总结。
2。用ireport遇到的一些问题
      (1)解决里面的中文问题:
              在pdf里面不能显示中文
              解决方案:
                 1。将itextasian.jar下载下来(google一搜就有)放到  ireport目录底下的lib文件夹下即可。有人还说要再放一个itext.jar到
lib目录下,但是在我的应用过程中发现不放此文件也可以。
                 2。将每个文本域属性当中的PDF font name改为STSong-Light并且将PDF encoding里面的设置改为UniGB-UCS2-H (Chinese Simplified),此时应该差不多了。
       (2) 解决IE里面的斜线问题
            用ireport画的斜线无法在IE里面显示(因为html本身无法支持斜线)
            解决方案:将需要显示斜线的地方做成图片,然后利用image控件加载图片即可
          (3)解决IE里面无法显示的问题
                 在ireport里面画出的图表无法在ie里面显示
                 解决方案:在Ireport里面画图的时候不要用直线工具,里面的线全部用static text文本框的border画出。也就是说,里面的图表全部都是用文本框堆积成的。切记:图表里面的所有元素都不能交叉,如果有一点交叉或重叠,在IE里面都是显示不全的。
3。应用时常见的几种方式:
       由于html自身的局限性,以及html显示的问题,现在在网络上传输的打印很多都采用pdf格式输出。jasperreport对pdf做了很好的支持!
       个人根据需要可以改写jasperreport的代码,以使之更好的为自己服务。
     1.可以把数据放到map中传递到pdf打印页面(一般适合类似票据打印)   
        Map parameters = new HashMap();//参数

        通过把map输出到ireport模板中,得到要打印的票据

     2.可以把结果集放到collection中,这样想打印什么都可以了!

     3.剩下的就是写sql了,通过map把参数传递过去,利用参数就可以写要查询的结果集了。

注:在ireport通过查询语句取结果集的时候发现定义的参数顺序和ireport生成模板的顺序不一致,这样在sql中如果条件是(a,b,c)结果它把参数的顺序写成了(b,c,a)或者什么的。不知道这是不是ireport的bug。

posted @ 2006-07-06 17:34 负人博客 阅读(1923) | 评论 (0)编辑 收藏

     在我们的日常开发中,经常需要通过输出一些信息进行程序的调试,如果到处都用system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调试输出机制以解决输出的问题。log4j的原理是使用一个配置文件log4j.properties进行管理,在调试的时候可以把输出级别调低,项目正式发布之后把级别调高,这样以前的一些输出就可以屏蔽了,不用到程序当中再进行逐一删除。关于log4j的介绍网上很多,随便google一下就可以顺利的使用log4j了。在这里介绍一下log4j和common-logging的联合使用,因为在很多框架当中都是结合了common-logging和log4j的应用。像spring之类的框架里面存在很多debug输出,用common-logging可以很容易的打印输出,以用于了解spring的运行机制!
   使用介绍:
   1.下载jar包:
       log4j-1.2.9.jar和commons-logging.jar
   2.在web目录的classes下面添加两个文件:commons-logging.properties和log4j.properties      
      log4j.properties(例子):
          ##LOGGERS##
          #define a logger
          log4j.rootLogger=INFO,console,file
          #log4j.rootLogger=DEBUG,console,file
          ##APPENDERS##
         #define an appender named console,which is set to be a ConsoleAppender
         log4j.appender.console=org.apache.log4j.ConsoleAppender
         #define an appender named file,which is set to be a RollingFileAppender
         log4j.appender.file=org.apache.log4j.RollingFileAppender
         log4j.appender.file.File=log-wst.txt
         ##LAYOUTS##
         #assign a SimpleLayout to console appender
         log4j.appender.console.layout=org.apache.log4j.SimpleLayout
         #assign a PatternLayout to file appender
         log4j.appender.file.layout=org.apache.log4j.PatternLayout
         log4j.appender.file.layout.ConversionPattern=%p - %m%n
     
      commons-logging.properties(例子)
          ##
          org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
   3.应用实例:
     package com.wes.test;
     import org.apache.commons.logging.Log;
     import org.apache.commons.logging.LogFactory;
    public abstract class BaseClass{
         /** 用于日志输出 */
         protected Log log = LogFactory.getLog(this.getClass());
    }
    这样在子类中可以直接调用log输出即可:
   public class DerivedClass extends BaseClass {
         pulbic void test() {
             //如果log4j.properties文件配置的级别<=info则可以正常输出(info/debug) 
            log.info("这是info级别的输出");   
             //如果log4j.properties文件的级别为debug则可以正常输出(debug) 
            log.debug("这是debug级别的输出");
         }
   }

 

posted @ 2006-07-06 17:31 负人博客 阅读(2916) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3 

posts - 26, comments - 5, trackbacks - 0, articles - 8

Copyright © 负人博客