如何通过jdbc实现Distinct类型数据的插入与查询

distinct 类型可映射至底层的基础类型或映射至用户定义的 Java™ 对象。例如,distinct 类型 INT 可映射至 int 或映射至封装该数据表示的 Java 对象。此 Java 对象必须实现 java.sql.SQLData 接口。必须提供如 映射数据类型 中所描述的定制类型映射,来将此 Java 对象映射至对应的 SQL 类型名称。

1、插入数据示例
下列示例展示一个定义 distinct 类型的 SQL 语句:
CREATE DISTINCT TYPE mymoney AS NUMERIC(10, 2);
CREATE TABLE distinct_tab (mymoney_col mymoney);
下列为映射至基础类型的示例:
String s = “insert into distinct_tab (mymoney_col) values (?)”;
pstmt = conn.prepareStatement(s);

BigDecimal bigDecObj = new BigDecimal(123.45);
pstmt.setBigDecimal(1, bigDecObj);
System.out.println(“setBigDecimal…ok”);
pstmt.executeUpdate();
当映射至底层的类型时,GBase 8s JDBC Driver 在客户机侧执行映射,因为数据库服务器提供在底层的类型与 distinct 类型之间隐式的强制转型。
还可将 distinct 类型映射至实现 SQLData 接口的 Java™ 对象。
下列示例展示一个定义 distinct 类型的 SQL 语句:
CREATE DISTINCT TYPE mymoney AS NUMERIC(10,2)
下列代码将 distinct 类型映射至名为 MyMoney 的 Java 对象:
import java.sql.;
import com.gbasedbt.jdbc.
;
public class myMoney implements SQLData
{
private String sql_type = “mymoney”;
public java.math.BigDecimal value;
public myMoney() { }
public myMoney(java.math.BigDecimal value){
this.value = value;
}
public String getSQLTypeName(){
return sql_type;
}
public void readSQL(SQLInput stream, String type) throws SQLException
{
sql_type = type;
value = stream.readBigDecimal();
}
public void writeSQL(SQLOutput stream) throws SQLException
{
stream.writeBigDecimal(value);
}
// overides Object.equals()
public boolean equals(Object b)
{
return value.equals(((myMoney)b).value);
}
public String toString()
{
return “value=” + value;
}
}

pstmt = conn.prepareStatement(“insert into distinct_tab (mymoney_col) values (?)”);
myMoney mymoney = new myMoney();
mymoney.value = new java.math.BigDecimal(123.45);
pstmt.setObject(1, mymoney);
System.out.println(“setObject(myMoney)…ok”);
pstmt.executeUpdate();
在此情况下,请使用 setObject() 方法,而不是 setBigDecimal() 方法,来插入数据。

2、检索数据示例
可访存 distinct 类型作为它的底层基础类型,或作为 Java™ 对象,如果以定义类型映射来定义该映射的话。使用前面的示例,可访存该数据作为 Java 对象,如下列示例所示:
java.util.Map customtypemap = conn.getTypeMap();
System.out.println(“getTypeMap…ok”);
if (customtypemap == null)
{
System.out.println("\n***ERROR: typemap is null!");
return;
}
customtypemap.put(“mymoney”, Class.forName(“myMoney”));

String s = “select mymoney_col from distinct_tab order by 1”;
try
{
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(s);
System.out.println(“Fetching data …”);
int curRow = 0;
while (rs.next())
{
curRow++;
myMoney mymoneyret = (myMoney)rs.getObject(“mymoney_col”);
}
System.out.println(“total rows expected: " + curRow);
stmt.close();
}catch (SQLException e)
{
System.out.println(”***ERROR: " + e.getErrorCode() + " " +
e.getMessage());
e.printStackTrace();
}
在此情况下,请使用 getObject() 方法来检索数据,而不使用 getBigDecimal() 方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值