2008年02月10日

如果要用mysql的事务处理,mysql的表类型必须是:INNODB 和 BDB 两种类型的表;

比如有一个表表名为:demoTableName

用show create table demoTableName,可以查看demoTableName表的表类型;

结果为:

CREATE TABLE `demoTableName` (
`id` int(11) default NULL,
`name` varchar(50) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

可以看到表的类型是:MyISAM ,这个表是不支持事务的;要修改这个表的类型,可以直接修改

执行:ALTER TABLE demoTableName TYPE=INNODB;  就行了;

2008年01月14日

在tomcat的conf/server.xml中的<GlobalNamingResources>元素中添加如下内容:

<GlobalNamingResources>

<Resource
    name="jdbc/sqlservertest"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="45"
    username="sa"
    maxWait="180"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    password="123456"
    url="jdbc:jtds:sqlserver://localhost:1433/test"
    removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>

<Resource
    name="jdbc/mysqltest"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="45"
    username="root"
    maxWait="180"
    driverClassName="com.mysql.jdbc.Driver"
    password="123456"
    url="jdbc:mysql://localhost:3306/test"
    removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>

</GlobalNamingResources>

以上配置了两个全局数据源,一个叫jdbc/sqlservertest,是SQLServer2000的,一个叫:jdbc/mysqltest,是mysql的

然后在web程序中写一个jsp:内容如下
<%@page import="java.util.*,javax.naming.*,java.sql.*,javax.sql.*" %>
<%@page contentType="text/html;charset=BIG5"%>
<%
    Context ctx = new InitialContext();
    String strLookup = "java:comp/env/jdbc/mysqltest2";
    DataSource ds =(DataSource) ctx.lookup(strLookup);
    Connection con = ds.getConnection();
    if (con != null){
        out.print("success");
    }else{
        out.print("failure");
    }
%>

然后将做个web工程发布到tomcat下;我用了两种方式发布:一种是war包的方式,一种是在server.xml中添加一个Context;
下面分别说说两种发布方式的区别:

war包方式:
如果要用war包方式发布web应用程序,又要使用JNDI数据源的话,要在你的web工程的META-INF文件夹下设置web项目的Context内容:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/test">
    <ResourceLink global="jdbc/mysqltest" name="jdbc/mysqltest2" type="javax.sql.DataSource"/>
</Context>

global:就是tomcat的server.xml中配置的全局数据源名称。
name:就是你的web项目中要用的那个那个数据源的名称:也就是jsp中写的那个mysqltest2名称;

在server.xml中添加context的方式:
直接在server.xml中的<host></host>中添加如下内容:
<Context path="/test" docBase="c:/test" debug="0" reloadable="true">
       <ResourceLink global="jdbc/mysqltest" name="jdbc/huodong2" type="javax.sql.DataSource"/>
</Context>

 

2007年10月12日

    我以前遇到tomcat+mysql5中文乱码时都是去网上找解决办法,解决了后就不去深究原因,现在我总结一下:

  1:关于

        Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"

与    Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"

写法的要注意的地方,&amp; 是 & 的转义符号,两种写法都是正确的,只是下面的写法用在xml配置文件中,而上面的用在java代码中。

2.查看客户端发送给服务器的SQL使用什么编码

如果你的jsp或者java代码发送给mysql的中文是乱码,你可以运行一下下面的代码,看看客户端发送给服务器的SQL使用什么编码;

private static String ClassName = "org.gjt.mm.mysql.Driver";
private static String Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
private static String UserName = "root";
private static String PassWord = "";

Connection con = null;
 try {
     Class.forName(ClassName).newInstance();
     con = DriverManager.getConnection(Url, UserName, PassWord);
 } catch (Exception e) {
     e.printStackTrace();
 }
 
ResultSet rs = con.createStatement().executeQuery("SHOW VARIABLES LIKE ‘character_set_%’");
   while(rs.next()){
      System.out.println(rs.getString(1) +","+ rs.getString(2));
   }
rs.close();
con.close();

没有配置characterEncoding=utf-8之前,我使用的是 Url = "jdbc:mysql://localhost:3306/test;
这样的配置。结果用select()方法查询结果如下:

character_set_client,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-Linux-i686/share/mysql/charsets/

注意第一行就可以了,可见使用的是latin1。
而latin1本身就无法表示汉字,经过这个编码打包的SQL语句发给Server,Server也用Latin1解析也无法还原。
所以,我总是写乱码到DB。
而配置了配置characterEncoding=utf-8之后,
执行select(),结果:

character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
第一行为utf-8,SQL将用UTF8打包给Server,Server也用Client配置的UTF8
解析。

部分类容来自 - http://www.master8.czm.cn/data/2007/0308/article_5458.htm

2007年09月18日

今天写了一个提交信息的jsp页面,页面的结构是这样的:

    index.jsp:主页面,其中有一个iframe,id=suggest,还有一个图片的的按钮;

   suggest.jsp提交意见的页面;其中有一个form表单,id为from1;

   我现在index中的图片按钮中提交suggest页面中的form1表单。开始我是这么写的:

   document.getElementById("suggest").document.forms[0].submit();

  或者document.getElementById("suggest").document.forms['form1'].submit();

 总是不能成功,后来改成了如下形式:

 window.frames[suggest].document.form1.submit();  就可以了。

2007年07月27日

  <GlobalNamingResources>

    <!– Test entry for demonstration purposes –>
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    <!– Editable user database that can also be used by
         UserDatabaseRealm to authenticate users –>
   
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"
           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />
     
      <Resource
    name="jdbc/huodong"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="5"
    maxIdle="3"
    username="root"
    maxWait="180"
    driverClassName="org.gjt.mm.mysql.Driver"
    password=""
    url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&amp;characterEncoding=GBK"
    removeAbandoned="true" removeAbandonedTimeout="5" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>
  
  </GlobalNamingResources>

注意:url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&amp;characterEncoding=GBK"

不要写成:url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&characterEncoding=GBK"

注意:&amp;  & 的转义字符;在xml中写成上面那个,在java代码中写成下面的写法;

否则报:

Parse Fatal Error at line 213 column 91: The reference to entity "characterEncoding" must end with the ‘;’ delimiter.
org.xml.sax.SAXParseException: The reference to entity "characterEncoding" must
end with the ‘;’ delimiter.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Un
known Source)

还要在tomcat的 conf/server.xml 中修改如下类容:

<Connector port="80" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>

红色部分是添加的类容

2007年05月07日

如果我们编译运行下面这个程序会看到什么?
public class Test{
    public static void main(String args[]){
        System.out.println(0.05+0.01);
        System.out.println(1.0-0.42);
        System.out.println(4.015*100);
        System.out.println(123.3/100);
    }
};
你没有看错!结果确实是
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。
这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。
在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。
 
四舍五入
我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数,我们只能象这样(保留两位):
public double round(double value){
    return Math.round(value*100)/100.0;
}
非常不幸,上面的代码并不能正常工作,给这个方法传入4.015它将返回4.01而不是4.02,如我们在上面看到的
4.015*100=401.49999999999994
因此如果我们要做到精确的四舍五入,不能利用简单类型做任何运算
java.text.DecimalFormat也不能解决这个问题:
System.out.println(new java.text.DecimalFormat("0.00").format(4.025));
输出是4.02
 
BigDecimal
在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么还有两个,它们是:
BigDecimal(double val) 
          Translates a double into a BigDecimal. 
BigDecimal(String val) 
          Translates the String repre sentation of a BigDecimal into a BigDecimal.
上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?等到出了问题的时候,才发现上面哪个够造方法的详细说明中有这么一段:
Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding. 
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.
原来我们如果需要精确计算,非要用String来够造BigDecimal不可!在《Effective Java》一书中的例子是用String来够造BigDecimal的,但是书上却没有强调这一点,这也许是一个小小的失误吧。
 
解决方案
现在我们已经可以解决这个问题了,原则是使用BigDecimal并且一定要用String来够造。
但是想像一下吧,如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。你能够忍受这么烦琐的过程吗?下面我们提供一个工具类Arith来简化操作。它提供以下静态方法,包括加减乘除和四舍五入:
public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)
附录
源文件Arith.java:
import java.math.BigDecimal;
/**
 * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
 * 确的浮点数运算,包括加减乘除和四舍五入。
 */
public class Arith{
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    //这个类不能实例化
    private Arith(){
    }
 
    /**
     * 提供精确的加法运算。
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }
    /**
     * 提供精确的减法运算。
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    } 
    /**
     * 提供精确的乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }
 
    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * 小数点以后10位,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }
 
    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
 
    /**
     * 提供精确的小数位四舍五入处理。
     * @param v 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
};

 

转载至:http://chongtianpig.netbei.com/51976.shtml

2006年11月16日

import org.apache.commons.lang.StringUtils;

/**
 * Created by IntelliJ IDEA.
 * User: lly
 * Date: 2006-11-16
 * Time: 11:01:36
 * <p/>
 *  一个带输入框的窗体,用户在此输入框内输入许可证密钥。您希望允许输入1110-JAVA格式的密钥。您必须进行以下操作:
 * <p/>
 * 1.检查是否为空字符串。
 * 2.忽略空格。
 * 3.密钥区分大小写。
 * 4.用“-”标记分隔密钥字符串,然后检查第一部分是否全部是数字,第二部分包含的字符是否只来自有效字符集“J”、“A”、“V”、“A”。
 * 5.两个部分均应有四个字符。
 * 6.第一部分的第四个数字应该是“0”。
 */
public class StringUtilsTest {
    /**
     * Check if the key is valid
     *
     * @param key license key value
     * @return true if key is valid, false otherwise.
     */
    public static boolean checkLicenseKey(String key) {
        //checks if empty or null
        if (StringUtils.isBlank(key)) {
            return false;
        }

        //delete all white space
        key = StringUtils.deleteWhitespace(key);

        //Split String using the – separator
        String[] keySplit = StringUtils.split(key, "-");

        //check lengths of whole and parts
        if (keySplit.length != 2 || keySplit[0].length() != 4 || keySplit[1].length() != 4) {
            return false;
        }

        //Check if first part is numeric
        if (!StringUtils.isNumeric(keySplit[0])) {
            return false;
        }

        //Check if second part contains only
        //the four characters ‘J’, ‘A’, ‘V’ and ‘A’
        if (! StringUtils.containsOnly(keySplit[1],new char[]{‘J’, ‘A’, ‘V’, ‘A’})) {
            return false;
        }

        //Check if the fourth character
        //in the first part is a ‘0′
        if (StringUtils.indexOf(keySplit[0], ‘0′) != 3) {
            return false;
        }

        //If all conditions are fulfilled, key is valid.
        return true;
    }

    public static void main(String[] args) {
        String pass = "1110-JAVA";
        System.out.println("this.clone().equals()checkLicenseKey(pass) = " + StringUtilsTest.checkLicenseKey(pass));
    }
}

引用于:http://dev2dev.bea.com.cn/techdoc/2005071902.html

2006年11月06日

  在xml中想放入一个html代码,其中出现了点问题,html中有 "<" , ">" 符号,放在xml会出错的,要用xml转意符号:

&lt; < less than
&gt; > greater than
&amp; & ampersand 
&apos; apostrophe
&quot; " quotation mark

比如xml如下

<html><input type="text" name="name" size="10"/></html>要写成

<html>&lt;input type="text" name="name" size="10"/&gt;</html>

注意:那个“;”不能掉了;

2006年10月25日

测试数据名:test,其中有一个表loginuser;
mysqldump.exe 在mysql\bin下。
在提示符状态下输入一下命令:

以root用户的权限导出整个数据库:mysqldump test >/back.txt -u root -p  加上“/”,那么导出的

back.txt就在根目录中,比如:c:\下;

以root用户的权限导出数据库中的一张表:mysqldump test loginuser >/back.txt -u root -p

以上命令不用-u root -p部分也行,以上命令会导出CREATE,INSERT命令;如果只想要CREATE命令,用如

下命令:
mysqldump -d test -d loginuser >/back.txt

如果只想导出insert命名,用如下命令:
mysqldump -t test -t loginuser >/back.txt

以文本形式导出一个表的内容
在mysql>输入:select * from loginuser into outfile "\back.txt"; 生成的back.txt文件在mysql安装

的根目录下;

 

我们有一个库为
phptest,其中有一个表为driver。现在要把driver卸成文件。执行命令:
mysql> use phptest;
Database Changed
mysql> select * from driver into outfile ’a.txt’;
Query OK, 22 rows affected (0.05 sec)
  上面就可以完成将表driver从数据库中卸到a.txt文件中。注意文件名要加单
引号。
那么这个文件在哪
呢?在mysql目录下有一个data目录,它即是数据库文件所放的地方。每个库在单
独占一
个子目录,所以
phptest的目录为c:\mysql\data\phptest(注意:我的mysql安装在c:\mysql下)。
好,现
在我们进去,a.txt
就是它。打开这个文件,可能是:
1 Mika Hakinnen 1
2 David Coulthard 1
3 Michael Schumacher 2
4 Rubens Barrichello 2

  可能还有很多记录。每个字段之间是用制表符分开的(\t)。那么我们可以修
改输出
文件名的目录,以便
放在指定的位置。如’a.txt’可以改成’./a.txt’或’/a.txt’。其中’./a.txt’放在
c:\my
sql\data目录下了,
而’/a.txt’文件则放在c:\目录下了。所以select命令认为的当前目录是数据库的
存放目
录,这里是
c:\mysql\data。
  使用select命令还可以指定卸出文件时,字段之间的分隔字符,转义字符,
包括字
符,及记录行分隔字
符。列在下面:
FIELDS
TERMINATED BY ’\t’
[OPTIONALLY] ENCLOSED BY ”
ESCAPED BY ’\\’
LINES
TERMINATED BY ’\n’
TERMINATED 表示字段分隔
[OPTIONALLY] ENCLOSED 表示字段用什么字符包括起来,如果使用了OPTIONALLY
则只有
CHAR和VERCHAR
被包括
ESCAPED 表示当需要转义时用什么作为转义字符
LINES TERMINATED 表示每行记录之间用什么分隔
  上面列的是缺省值,而且这些项都是可选的,不选则使用缺省值。可以根据
需要进
行修改。给出一个例
子如下:
mysql> select * from driver into outfile ’a.txt’ fields terminated by 
‘,’ en
closed by ’"’;
Query OK, 22 rows affected (0.06 sec)
  结果可能如下:
"1","Mika","Hakinnen","1"
"2","David","Coulthard","1"
"3","Michael","Schumacher","2"
"4","Rubens","Barrichello","2"

  可以看到每个字段都用’,'进行了分隔,且每个字段都用’"’包括了起来。注
意,行
记录分隔符可以是
一个字符串,请大家自行测试。不过,如果输出文件在指定目录下如果存在的话
就会报
错,先删除再测
试即可。

2006年10月24日

环境:Windows xp sp2,mysql4,客户端和数据库,web都在这个环境中。

将连接mysql的url设置为:jdbc.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=GBK