日期:2014-05-16 浏览次数:20502 次
想用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