专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 JDBC类型和值的转换

JDBC类型和值的转换

更新时间:2022-01-06 10:02:59 来源:赢咖4 浏览787次

类型和值转换 - FieldConversion 接口

介绍

O/R 工具的一个典型问题是数据类型不匹配:域模型中的类具有布尔类型的属性,但相应的数据库表将此属性存储在BIT或 int类型的列中。

这个例子解释了 OJB 如何允许你定义 FieldConversions来正确转换类型和值。

此示例的源代码包含在 OJB 源代码分发中并驻留在测试包 org.apache.ojb.broker 中。

问题

测试类 org.apache.ojb.broker.Article包含一个布尔类型的属性 isSelloutArticle:

public class Article implements InterfaceArticle
{
    protected int articleId;
    protected String articleName;
    // maps to db-column Auslaufartikel of type int
    protected boolean isSelloutArticle;
    ...
}

对应表使用 int 列 ( Auslaufartikel ) 来存储此属性: 

CREATE TABLE Artikel (
    Artikel_Nr         INT PRIMARY KEY,
    Artikelname        CHAR(60),
    Lieferanten_Nr     INT,
    Kategorie_Nr       INT,
    Liefereinheit      CHAR(30),
    Einzelpreis        DECIMAL,
    Lagerbestand       INT,
    BestellteEinheiten INT,
    MindestBestand     INT,
    Auslaufartikel     INT
  )

解决方案

OJB 允许使用预定义(或自写)的 FieldConversions 进行适当的映射。该 FieldConversion接口声明了两个方法: javaToSql(...)和 sqlToJava(...) :

/** 
 * FieldConversion 声明了一个协议,用于类型和值
 * 持久类属性和
 RDBMS的列之间的转换。
 * 默认实现不修改其输入。
 * OJB 用户可以使用预定义的实现,也可以
 * 构建他们自己的执行任意映射的转换。
 * 映射必须在 xml 存储库中定义
 * 在字段描述符中。
 * 
 * @author Thomas Mahler 
 */ 
public interface FieldConversion extends Serializable 
{ 
    /** 
     * 将 Java 对象转换为其 SQL 
     * 挂件,用于插入和更新
     */
    公共抽象对象 javaToSql(Object source) 抛出 ConversionException;
    /** 
     * 将 SQL 值转换为 Java 对象,用于 SELECT 
     */ 
    public abstract Object sqlToJava(Object source) throws ConversionException; 
}

方法 FieldConversion.sqlToJava()是一个回调,当从 JDBC 结果集中读入对象属性时,它会在 OJB 代理中调用。如果 OJB 检测到为持久类属性声明了 FieldConversion,则它使用 FieldConversion 来执行此属性的编组。

对于上面提到的将 int 列映射到 boolean 属性的问题,我们可以使用预定义的 FieldConversion Boolean2IntFieldConversion。看看代码,看看它是如何工作的:

public class Boolean2IntFieldConversion 实现 FieldConversion 
{ 
    private static Integer I_TRUE = new Integer(1); 
    私有静态整数 I_FALSE = 新整数(0);
    私有静态布尔 B_TRUE = 新布尔(真);
    私有静态布尔 B_FALSE = 新布尔(假);
    /** 
     * @see FieldConversion#javaToSql(Object) 
     */ 
    public Object javaToSql(Object source) 
    { 
        if (source instanceof Boolean) 
        { 
            if (source.equals(B_TRUE)) 
            { 
                return I_TRUE; 
            }
            其他
            {
                返回 I_FALSE;
            } 
        } 
        else 
        {
            返回源;
        } 
    } 
    /** 
     * @see FieldConversion#sqlToJava(Object) 
     */ 
    public Object sqlToJava(Object source) 
    { 
        if (source instanceof Integer) 
        { 
            if (source.equals(I_TRUE)) 
            { 
                return B_TRUE; 
            } 
            else 
            {
                返回 B_FALSE; 
            } 
        }
        其他
        {
            返回源;
        } 
    } 
}

org.apache.ojb.broker.accesslayer.conversions 包中定义了其他有用的标准转换 :当然,可以使用转换在java.sql.date和 java.util.date之间进行映射 。一个非常有趣的转换是 Object2ByteArrFieldConversion 它允许在 varchar 列中存储内联对象!

回到我们的例子,只剩下一件事要做:我们必须告诉 OJB为文章类使用正确的 FieldConversion。这是在 XML 存储库文件中完成的。该字段描述符 允许定义转换属性声明完全限定 FieldConversion类:

<!-- test.ojb.broker.Article 的定义 --> 
   <class-descriptor 
         class="org.apache.ojb.broker.Article" 
         proxy="dynamic" 
         table="Artikel" 
   >       ... 
      <field-描述符
         名称="isSelloutArticle" 
         column="Auslaufartikel" 
         jdbc-type="INTEGER" 
         conversion="org.apache.ojb.broker.accesslayer.conversions.Boolean2IntFieldConversion" 
      /> 
      ... 
   </class-descriptor>

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>