Postgresql在jdbc处理bit字段的解决方案

问题:

        bit如果长度为1,则会默认为布尔型(1-true 0-false);

        bit如果长度大于1,则会默认为bit类型,但是代码中以前常用的两种set方式,会报错

第一种方式:
ps.setObject(i+1, obj, Types.BIT);

 第二种方式:

ps.setByte(i+1, Byte.valueOf((String)obj));

 报错内容:

was aborted: 错误: 字段 "bit55" 的类型为 bit, 但表达式的类型为 boolean
  Hint: 你需要重写或转换表达式
  Position: 1124  Call getNextException to see other errors in the batch.
 

 解决方式:

       第一种:含有bit类型的where条件查询:

        经查阅,发现这个数据库在处理这个字段缺失存在问题,需要我们转换思想,在进行sql预处理的时候,就对bit字段进行转换: CAST(? as BIT(长度))。

        转换的sql也是可以查出值的。

select * from tb3 where bit55= CAST(B'10' as BIT(2))

 select * from tb4 where bit55= CAST(B'1' as BIT(1));

第二种:含bit类型的insert或者update入参: 

对于 ResultSetMetaData 中获取值的时候,也可以用如下方式,将其封装成PGobject :

case -7://可能是bit也可能是boolean
                    String temp = resultset.getString(i);
                    if(temp == null){
                        data.add(null);
                    }else if(temp.equalsIgnoreCase("F") || temp.equalsIgnoreCase("T")){
                        data.add(resultset.getBoolean(i));
                    }else{
                        if(rsmd.getColumnTypeName(i).equalsIgnoreCase("bit")){
                            PGobject pGobject = new PGobject();
                            pGobject.setType(rsmd.getColumnTypeName(i));
                            pGobject.setValue(resultset.getString(i));
                            data.add(pGobject);
                        }else{
                            data.add(resultset.getBoolean(i));
                        }
                    }
                    break;

在set的时候,直接用PGobject的方式。

PGobject pGobject = new PGobject();
pGobject.setType("BIT");
pGobject.setValue("1");
pstmt.setObject(i,pGobject);

 +++++++++++++++==========华丽的分割线==============++++++++++++++++++

 发现有不少人私信我set 类型BIT(1)是的报错问题,这里统一再解释下。

我之前写ps.setObject(i,object)。此处的object是指PGobject类型。

直接拿一个网友的举例:

public static void main(String[] args) {
// 数据库连接信息
        String url = "jdbc:postgresql://localhost:5432/postgres";
        String username = "postgres";
        String password = "123456";

// SQL语句
        String sql = "insert into h_user (username, password, gender,height) values(?,?,?,?)";

        try {
// 加载并注册JDBC驱动
            Class.forName("org.postgresql.Driver");

// 建立数据库连接
            try (Connection conn = DriverManager.getConnection(url, username, password);
// 创建PreparedStatement
                 PreparedStatement pstmt = conn.prepareStatement(sql)) {
                pstmt.setString(1, "ztt");
                pstmt.setString(2, "123456");
// 设置bit(1)值,bit如果长度为1,则会默认为布尔型
                PGobject pGobject = new PGobject();
                pGobject.setType("BIT");
                pGobject.setValue("1");
                pstmt.setObject(3,pGobject);
                pstmt.setFloat(4, 170);

// 执行SQL语句
                pstmt.executeUpdate();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

数据库:

CREATE TABLE "public"."h_user" (
  "id" serial4 not null,
  "username" varchar(50) COLLATE "pg_catalog"."default",
  "password" varchar(64) COLLATE "pg_catalog"."default",
  "nickname" varchar(60) COLLATE "pg_catalog"."default",
  "email" varchar(255) COLLATE "pg_catalog"."default",
  "gender" bit(1),
  "height" float4,
  CONSTRAINT "user_pkey" PRIMARY KEY ("id")
)

 看不懂的再问吧。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值