当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

#

以下是使用SqlToolbox使用图解教程,虽然是早期版本,但对于当前版本也一样有参考价值。

1) 启动SqlToolBox.
如下图,点击其中的"Run.bat"启动程序.


打开后,程序将显示以下界面:


2.通过对话框打开数据库.
首次启动时,用户本机没有XML描述数据源文件,只能通过对话框来打开数据库.
点击菜单中的"文件"->"打开数据源对话框",将弹出以下界面.


接下来输入数据库服务器的IP地址和数据库名,举例如下:


接着,选择数据库类型,我的数据库是Oracle的,就选它了.选完后,你会发现数据库类型和Url都被自动填入了.


接下来填入用户名和密码,如果所有信息均正确,你稍等一会就能看到数据库操作窗口被打开了.

3.存储数据库信息文件.
点击数据源窗口中的"保存文件"按钮,写入文件名,你就将数据库信息存储到了文件中.


文件信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasource>
    
<type>oracle</type>
    
<url>jdbc:oracle:thin:@192.168.104.173:1521:orcl</url>
    
<usr>hy</usr>
    
<pswd>hy</pswd>
</datasource>


4.通过数据库信息文件打开数据库.
点击菜单"文件"->"打开XML形式的数据源文件",找到刚才保存的文件,


然后出现以下界面:


"执行中"对话框消失后,表空间和表都被载入了.
以下是平面视图状态的表和表空间.


以下是树视图状态的表空间和表:


5.查看表的字段及其字段属性
在平面视图中中选择一个表,左下方即出现这个表的字段及其字段属性,如下图:


在树视图中左键选择第三级节点-表节点,也可以达到同样的效果。


6.取得单表的各种Sql文。
在平面视图或树视图中,对着表名,点击右键,会弹出一个菜单,选择“取得单表查询语句”到“取得单表更新语句”这五个菜单项,能得到Select,insert,delete,update等四种SQl文。它们将出现在右边的当前选项卡的文本框中。


树视图中的同等操作:

posted @ 2009-02-01 18:24 何杨 阅读(1820) | 评论 (5)编辑 收藏

效果图:


代码如下:
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;

public class WindowDesktop extends JDesktopPane{
    
private static final long serialVersionUID = -3458049910691811494L;
    Image image
=new ImageIcon(MainFrame.class.getResource("/background.jpg")).getImage();
    
    
public WindowDesktop(){
        
super();
    }

    
    
public void paintComponent(Graphics g)
        g.drawImage(image, 
00, getWidth(), getHeight(), 00, image
                .getWidth(
null), image.getHeight(null), null);
    }
 
}
posted @ 2009-01-30 19:21 何杨 阅读(2075) | 评论 (1)编辑 收藏

界面概览:


整体说明
SqlToolBox是一款纯绿色,完全免费的,专为程序员打造的数据库客户端管理工具,旨在于向与数据库打交道的程序员提供各种便利。

功能简介:
1.无需安装数据库的客户端,通过本程序即可访问各种常用数据库.
2.本软件已经加载了Oracle和MySql两种数据库的驱动包,可以畅通无阻的访问这两种数据库,您不用进行任何特别设置。
3.对于Db2,Sqlserver,Sybase,Informix,PostgreSql等数据库,软件已经内置对它们的支持,用户只需加载相关数据库的驱动jar包即可。(请参照Run.bat文件进行修改).
3.打开数据库时既可通过对话框的形式打开,您只需要输入“数据库类型”,“数据库的URL”,“打开数据库的用户名”和“密码”即可。如果需要多次访问,您可以把这些信息保存成XML文件打开,以后可以打开这个文件即能快速访问数据库.
4.打开数据库后,程序会依次列出 DB中的数据库,数据库下的各表 和 以及表中的各字段 以方便程序员在数据库中浏览.您还可以根据自己的喜好选择“树状视图”和“平面视图”两种方式进行浏览。
5.在树状视图和平面视图,您可以轻松获得某一张表的完整Select,Update,Insert,Delete等语句以及表对应的Pojo文件,Hibernate映射文件,建表语句等.
6.在右上方的SQL执行窗口中,您可执行各种SQL语句,在结果窗口中可以显示处理结果,如果是查询,会以表格的方式显示出来;如果是Update,Insert和Delete等语句会以文字的形式告诉你执行结果;如果执行的SQL语句有错误,则会提示用户SQL语句错误。
7.如果SQL语句比较复杂,软件提供了一个功能可对多层的SQL语句进行整形,这可以帮助程序员迅速理清其结构,另外还提供了一个反整形功能将多行SQL合并成一行。
8.您可以访问不同的数据库,只需打开多个窗口即可;您还可以进行不同的处理,只需打开多个选项页即可。

如何运行和使用SqlToolBox:
运行此软件需要安装JDK1.5或更高版本。
本软件为绿色软件,不需要进行安装,只要您下载软件后,解压到任何一个目录,点击run.bat既、即能将程序运行起来。
关于SqlToolBox的使用教程,请参看:SqlToolbox使用图解http://www.blogjava.net/heyang/archive/2009/02/01/252878.html

最近增加的功能:
1.Sql语法高亮(1.71  2009年1月28日15:24:46)。
2.增加一些图片,特地增加新年壁纸背景(1.72 2009年1月30日19:18:28)。
3.将背景修改为明代衣冠壁纸,增加了三个图标(1.73 2009年1月31日17:31:56)。
4.改善了Sql整形功能(嵌套SQL整形还未完成),全面引入了Spring的JdbcTemplate。(1.74 2009年2月3日14:01:06)
5.嵌套SQL整形完成。(1.75 2009年2月5日22:38:38)
6.增加了主键识别,改善了建表语句的生成效果。增加一个测试连接按钮。修改了一些按钮图标。(1.76  2009年2月7日16:03:10)

版本历程
2007年7月末  前身 SqlAnywhere1.00 诞生
2007年8月初  SqlAnywhere1.03问世并发布到华军软件园
2007年11月底到2008年一月初 更名为SqlToolBox并升级到1.60版本 发布到eNet下载频道(一月二十七日)
2009年1月 升级到当前最高版本 发布到华军软件园绿色软件频道多特下载站

作者寄语:
本软件历经了三次大的修改,十数次小修改,软件名也从SqlAnywhere1.3变到了现在的版本,规模也从1.98M变到了5M多,目的是使它真正能对程序员访问数据库有所帮助,限于本人水平和时间有限,如果此软件可能和您的需要有差别,或者没有提供您想要的功能,请您将意见和建议尽量告诉我(可通过博客留言或是发送Email),我会把您想要的功能融入到新版本中。如果您觉得此软件还不错,请告知您的朋友们,作者在此向您表示感谢。    

1.60版本下载地址
http://www.box.net/shared/3y80aucin6

1.8.0版下载地址:
http://www.box.net/shared/ggmlmyjrrg

与本软件功能类似的开源软件:
Java开源数据库管理工具 

posted @ 2009-01-23 07:26 何杨 阅读(1625) | 评论 (8)编辑 收藏

全文如下:

@echo off 
set CLASSPATH_BAK
=%CLASSPATH%
set classpath
=%CLASSPATH%;.\lib\dom4j-1.6.1.jar;.\lib\classes12.jar;.\lib\log4j-1.2.14.jar;.\lib\commons-dbcp-1.2.2.jar;.\lib\commons-pool-1.4.jar;.\lib\mysql-connector-java-5.0.6-bin.jar;.\lib\commons-logging-1.0.4.jar;.\lib\spring.jar;.\;.\SqlToolBox.jar
start javaw com.sitinspring.Main  
set classpath
=%CLASSPATH_BAK%  
posted @ 2009-01-22 17:46 何杨 阅读(821) | 评论 (0)编辑 收藏

凡是存在多人协作的系统必然具备权限子系统,它用于控制用户能否执行某个操作,以此来控制系统的功能,业务的流向和业务权利的分配。

权限系统具体来说分为等级控制类型和角色控制类型两种形式,再复杂的权限系统都是这两种形式的有限组合。前者可用于范围控制,适用于用户权力大小不同的场合;后者可用于单点控制,适用于用户权力多寡有异的场合。现实世界中,军队中官衔类似于等级权限控制,现代企业中各司其职的权力分配类似于角色控制。角色权限控制是把单项权限一项项的赋予用户,如同现实世界中把具体职位一个个的赋予某个员工一样。在他执行操作前,先看他是否拥有执行此操作的权限,如果有则执行,否则不执行。

下面的文章分别总结和讨论了这两种系统和具体的实现技术:

等级权限控制的相关文章:
1.简单值控制权限系统的设计
2.简单值控制权限系统的改进
3.使用AOP完善简单值权限系统
4.在简单值权限系统中使用Annotation替代了原来处于XML中的值设置

角色权限控制的相关文章:
1.用户角色权限控制的实现

欢迎大家和我讨论。
posted @ 2009-01-20 09:24 何杨 阅读(333) | 评论 (0)编辑 收藏

 在一个程序中,相对User这个领域对象的诸属性进行修改,用来容纳存储数据的ActionForm是这样写的:

public final class ModifyUserForm extends ActionForm {
    
private static final long serialVersionUID = -3447738664240089399L;

    
private User user;
    
    
public ModifyUserForm(){

    }


    
public void reset(ActionMapping mapping, HttpServletRequest request) {
    }


    
public ActionErrors validate(ActionMapping mapping,
                                 HttpServletRequest request) 
{

        ActionErrors errors 
= new ActionErrors();

        
return (errors);

    }


    
public User getUser() {
        
return user;
    }


    
public void setUser(User user) {
        
this.user = user;
    }

}

结果,进行页面数据验证的JS能准确无误的进行前段验证,但Action中没有收到请求,验证完毕提交表单后出现下面的异常,

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.heyang.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:35)

 

root cause

javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:469)
org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.heyang.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:35)

 

root cause

java.lang.IllegalArgumentException: No bean specified
org.apache.commons.beanutils.PropertyUtilsBean.getPropertyDescriptor(PropertyUtilsBean.java:751)
org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:937)
org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:467)
org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.heyang.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:35)

 

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.10 logs.


Apache Tomcat/6.0.10

发生这个错误的原因应该是使用工具类commons beanutil向ActionForm中的属性user输入数据时发生了错误,解决这个问题也很简单,在ActionForm内部将属性user实例化即可,代码如下:

public final class ModifyUserForm extends ActionForm {
    
private static final long serialVersionUID = -3447738664240089399L;

    
private User user=new User();
    
    
public ModifyUserForm(){

    }


    
public void reset(ActionMapping mapping, HttpServletRequest request) {
    }


    
public ActionErrors validate(ActionMapping mapping,
                                 HttpServletRequest request) 
{

        ActionErrors errors 
= new ActionErrors();

        
return (errors);

    }


    
public User getUser() {
        
return user;
    }


    
public void setUser(User user) {
        
this.user = user;
    }

}

posted @ 2009-01-15 16:06 何杨 阅读(725) | 评论 (0)编辑 收藏

公安人员抓捕了四个盗窃嫌疑犯,下面是他们的审讯记录:
A:是B偷的,不是D偷的
B:我没有偷,是C偷的
C说:A没有偷,是B偷的
D:我没有偷
现已经确切知道只有一人参与偷窃,且四人的话语要么全是真话,要么全在撒谎。
请根据这些条件编程判断谁是小偷?

package com.heyang;

public class WhoIsTheThief{
  
public static void main(String[] args){
    
int[] arr=new int[4]; 
    
    
for(arr[0]=0;arr[0]<=1;arr[0]++){
      
for(arr[1]=0;arr[1]<=1;arr[1]++){
        
for(arr[2]=0;arr[2]<=1;arr[2]++){
          
for(arr[3]=0;arr[3]<=1;arr[3]++){           
            
// 只有一个人是小偷
            if(hasOnlyOneThief(arr)==false){
              
continue;
            }

            
            
boolean wordByA=(arr[1]==1 && arr[3]==0);
            
boolean wordByB=(arr[1]==0 && arr[2]==1);
            
boolean wordByC=(arr[0]==0 && arr[1]==1);
            
boolean wordByD=(arr[3]==0);
            
            
boolean resultFinal=allTrueOrAllFalse(wordByA,wordByB,wordByC,wordByD);
            
            
if(resultFinal==false){
              printThief(arr);              
              
return;
            }

          }

        }

      }

    }

  }

  
  
private static boolean hasOnlyOneThief(int[] arr){
    
int thiefCount=0;
    
    
for(int i:arr){
      thiefCount
+=i;
    }

    
    
return thiefCount==1;
  }

  
  
private static boolean allTrueOrAllFalse(boolean wordByA,boolean wordByB,boolean wordByC,boolean wordByD){
    
if(wordByA==true && wordByB==true && wordByC==true && wordByD==true){
      
return true;
    }

    
else if(wordByA==false && wordByB==false && wordByC==false && wordByD==false){
      
return true;
    }

    
else{
      
return false;
    }

  }

  
  
private static void printThief(int[] arr){
    
char[] arrNames={'A','B','C','D'};  
    
    
for(int i=0;i<arr.length;i++){
      
if(arr[i]==i){
        System.out.println(arrNames[i]
+"是窃贼");
      }

      
else{
        System.out.println(arrNames[i]
+"不是窃贼");
      }

    }
 
  }

}
posted @ 2009-01-15 08:35 何杨 阅读(166) | 评论 (0)编辑 收藏

package com.heyang;

/**
 * 两个队进行比赛,各出三人。甲队为'张','李','王'三人,乙队为'A','B','C'三人。已抽签决定
   比赛名单。有人向队员打听比赛的名单。张说他不会对阵A,李说他不会对阵C,王说他不会对阵B,请编程序找出
   三队赛手的名单。
 * 
@author 何杨(heyang78@gmail.com)
 *
 * 
@since 2009-1-14 下午04:17:11
 * 
@version 1.00
 
*/

public class MatchSchedule{
    
public static void main(String[] args){
        
char[] team1={'','',''};
        
char[] team2={'A','B','C'};
        
        
int arraySize=team2.length;
        
for(int i=0;i<arraySize;i++){
            
// team2[i]是张的对手
            
            
if(team2[i]!='A'){        // 张说他不会对阵A    
                for(int j=0;j<arraySize;j++){
                    
// team2[j]是李的对手
                    
                    
if(team2[j]!='C'){  // 李说他不会对阵C    
                        for(int k=0;k<arraySize;k++){
                            
// team2[k]是王的对手
                            
                            
if(team2[k]!='B')// 王说他不会对阵B    
                                
                                
// 不会出现一名选手同时对战两人
                                if(team2[i]!=team2[j] && team2[j]!=team2[k] && team2[k]!=team2[i] ){
                                    System.out.println(
"\n比赛可能对阵表");
                                    System.out.println(team1[
0]+" vs "+team2[i]);
                                    System.out.println(team1[
1]+" vs "+team2[j]);
                                    System.out.println(team1[
2]+" vs "+team2[k]);
                                }

                            }

                        }

                    }

                }

            }

        }

    }

}
posted @ 2009-01-14 16:18 何杨 阅读(150) | 评论 (0)编辑 收藏

package com.heyang;

public class CompletedBitmapMethod{
    
public static void main(String[] args){
        
int[] arr={1,7,3,6,9,-1};        
        System.out.println(hasDuplicatedItem(arr));
    }
    
    
    
public static boolean hasDuplicatedItem(int[] arr){
        
// 找出数组中最大值
        int max=arr[0];
        
int min=max;
        
for(int i:arr){
            
if(max<i){
                max
=i;
            }

            
if(min>i){
                min
=i;
            }

        }

        
        
int[] newArr=new int[max-min+1];
        
for(int i:arr){
            
int index=i-min;
            
            
if(newArr[index]==0){
                
// 以前未在此位置存值
                newArr[index]=1;
            }

            
else{
                
// 以前已经在此位置存值
                return true;
            }

        }
    
        
        
return false;
    }

}
posted @ 2009-01-14 16:16 何杨 阅读(197) | 评论 (0)编辑 收藏

     摘要: 权限系统文章之五,业务和文章之一相同,使用Annotation替代了原来处于XML中的值设置。  阅读全文
posted @ 2009-01-06 15:59 何杨 阅读(470) | 评论 (0)编辑 收藏

仅列出标题
共28页: First 上一页 20 21 22 23 24 25 26 27 28 下一页