数据类型之间的转换

最后更新:2024-05-30 10:01:02 | 状态:未完成
在生成SQL的过程中,如果没有占位符,数字类型一般可以直接拼接,String类型需要加单引号,
而日期类型有些数据库可以实现隐式转换,加单引号即可,有些数据库不能实现,需要内置函数转换成日期类型
还有些更复杂的类型类byte,json,array,geometry等类型更需要内置函数

如果有占位符的也需要把占位值转换成相应的数据类型

1.完整的转换可以调用DriverAdapter的write方法实现

/**
* 通过占位符写入数据库前转换成数据库可接受的Java数据类型<br/>
* @param runtime 运行环境主要包含驱动适配器 数据源或客户端
* @param metadata Column 用来定位数据类型
* @param placeholder 是否占位符
* @param value value
* @return Object
*/
Object write(DataRuntime runtime, Column metadata, Object value, boolean placeholder);
如日期类型 
有占位符时会根据不同的数据库返回相应的Date类型
没有占位符时会根据不同的数据库调用相应的日期转换函数 to_date('2020-01-01', 'yyyy-mm-dd') 或to_timestamp()

Point类型
有占位符时会根据不同的数据库返回相应的Point类型也有可能是byte[]类型
没有占位符时会根据不同的数据库调用相应的几何图形Poin(1, 2)

以上方法中的adapter和runtime,因为与数据库类型以及数据库连接相关,一般在是系统启动后才能获取到准确的adapter和runtime

2.如果可以确定数据类型的可以直接调用相应的Writer
如org.anyline.data.jdbc.oracle.OracleWriter.DateWriter.write(Object value, boolean placeholder);

3.如果要求不是很严格,比如只生成SQL,不需要实际执行
ColumnType.write(Object value, Object def, boolean placeholder);

4.如果只是数据类型转换
如果遇到org.anyline.adapter.init.ConvertAdapter  [convert定位失败][origin:原始类型][target:目标类型]
是因为出现了非Java基础类型之间的转换,如项目中自定义的类型
可以通过ConvertAdapter.reg(org.anyline.metadata.type.Convert convert);
Convert中实现把原始类型转换成目标类型
如果查询返回的是实体类,则必须要实现,否则无法给对象赋值
如果返回的DataRow/DataSet/Map类型也可以不实现,会直接返回原始类型

5.在创建表的过程中需要获取相应数据库中的数据类型,
如int类型在有些数据库中用int4,int8,integer
可以调用相应DriverAdapter.type(String type);返回当前数据库需要的类型
首页 最近更新 搜索 提交 回复