求教Postgresql在jdbc处理bit(1)字段的预处理解决方案

文章目录


1.建表语句:

sql 复制代码
CREATE TABLE public.h_user (
	id serial4 not null,
	username varchar(50) NULL,
	"password" varchar(64) NULL,
	nickname varchar(60) NULL,
	email varchar(255) NULL,
	gender bit(1) NULL,
	height float4 NULL,
	CONSTRAINT user_pkey PRIMARY KEY (id)
);

2.使用以下方式的预处理方式都报错了

求指教怎么使用预处理PreparedStatement 设置bit(1)的值插入到库中。

java 复制代码
package com.health.util;
import java.sql.*;

public class bitTest {
        public static void main(String[] args) {
            // 数据库连接信息
            String url = "jdbc:postgresql://localhost:5432/postgres";
            //加 tinyInt1isBit=false 参数也是报错
//            String url = "jdbc:postgresql://localhost:5432/postgres?tinyInt1isBit=false";
            String username = "postgres";
            String password = "postgres";

            // 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)值,这里下面设置的情况都报错
//                    pstmt.setObject(3, new Boolean(true));
//                    pstmt.setObject(3, true,Types.BIT);
//                    pstmt.setObject(3,new Byte("1"));
//                    pstmt.setObject(3, new Short("1"),Types.BIT);
//                    pstmt.setObject(3,1);
                    pstmt.setObject(3,1,Types.BIT);
                    pstmt.setFloat(4, 170);
                    // 执行SQL语句
                    pstmt.executeUpdate();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

3.可以先用sql拼接实现功能

java 复制代码
package com.health.util;
import java.sql.*;

public class bitTest {

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

            // SQL语句  也可以把0::bit替换成cast(1 as bit(1))也可设置成功
            String sql = "insert into h_user (username, password, gender,height) values('ztt1','123',0::bit,172)";
            try {
                // 加载并注册JDBC驱动
                Class.forName("org.postgresql.Driver");
                try (Connection conn = DriverManager.getConnection(url, username, password);
                     // 创建Statement
                     Statement stat = conn.createStatement()) {
                    // 执行SQL语句
                    int result = stat.executeUpdate(sql);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

4.预处理方式解决设置bit(1)字段的值

java 复制代码
//用PGobject解决
PGobject pGobject = new PGobject();
pGobject.setType("BIT");
pGobject.setValue("1");
pstmt.setObject(3,pGobject);

完整的代码为:

java 复制代码
package com.health.util;
import org.postgresql.util.PGobject;
import java.sql.*;
public class bitTest {
        public static void main(String[] args) {
            // 数据库连接信息
            String url = "jdbc:postgresql://localhost:5432/postgres";
            String username = "postgres";
            String password = "postgres";
            // 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");
                    //用PGobject解决
                    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();
            }
        }
}

4.1找不到org.postgresql.util.PGobject的类文件

处理无法访问org.postgresql.util.PGobject:

我使用的是 Spring boot 2.1.5.RELEASE 我在我的pom .xml中有以下依赖项

xml 复制代码
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

因为您在运行时作用域中设置了JDBC驱动程序,此作用域指示编译时不需要依赖项,但执行时需要依赖项。它在运行时和测试类路径中,但不在编译类路径中。

它不在编译类路径中,导致在编译期间无法找到它的类。您应该将其更改为scope,这是默认范围,因此您可以简单地省略

xml 复制代码
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>
相关推荐
DBA_G2 小时前
GBase 8a表空间多路径存储数据迁移链路适配解析
数据库·oracle
java1234_小锋2 小时前
Tornado 6.5,全面支持 Python 3.14
数据库·python·tornado
jyOverQ3 小时前
MySQL 事务到底是什么?ACID 四大特性与隔离级别怎么理解?
数据库·mysql
奇牙coding1233 小时前
GPT-5.5 升级 GPT-5.6 接入指南:流式调用配置与常见问题
java·网络·gpt·ai
老刘的望远镜3 小时前
AgentScope Java 从零(03):Agent 的记性默认全开,我在第 50 轮翻了车
java·开发语言·javascript
SelectDB3 小时前
Doris 直查 Paimon 索引:快手湖上向量检索的共建与落地
大数据·数据库·数据分析
风123456789~3 小时前
【Oracle专栏】全局 && 本地复合索引 实验
数据库·oracle
1314lay_10073 小时前
通过Sql Server创建EXCEL文件:master..xp_cmdshell
数据库·excel
yxlalm3 小时前
5.3解决超卖问题
java·spring boot·超卖
李少兄4 小时前
Java 中只有值传递吗?
java·开发语言·python