posts - 15, comments - 20, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2009年9月22日

       刚开始使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,对Excel2003以前(包括2003)的版本没有问题,但读取Excel2007时发生如下异常:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

        该错误意思是说,文件中的数据是用Office2007+XML保存的,而现在却调用OLE2 Office文档处理,应该使用POI不同的部分来处理这些数据,比如使用XSSF来代替HSSF。

        于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)来读取Workbook,对Excel2007没有问题了,可是在读取Excel2003以前(包括2003)的版本时却发生了如下新异常(真是太悲剧了):
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
        该错误是说,操作无效,不能打开指定的xls文件。

        下载POI的源码后进行单步调试,发现刚开始的时候还是对的,但到ZipFile类后就找不到文件了,到网上查了下,原来是XSSF不能读取Excel2003以前(包括2003)的版本,这样的话,就需要在读取前判断文件是2003前的版本还是2007的版本,然后对应调用HSSF或XSSF来读取。
        这是初步的想法,但这种做法比较麻烦,看了下API,发现XSSF和HSSF虽然在不同的包里,但却引用了同一接口Workbook,于是想到了这样的读取方法:
        Workbook book = null;
        try {
            book = new XSSFWorkbook(excelFile);
        } catch (Exception ex) {
            book = new HSSFWorkbook(new FileInputStream(excelFile));
        }
        在各版本的Excel中测试,没有发生异常,问题解决。

posted @ 2011-03-16 16:17 spinage 阅读(12682) | 评论 (1)编辑 收藏

   最近遇到了request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1,这是为什么呢,照道理讲,应该是127.0.0.1才对,为什么这个获取的值变成了ipv6了呢,而且我发现这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现,用127.0.0.1不会出现),后来上网查了查原因,原来是/etc/hosts这个东西作怪(在windows上应该是C:\Windows\system32\drivers\etc\ hosts这个文件),只需要注释掉文件中的 # ::1 localhost 这一行即可解决问题。另外localhost这个文件很有用,这里你可以添加自己的条目,例如添加 192.168.0.111 buyer.com这样子,在浏览器中原来只能使用192.168.0.111来访问的,并可以使用 buyer.com来进行替换。

posted @ 2011-03-16 16:08 spinage 阅读(934) | 评论 (1)编辑 收藏

假设当前已执行:select * from tab;

   (a)ppend 添加文本到缓冲区当前行尾

       例: SQL>a  order by tname

  结果:select * from tab order by tname;

  (注:a后面跟2个空格)

  (c)hange/old/new 在当前行用新的文本替换旧的文本

  例:SQL>c/*/tname

  结果:select tname from tab;

  (c)hange/text 从当前行删除文本

  例:SQL>c/tab

  结果:select tname from ;

   del 删除当前行

    del n 删除第n行 

  (i)nput 文本 在当前行之后添加一行 

  (l)ist 显示缓冲区中所有行 

  (l)ist n 显示缓冲区中第 n 行 

  (l)ist m n 显示缓冲区中 m 到 n 行

  (r)un 执行当前缓冲区的命令

  /  执行当前缓冲区的命令

  @文件名 运行调入内存的sql文件

     例:SQL> edit s<回车>

  如果当前目录下不存在s.sql文件,则系统自动生成s.sql文件,

  在其中输入“select * from tab;”,存盘退出。

  SQL> @s<回车>

    系统会自动查询当前用户下的所有表、视图、同义词。

      @@文件名 在.sql文件中调用另一个.sql文件时使用

      例:SQL>edit test<回车>

           在其中输入"@s",存盘退出。(这里s为上例中创建的sql文件)

           SQL>@@test<回车>

           结果就是执行了文件s.sql中的语法:自动查询当前用户下的所有表、视图、同义词。

  save 文件名             将缓冲区的命令以文件方式存盘,缺省文件扩展名为.sql

  get 文件名           调入存盘的sql文件

  start 文件名         运行调入内存的sql文件

  spool 文件名        把这之后的各种操作及执行结果“假脱机”即存盘到磁盘文件上,默认文件扩展名为.lst

    spool                 显示当前的“假脱机”状态

    spool off            停止输出

  例:

  SQL> spool a

  SQL> spool

  正假脱机到 A.LST

  SQL> spool off

  SQL> spool

  当前无假脱机

  exit             退出SQL*PLUS

  desc 表名     显示表的结构

  show user     显示当前连接用户

  show error    显示错误

  show all       显示所有68个系统变量值

  edit                打开默认编辑器,Windows系统中默认是notepad.exe,把缓冲区中最后一条SQL语句调入afiedt.buf文件中进行编辑

    edit 文件名   把当前目录中指定的.sql文件调入编辑器进行编辑

   clear screen   清空当前屏幕显示

posted @ 2010-04-06 16:04 spinage 阅读(315) | 评论 (0)编辑 收藏

关于在MyEclipseWEB工程里面的JS/JSP经常会有语法错误提示,这是由于MyEclipse对其语法要求相当严格所造成的,而这些文件本身是可以运行并没有什么错误的,在你实际应用部署中并无影响.

此问题解决办法有两种:

一、就是您不用去管它提示,直接部署到你的WEB容器上运行是可以的,但此方法欠妥当。

二、选择你的工程右击菜单——>点击MyEclipse菜单项的Exclude From Validation,如果你的工程里还有其它需要它检验其合法性建议可以针对某一文件夹或具体文件进行此项操作,这样可以只针对WEB工程里的某一个文件夹里面的JSP/JS文件来进行验证排除,这样就不会对这些被排除的文件或文件夹进行验证了,不过再你打开这些文件时,文件里面是有错误提示的,但工程是不会出现语法错误提示的。这样不仅解决了工程总提示语法信息错误的烦恼,对于一些确实存在问题的文件也可以查看其错误问题所在,可谓一举两得。

另外还可以通过使用Remove All Validation Markers此菜单项进移除所有的验证语法错误提示信息。

posted @ 2010-04-06 13:29 spinage 阅读(2345) | 评论 (2)编辑 收藏

Tomcat:
IOException while loading persisted sessions: java.io.EOFException解决

严重: IOException while loading persisted sessions: java.io.EOFException
严重: Exception loading sessions from persistent storage

原因是tomcat对硬盘的session读取失败,彻底解决办法一下:将work下面的文件清空,主要是*.ser文件,或者只是删除掉session.ser即可以解决。

posted @ 2010-03-24 09:57 spinage 阅读(234) | 评论 (0)编辑 收藏

eclipse 无法启动 JVM terminated. Exit code=-1
eclipse.ini中内存设置过大的问题,以前我修改过内存设置,一直都好好的,之前eclipse.ini的配置如下:

 

-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-Duser.language=en
-XX:PermSize=256M
-XX:MaxPermSize=512M

现在修改了一下,-Xms256m改成-Xms128m,把Xmx512m  改为 Xmx256m,结果还真的好了,没想到居然是这样的小问题引起来的。

====================================================================================

第二个,我们的项目采用svn管理,查找.svn,把所有.svn的文件删除

第三个,查看项目根文件夹下的.metadata,发现.metadata下面差很多插件,把现有项目的.metadate覆盖进去即可

 

posted @ 2010-01-26 09:12 spinage 阅读(335) | 评论 (0)编辑 收藏

 

1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。
2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。
3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。
4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生
隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5,此时不走索引的情况类似于case3。日期转换也有类似问题,如:
select * from t where trunc(date_col) = trunc(sysdate)其中date_col为索引列,这样写不会走索引,可改写成select * from t where date_col >= trunc(sysdate)
and date_col < trunc(sysdate+1),此查询会走索引。
5、并不是所有情况使用索引都会加快查询速度,full scan table 有时会更快,尤其是当查询的数据量占整个表的比重较大时,因为full scan table采用的是多块读,
当Oracle优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。

6、<>

7、like’%dd’百分号在前

8、not in ,not exist. 

posted @ 2010-01-14 15:16 spinage 阅读(2028) | 评论 (0)编辑 收藏

利用pinyin4j开源的一个小项目取中文首字母
 
public static String getAllFirstLetter(String str) {
  String convert = "";
  for (int j = 0; j < str.length(); j++) {
   char word = str.charAt(j);
   String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
   if (pinyinArray != null) {
    convert += pinyinArray[0].charAt(0);
   } else {
    convert += word;
   }
  }
  return convert;
 }

posted @ 2009-11-27 10:30 spinage 阅读(863) | 评论 (0)编辑 收藏

 在许多开源的框架中都充分的利用了设计模式这一概念,Struts典型的MVC模式的化身,Spring是工厂模式和单例模式的充分体现。在项目开发中,能充分利用设计模式的思想来考虑问题,来解决问题,来通过代码去实现。不但可以提高代码的质量,对程序的扩展,重用带来很大方便。其实我们项目中用设计模式编程就是加了一个封装层,减少客户必须处理的对象的数量。

 在设计模式中一般都遵循这样的原则:
      (1)按接口编程。
      (2)尽量用聚合代替继承。
      (3)找出变化并封装之。
     上面主要讲了一些设计模式的作用和原则。接下来是我对门面模式的一个简单理解。Facade(门面模式)是美国著名的四人帮(GOF)写的23种模式之一。
       简单的理解:我们需要用一种比原有的方法更简单的方法与系统交互,或者说,我们需要以一种特殊的方式使用系统。主要是为子系统中的一组接口提供一个统一的接口。Facade模式定义了一个更高的接口,使子系统更加容易使用。它的意图要求一个一致的高层接口。

posted @ 2009-11-27 10:25 spinage 阅读(296) | 评论 (0)编辑 收藏

序列化机制只保存对象的类型信息,属性的类型信息和属性值,和方法没有什么关系,你就是给这个类增加10000个方法,序列化内容也不会增加任何东西。

posted @ 2009-11-24 11:01 spinage 阅读(201) | 评论 (0)编辑 收藏

1.写一个方法,用一个for循环打印九九乘法表
Java code   
    /**
     * 打印九九乘法口诀表
     */
    public void nineNineMulitTable(){
        for (int i = 1,j = 1; j <= 9; i++) {
              System.out.print(i+"*"+j+"="+i*j+" ");
              if(i==j){
                  i=0;
                  j++;
                  System.out.println();
              }
          }
    }

 

2.给定一个java.util.Date对象,如何转化为”2007-3-22 20:23:22”格式的字符串
  Java code
    /**
     * 将某个日期以固定格式转化成字符串
     * @param date
    * @return str
    */
    public String date2FormatStr(Date date)
    {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      String str = sdf.format(date);
      return str;
    }

3.写一个方法,能够判断任意一个整数是否素数
 
    /**
    * 判断任意一个整数是否素数
    * @param num
    * @return boolean
    */
    public boolean isPrimeNumber(int num)
    {
      for (int i = 2; i <= Math.sqrt(num); i++) {
          if(num%i==0)
          {
              return false;
          }
      }
      return true;
    }
4.写一个方法,输入任意一个整数,返回它的阶乘
Java code    
     /**
      *获得任意一个整数的阶乘
      *@param n
      *@returnn!
      */
      public int factorial(int num)
      {
        //递归
        if(num == 1)
        {
            return 1;
        }
        return num*factorial(num-1);
      }

5.写一个方法,用二分查找法判断任意整数在任意整数数组里面是否存在,若存在就返回它在数组中的索引位置,不存在返回-1
Java code    
      /**
       *二分查找特定整数在整型数组中的位置(递归)
       *@param dataset
       *@param data
       *@param beginIndex
       *@param endIndex
       *@return index
       */
       public int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
         int midIndex = (beginIndex+endIndex)/2;
         //如果查找的数要比开始索引的数据要小或者是比结束索引的书要大,或者开始查找的索引值大于结束的索引值返回-1没有查到
         if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
             return -1;
         }
         if(data <dataset[midIndex]){ 
             return binarySearch(dataset,data,beginIndex,midIndex-1);
         }else if(data>dataset[midIndex])
         {
             return binarySearch(dataset,data,midIndex+1,endIndex);
         }else {
             return midIndex;
         }
       }
      
       /**
        *二分查找特定整数在整型数组中的位置(非递归)
        *@param dataset
        *@param data
        *@return index
        */
        public int binarySearch(int[] dataset ,int data)
        {
          int beginIndex = 0; 
          int endIndex = dataset.length - 1; 
          int midIndex = -1;
          if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
              return -1;
          }
          while(beginIndex <= endIndex) {
              midIndex = (beginIndex+endIndex)/2;
              if(data <dataset[midIndex]) { 
                 endIndex = midIndex-1; 
              } else if(data>dataset[midIndex]) { 
                beginIndex = midIndex+1; 
              }else {
                return midIndex;
              }
          }
          return -1;
        }

posted @ 2009-10-27 17:46 spinage 阅读(203) | 评论 (0)编辑 收藏

1.一道SQL语句面试题,关于group by
表内容:
2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负

如果要生成下列结果, 该如何写sql语句?

            胜 负
2005-05-09 2 2
2005-05-10 1 2
------------------------------------------
create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-10','胜')
insert into #tmp values('2005-05-10','负')
insert into #tmp values('2005-05-10','负')

1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq
2) select N.rq,N.勝,M.負 from (
select rq,勝=count(*) from #tmp where shengfu='胜'group by rq)N inner join
(select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq
3)select a.col001,a.a1 胜,b.b1 负 from
(select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,
(select col001,count(col001) b1 from temp1 where col002='负' group by col001) b
where a.col001=b.col001

2.请教一个面试中遇到的SQL语句的查询问题
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
------------------------------------------
select (case when a>b then a else b end ),
(case when b>c then b esle c end)
from table_name

3.面试题:一个日期判断的sql语句?
请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)
------------------------------------------
select * from tb where datediff(dd,SendTime,getdate())=0

4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):  
   大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。  
       显示格式:  
       语文              数学                英语  
       及格              优秀                不及格    
------------------------------------------
select
(case when 语文>=80 then '优秀'
        when 语文>=60 then '及格'
else '不及格' end) as 语文,
(case when 数学>=80 then '优秀'
        when 数学>=60 then '及格'
else '不及格' end) as 数学,
(case when 英语>=80 then '优秀'
        when 英语>=60 then '及格'
else '不及格' end) as 英语
from table

5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?
------------------------------------------
用户临时表:create table #xx(ID int, IDValues int)
系统临时表:create table ##xx(ID int, IDValues int)

区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
当创建它的进程消失时这个临时表就自动删除.

全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.

6.sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
------------------------------------------
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL    Server的存储容量是可以扩大的.

SQL Server 2000 数据库有三种类型的文件:

主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。

日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。

7.请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。
如使用存储过程也可以。

table1

月份mon 部门dep 业绩yj
-------------------------------
一月份      01      10
一月份      02      10
一月份      03      5
二月份      02      8
二月份      04      9
三月份      03      8

table2

部门dep      部门名称dname
--------------------------------
      01      国内业务一部
      02      国内业务二部
      03      国内业务三部
      04      国际业务部

table3 (result)

部门dep 一月份      二月份      三月份
--------------------------------------
      01      10        null      null
      02      10         8        null
      03      null       5        8
      04      null      null      9

------------------------------------------
1)
select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'
from table1 a,table2 b,table2 c,table2 d
where a.部门dep = b.部门dep and b.月份mon = '一月份' and
a.部门dep = c.部门dep and c.月份mon = '二月份' and
a.部门dep = d.部门dep and d.月份mon = '三月份' and
2)
select a.dep,
sum(case when b.mon=1 then b.yj else 0 end) as '一月份',
sum(case when b.mon=2 then b.yj else 0 end) as '二月份',
sum(case when b.mon=3 then b.yj else 0 end) as '三月份',
sum(case when b.mon=4 then b.yj else 0 end) as '四月份',
sum(case when b.mon=5 then b.yj else 0 end) as '五月份',
sum(case when b.mon=6 then b.yj else 0 end) as '六月份',
sum(case when b.mon=7 then b.yj else 0 end) as '七月份',
sum(case when b.mon=8 then b.yj else 0 end) as '八月份',
sum(case when b.mon=9 then b.yj else 0 end) as '九月份',
sum(case when b.mon=10 then b.yj else 0 end) as '十月份',
sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',
sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',
from table2 a left join table1 b on a.dep=b.dep

8.华为一道面试题
一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
------------------------------------------
select id, Count(*) from tb group by id having count(*)>1
select * from(select count(ID) as count from table group by ID)T where T.count>1

posted @ 2009-10-27 13:05 spinage 阅读(566) | 评论 (2)编辑 收藏

拼音排序
拼音有好几种方式,其中最主要的是中华人民共和国的汉语拼音 Chinese Phonetic。对汉字的排序有两种:一种是宽松的,能够按拼音排序最常用的汉字,另一种是严格的,能够按拼音排序绝大部分大部分汉字。

宽松的拼音排序法
原理:汉字最早是GB2312编码,收录了六千多个汉字,是按拼音排序的,编码是连续的。 后来出现了GBK编码,对GB2312进行了扩展,到了两万多汉字,并且兼容GB2312,也就是说GB2312中的汉字编码是原封不动搬到GBK中的(在GBK编码中[B0-D7]区中)。

如果我们只关心这6000多个汉字的顺序,就可以用下面的方法实现汉字宽松排序。

/**
* @author shaob
*
* Copyright (c)
*/

package chinese.utility;

import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class PinyinSimpleComparator implements Comparator<String> {
    public int compare(String o1, String o2) {
        return Collator.getInstance(Locale.CHINESE).compare(o1, o2);
    }
}

在对[孙, 孟, 宋, 尹, 廖, 张, 徐, 昆, 曹, 曾,怡]这几个汉字排序,结果是:[曹, 昆, 廖, 孟, 宋, 孙, 徐, 尹, 曾, 张, 怡]。最后一个 怡 有问题,不该排在最后的。

注意:这个程序有两个不足

由于gb2312中的汉字编码是连续的,因此新增加的汉字不可能再按照拼音顺序插入到已有的gb2312编码中,所以新增加的汉字不是按拼音顺序排的。
同音字比较的结果不等于0 。
下面的测试代码可以证明

/**
* @author shaob
*
* Copyright (c)

/**
* 非常用字(怡)
*/
@Test
public void testNoneCommon() {
    Assert.assertTrue(comparator.compare("怡", "张") > 0);
}

/**
* 同音字
*/
@Test
public void testSameSound() {
    Assert.assertTrue(comparator.compare("怕", "帕") != 0);
}

严格的拼音排序法
为了解决宽松的拼音的两点不足,可以通过实现汉语拼音的函数来解决。goolge下看到sf上有个pinyin4j的项目,可以解决这个问题,pinyin4j的项目地址是:http://pinyin4j.sourceforge.net/。

实现代码:

/**
  * @author shaob
  *
  * Copyright (c)
  */
package chinese.utility;

import java.util.Comparator;
import net.sourceforge.pinyin4j.PinyinHelper;

public class PinyinComparator implements Comparator<String> {

    public int compare(String o1, String o2) {

        for (int i = 0; i < o1.length() && i < o2.length(); i++) {

            int codePoint1 = o1.charAt(i);
            int codePoint2 = o2.charAt(i);

            if (Character.isSupplementaryCodePoint(codePoint1)
                    || Character.isSupplementaryCodePoint(codePoint2)) {
                i++;
            }

            if (codePoint1 != codePoint2) {
                if (Character.isSupplementaryCodePoint(codePoint1)
                        || Character.isSupplementaryCodePoint(codePoint2)) {
                    return codePoint1 - codePoint2;
                }

                String pinyin1 = pinyin((char) codePoint1);
                String pinyin2 = pinyin((char) codePoint2);

                if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字
                    if (!pinyin1.equals(pinyin2)) {
                        return pinyin1.compareTo(pinyin2);
                    }
                } else {
                    return codePoint1 - codePoint2;
                }
            }
        }
        return o1.length() - o2.length();
    }

    /**
     * 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。
     */
    private String pinyin(char c) {
        String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
        if (pinyins == null) {
            return null;
        }
        return pinyins[0];
    }
}

 

posted @ 2009-10-15 16:01 spinage 阅读(4986) | 评论 (0)编辑 收藏

在全局数据库ORCL下创建一个用户
首先在开始--》运行——》sqlplus,然后输入 sys/change_on_install as sysdba
以sys权限登陆进去
然后可以进行操作:
创建用户 create user test indentified by test;
这样就创建了一个用户名密码都为test的用户
但这个时候test还是不能登陆成功的,我们需要赋予相应的权限
首先赋予create session的权限
grant create session to test;
这样test用户就能成功登陆进去
但是此时用户还是不能创建表 我们需要赋予用户创建表的权限:
grant create table to test;
但是用户此时还不能创建表 因为需要有使用表空间的权限(相当于 用户有了进房间的钥匙 但是没有进大门的钥匙)
所以也应该赋予相应的权限
grant unlimited tablespace to test;
这个时候用户就拥有了创建表的权限 由于表是用户test的 相应的他就拥有了对创建的表的增删查改的权限了
我们要查看用户拥有什么权限可以通过查询一个系统的视图(数字字典)
select * from user_sys_privs;
这样就可以知道当前用户的权限

撤销权限 revoke create table from test;

场景:
用户test   用户test1
test1的用户创建了个表mytab 并且插入了一些数据
那么 test用户是否可以访问到test1的mytab怎么访问?
答:不可以,必须先授权
test1必须授权给test :grant select on mytab to test;
那么这个时候test可以通过 select * from test1.mytab;来访问mytab中的数据
如果想把某个表(对象)的所有权限都赋予给test那么可以:
grant all on mytab to test;
撤销所有权限
revoke all on mytab to test;


总结
对于系统权限由sys来做
对于对象权限由 谁拥有谁授权
系统权限:
   grant create session to test;
   grant create table to test;
   grant unlimited tablespace to test;

   revoke create session from test;
   revoke create table from test;
   revoke unlimited tablespase from test;

   grant create session to public;  //表示把创建表的权限赋予所有人

   select * from user_sys_privs;  //返回当前用户的所有系统权限

   grant select on mytab to test;
   grant all on mytab to test;

   revoke select on mytab from test;
   revoke all on mytab from test;

   
   对象权限可以控制到列 (更新和插入操作)
   grant update(name) on mytab to test;
   grant insert(id) on mytab to test;

   select * from user_col_privs;
   注意:查询和删除不能控制到列   
   需要有commit的 insert update insert

  权限的传递
  系统权限的传递:
  grant alter table to A with admin option;
  那么A可以通过把该权限传递给B,如果想B也可以传递下去那么可以也带上with admin option
  grant alter table to B;
  对象权限的传递:
  grant select on mytab to A with grant option;
  那么A可以把在表mytab的select权限赋予给B,如果B想也能传递该select权限也可以带上with grant option
  grant select on mytab to B;

----------------------------------------------------------------------------------------------------------

--创建用户
create user keeltest identified by keeltest;
--分配权限
grant create session,create table,create view ,create any index to keeltest;
grant unlimited tablespace to keeltest;

 

posted @ 2009-09-28 09:41 spinage 阅读(625) | 评论 (0)编辑 收藏

1、需要在你本机安装oracle客户端和pl/sql
2、配置你本机的tnsname文件 (E:\oracle\product\10.1.0\db_1\NETWORK\ADMIN)
在该文件中加入:
数据库名=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = IP )(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = 数据库名)
    )
  )
3、pl/sql连接 数据库名,输入 用户名密码

posted @ 2009-09-24 13:25 spinage 阅读(653) | 评论 (0)编辑 收藏

两种办法:

一、将 @author 属性写死 。

通过菜单 Window->Preference 打开参数设置面板,然后选择:
1.Java -> Code Style -> Code Templates
2.在右侧选择Comments,将其中的Types项,然后选右边的"Edit",进入编辑模式,将 @author ${user} 中的${user}改成你自己的名字即可。

二、修改用户名
控制面板-->计算机管理-->本地用户和组-->用户
使用管理员账户登陆 可以任意修改用户名 ,然后重启电脑,OK 。
PS:XP HOME EDITION 不保证其可用。

posted @ 2009-09-22 10:11 spinage 阅读(452) | 评论 (0)编辑 收藏

由于在svn的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想一些办法。

    解决方案如下:

在Eclipse使用SVN的过程中大多数人往往习惯把访问SVN的用户名密码自动保存起来
以便下次自动使用,不要再次手工输入,但是有些时候需要变更密码或者用户名,
这时候怎么办?在网上查找后发现如下方法:

1. 查看你的Eclipse中使用的是什么SVN Interface
windows > preference > Team > SVN #SVN Interface

2. 如果是用的JavaHL, 找到以下目录并删除auth目录下的文件.
C:"Documents and Settings"[YourUserName]"Application Data"Subversion"

3. 如果你用的SVNKit, 找到以下目录并删除.keyring文件.
[eclipse]"configuration"org.eclipse.core.runtime

    主要有两种方法,一种是删除SVN客户端的账号配置文件;另外一种就是去SVN服务端将账号设置成不可用。

    具体步骤:

    1、通过删除SVN客户端的账号配置文件

    (1)找到我们使用的客户端配置文件,在window xp下面他们的位置在系统盘的 Documents and Settings\alex\Application Data\Subversion\auth\文件夹中,把里面的所有文件删除。

    (2)使用SVN更新或提交,使得客户端与服务端进行通讯,这样就会SVN客户端就要求我们输入新的用户名密码,输入我们的用户名密码就可以替换掉旧的用户名密码。

    2、通过修改SVN服务端账号配置文件,这部分需要SVN的管理员配合

    (1)找到服务端账号配置文件,这个文件位于SVN服务器的安装路径 config文件夹,打开并编辑passwd文件,删除或注释需要被替换的账号

    (2)在客户端使用SVN更新或提交,使得客户端与服务端进行通讯,这样就会SVN客户端就要求我们输入新的用户名密码,输入我们的用户名密码就可以替换掉旧的用户名密码。

posted @ 2009-09-22 10:08 spinage 阅读(81764) | 评论 (15)编辑 收藏