[转载]Grails生成DECIMAL(NUMERIC)类型字段

本文详细介绍了如何使用Grails生成DECIMAL类型字段,并控制其精度,包括参数设置、与MySQL数据库类型转换的关系、以及通过Hibernate映射生成属性时遇到的问题和解决方案。同时分享了在数据库中创建表、使用不同的dbCreate选项以及常见的类型映射关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文出自:http://www.blogjava.net/BlueSUN/archive/2007/04/23/112846.html

 

想用Grails这个东西生成指定为DECIMAL类型(NUMERIC类型)的字段,并控制精度, 搞了一下午未果, 于是请教山风小子, 最终两个人试验N次, 失败N-1次的前提下, 最后一次终于成功了, 在这里尤其感谢山风的技术支持以及精神支持;

成功案例记录在这里:
groovy(domain-class):
class Oldtable { 
static withTable = "oldtable"
    Integer id
    BigDecimal  number //要为BigDecimal类型
    static constraints = {
             // 山风小子注:正确的约束应该为number(max:new BigDecimal("9999.999999"), scale:6)
             number(max:1000, scale:6)    //这个限制搞了很久才搞出来, 映射为DECIMAL(10,6)
            }
}
DataSource:
class DevelopmentDataSource {
   boolean pooling = true
    String dbCreate = "update" // one of 'create', 'create-drop','update'
    String url = "jdbc:mysql://localhost:3306/grails"
    String driverClassName = "com.mysql.jdbc.Driver"
    String username = "ymiao"
    String password = "letmein"
}

PS:
1. 最大的感触是: 一定要练好英语
2. mysql里面NUMERIC类型会自动转换为DECIMAL类型, 比如用GUI工具建表指定为NUMERIC(10,6), 会自动转换为DECIMAL(10,6),表示最高有效数字10位, 小数点后保留6位; 这里的precision="10" scale="6", 注意数据库里的precision是有效数字, scale表示精确到小数点后的位数
// 山风小子注:number(max:new BigDecimal("9999.999999"), scale:6),4(小数点左侧位数) + 6(scale) = 10(precision) => DECIMAL(10, 6)
3. number(max:1000, scale:6) 这个精度限制这么写的原因一直搞不懂, 跟山风试验了好多次才成功的, 最后理解为1000是4位, 4+6=10, precision="10", 同理max:10000, scale:6会生成DECIMAL(11,6)类型的字段, 暂且这么理解吧...
4. String dbCreate = "update", 这里用update, 如果数据库中有对应的表, 则用旧表, 不会覆盖旧表以及里面的数据
5. mysql数据库中
DECIMAL(10,6)类型的数据, 通过hibernate逆向映射生成的属性是:
        <property name="number" type="java.lang.Double">
            <column name="number" precision="10" scale="6" not-null="true" />
        </property>
但是在groovy里面定义为Double类型出现N多异常, 最终定义为BigDecimal类型的成功;
6. 贴出常见类型的映射关系
Hibernate映射类型 Java类型 标准SQL类型
integer/int java.lang.Integer/int INTEGER 4字节 
long java.lang.Long/long BIGINT 8字节 
short java.lang.Short/short SMALLINT 2字节 
byte java.lang.Byte/byte TINYINT 1字节 
float java.lang.Float/float FLOAT 4字节 
double java.lang.Double/double DOUBLE 8字节 
big_decimal java.math.BigDecimal NUMERIC 
character java.lang.Character/java.lang.String/char CHAR(1) 定长字符 
string java.lang.String VARCHAR 变长字符 
boolean/ yes_no/true_false java.lang.Boolean/Boolean BIT 布尔类型 
date java.util.Date/java.sql.Date DATE 日期 
timestamp java.util.Date/java.util.Timestamp TIMESTAMP 日期 
calendar java.util.Calendar TIMESTAMP 日期 
calendar_date java.util.Calendar DATE 日期 
binary byte[] BLOB
BLOB 
text java.lang.String TEXT CLOB 
serializable 实现java.io.Serializablej接口的任意Java类 BLOB BLOB 
clob java.sql.Clob CLOB CLOB 
blob java.sql.Blob BLOB BLOB 
class java.lang.Class VARCHAR 定长字符 
locale java.util.Locale VARCHAR 定长字符 
timezone java.util.TimeZone VARCHAR 定长字符 
currency java.util.Currency VARCHAR 定长字符
7. 用于测试的mysql的schema+table
DROP TABLE IF EXISTS `grails`.`oldtable`;
CREATE TABLE  `grails`.`oldtable` (
  `id` int(11) NOT NULL,
  `number` decimal(10,6) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
8. Hibernate相关
http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/toolsetguide.html
http://www.itpub.net/699923.html

// 山风小子注:成功其实就在你眼前,关键要看自己的恒心和毅力

原文地址:http://miaoyachun.blog.sohu.com/43152463.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值