JDBC学习(五) --- 数据类型及其转换

JDBC 数据类型

 JDBC 驱动程序将 Java 数据类型转换为适当的 JDBC 类型,然后将其发送到数据库。它为大多数数据类型提供并保持了默认映射。例如 Java 的int 类型会被转换为 SQL 的INTEGER 类型。创建默认映射以提供到驱动程序时保持一致性。

 下表归纳了当调用PreparedStatement、CallableStatement 和 ResultSet.updateXXX()方法的 setXXX()方法时,将 Java 数据类型转换为默认的 JDBC 数据类型。

SQLJDBC/JavasetXXXupdateXXX
VARCHARjava.lang.StringsetStringupdateString
CHARjava.lang.StringsetStringupdateString
LONGVARCHARjava.lang.StringsetStringupdateString
BITbooleansetBooleanupdateBoolean
NUMERICjava.math.BigDecimalsetBigDecimalupdateBigDecimal
TINYINTbytesetByteupdateByte
SMALLINTshortsetShortupdateShort
INTEGERintsetIntupdateInt
BIGINTlongsetLongupdateLong
REALfloatsetFloatupdateFloat
FLOATfloatsetFloatupdateFloat
DOUBLEdoublesetDoubleupdateDouble
VARBINARYbyte[ ]setBytesupdateBytes
BINARYbyte[ ]setBytesupdateBytes
DATEjava.sql.DatesetDateupdateDate
TIMEjava.sql.TimesetTimeupdateTime
TIMESTAMPjava.sql.TimestampsetTimestampupdateTimestamp
CLOBjava.sql.ClobsetClobupdateClob
BLOBjava.sql.BlobsetBlobupdateBlob
ARRAYjava.sql.ArraysetARRAYupdateARRAY
REFjava.sql.RefSetRefupdateRef
STRUCTjava.sql.StructSetStructupdateStruct

 通常情况下,我们能用 setXXX()方法将绝大多数的 Java 数据类型映射到 JDBC 的数据类型

日期与时间的数据类型

 在实际开发中,日期和时间与我们的业务是紧密联系的,很多情况下我们都需要记录时间。而在 JDBC 中,java.sql.Date 类映射 SQL DATE 类型,java.sql.Time 类和 java.sql.Timestamp 类也分别映射 SQL TIME 数据类型和 SQL TIMESTAMP 数据类型。

Java 中的 Date 类型

    @Test
    public void JavaDateTest(){
        java.util.Date date = new java.util.Date();
        String s = date.toString();
        System.out.println(s);
        // 时间戳
        long time = date.getTime();
        System.out.println(time);
    }

输出

Wed Apr 26 08:31:33 CST 2023
1682469093337

SQL 中的 Date 类型

    /**
    这里是从数据库jdbcdata中的employees表中获取SQL中的Date数据类型
     */
    @Test
    public void DateTest(){

        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 这是我自己实现的一个关于JDBC的工具类
            conn = JDBCUtils.getJDBCConnection();
            // SQL的Date,employees的hire_date属性是Date类型
            String sql = "select hire_date from employees";
            preparedStatement = conn.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                // 获取SQL的Date类型
                Date hire_date = resultSet.getDate("hire_date");
                System.out.println(hire_date.toString());
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                JDBCUtils.closeResource(conn,preparedStatement,resultSet);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 通过java自带的Date类获取的时间戳进行转换
    */
    @Test
    public void DateTest2(){
        java.util.Date date = new java.util.Date();
        // 获取时间戳
        long dateTime = date.getTime();
        Date sqlDate = new Date(dateTime);
        System.out.println(sqlDate.toString());
    }

输出

1987-06-17
1989-09-21
1993-01-13
1990-01-03
1991-05-21
1997-06-25
1998-02-05
……
2023-04-26

SQL 中的 Time 类型

@Test
public void TimeTest(){
    // SQL的time需要通过Java的Date进行转换,因此需要先得到Java的Date,才能通过JDBC将该Date转为SQL的对应的数据类型
    java.util.Date date = new java.util.Date();
    // 转换的本质是通过时间戳进行实现的
    long time = date.getTime();
    Time sqlTime = new Time(time);
    System.out.println(sqlTime.toString());
}

输出

08:42:45

SQL 中的 TimeStamp 类型

    @Test
    public void timeStampTest(){
        java.util.Date date = new java.util.Date();
        long dateTime = date.getTime();
        Timestamp timestamp = new Timestamp(dateTime);
        System.out.println(timestamp.toString());
    }

输出

2023-04-26 08:44:35.961

 通过上述几个示例,我们可以总结出如何通过 Java 自带的 Date 类映射到 SQL(JDBC)的任何时间和日期类型:

  • 获取 Java 自带的 Date 类的实例对象
  • 通过该对象获取时间戳
  • 通过时间戳和 JDBC,转换到 SQL 的 Date 类型、Time 类型和 TimeStamp 类型

null 值处理

 在实际开发过程中,我们的数据库很多情况下会出现 null 值,在一些特定的场合下,null 值会对我们的数据处理造成一定影响,因此对于数据库中的 null 值处理就显得尤为重要了。

 SQL 使用 NULL 值和 Java 使用 null 是不同的概念,实际上我们有三种策略来处理 Java 中的 SQL NULL 值:

  • 避免使用返回原始数据类型的 getXXX()方法。
  • 使用包装类的基本数据类型,并使用 ResultSet 对象的 wasNull()方法来测试收到 getXXX()方法返回的值是否为 null,如果是 null,该包装类变量则被设置为 null。
  • 使用原始数据类型和 ResultSet 对象的 wasNull()方法来测试通过 getXXX()方法返回的值,如果是 null,则原始变量应设置为可接受的值来代表 NULL。

 下面给出一个示例

    @Test
    public void nullTest() throws Exception{
        /**
         * employees表中中的commission_pct属性含有很多的null值,我们以这个为例
         */
        Connection conn = JDBCUtils.getJDBCConnection();
        String sql = "SELECT commission_pct FROM employees";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            double commission_pct = resultSet.getDouble("commission_pct");
            if(resultSet.wasNull()){
                // null值处理逻辑
                System.out.println("null值被处理了");
            }else{
                // 正常处理
                System.out.println(commission_pct);
            }
        }
        JDBCUtils.closeResource(conn,preparedStatement,resultSet);
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PG Thinker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值