如何使用java在mysql服务器中插入年份数据类型

Posted

技术标签:

【中文标题】如何使用java在mysql服务器中插入年份数据类型【英文标题】:How to insert year data type in mysql server using java 【发布时间】:2021-02-28 16:37:00 【问题描述】:

我在 sql server 上有 sql 架构,我试图在表中插入值,但是当我尝试在 sql 中插入 Year 数据类型时出现错误 例如,我已将字符串解析为年份数据类型

double c=Double.parseDouble("2019.0");
int yt=(int) c;
Year business_year; 
business_year=Year.parse(String.format("%04d", yt));
String qq="INSERT INTO invoice_details VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(qq);
pstmt.setYear(1,business_year);

pstmt.setYear(1,business_year); 在这一行我收到以下错误

PreparedStatement 类型中的方法 setDate(int, Date) 不适用于参数 (int, Year)。

有人可以帮忙吗。

【问题讨论】:

确实PreparedStatement 确实有一个方法setYear - 甚至错误消息都在告诉其他东西 - 无论如何,方法setDate 不接受Year,只接受Date 或子类其中 @user15244370 不,它不怎么做?如何在sql中插入Year数据类型 您到底想在数据库中存储什么?什么是列类型? @user15244370 sql 模式中的列数据类型是我想插入到表中的年份 检查 documentation 表明它必须是 Date (setDate) 或短 (setShort) - 甚至可能接受字符串 (setString) 【参考方案1】:

警告:我不使用 mysql。我确实读过doc for version 8。

Java 提供了Year 类。 MySQL 提供了YEAR 数据类型。顺便说一句,与您的问题所暗示的相反,据我所知,SQL 标准没有定义 YEAR 数据类型。

您也许可以直接传递 Java 对象。 JDBC 4.2 中定义了对Year 类的支持。因此,这种行为将是特定于您的特定 JDBC 驱动程序的可选功能。如果您的驱动程序确实提供了这个,我希望它使用PreparedStatement#setObjectResultSet#getObject 方法。

myPreparedStatement.setObject( … , Year.now() ) ;

还有……

Year y = myResultSet.getObject( … , Year.class ) ;

如果您的 JDBC 驱动程序不支持 Year,the doc for MySQL 表示您应该能够传递文本或整数。这是传递/接收整数的示例代码。

Year year = Year.of( 2020 ) ;
…
pstmt.setInt( 2 , year.getValue() );

…和:

Year year = Year.of( rs.getInt( "year_" ) );

关于您的代码:

pstmt.setYear(1,business_year);

PreparedStatement 上没有 setYear 方法。该代码将无法编译。

示例应用

再往下是整个示例应用的源代码。

此示例已注释掉代码,尝试将 PreparedStatement#setObjectResultSet#getObjectjava.time.Year 类结合使用。

此代码在通过 Maven 依赖项使用此 JDBC 驱动程序运行时因缺少对 Year 类的支持而失败:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
</dependency>

…在作为托管数据库服务托管在 DigitalOcean.com 上的 MySQL 8 上。

此示例应用程序中的两个关键行标有// &lt;-- java.time.Year not supported by this JDBC driver.

package work.basil.example.mysqlstuff;


import javax.sql.DataSource;
import java.sql.*;
import java.time.Instant;
import java.time.Year;
import java.util.Objects;

public class App

    // Member fields.

    public static void main ( String[] args )
    
        System.out.println( "Hello world. " );
        App app = new App();
        app.demo();
    

    private void demo ( )
    
        System.out.println( "INFO - Starting demo method. " + Instant.now() );

        DataSource dataSource = this.configureDataSource();
        this.dropTable( dataSource );
        this.createTable( dataSource );
        this.insertRow( dataSource );
        this.dumpTable( dataSource );

        System.out.println( "INFO - Done with demo method. " + Instant.now() );
    

    private void dropTable ( DataSource dataSource )
    
        System.out.println( "INFO - `dropTable` method. " + Instant.now() );
        try ( Connection conn = dataSource.getConnection() )
        
            String sql = """
                         DROP TABLE IF EXISTS event_
                         ;
                         """;
            System.out.println( "sql:  \n" + sql );
            try ( Statement stmt = conn.createStatement() )
            
                stmt.execute( sql );
            
        
        catch ( SQLException e )
        
            e.printStackTrace();
        
    

    private void createTable ( DataSource dataSource )
    
        System.out.println( "INFO - `createTable` method. " + Instant.now() );
        try ( Connection conn = dataSource.getConnection() )
        
            String sql = """
                         CREATE TABLE IF NOT EXISTS event_
                            ( 
                               id_ INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,  -- ⬅ `identity` = auto-incrementing integer number.
                               title_ VARCHAR ( 30 ) NOT NULL ,
                               year_ YEAR NOT NULL 
                             )
                         ;
                         """;
            System.out.println( "sql:  \n" + sql );
            try ( Statement stmt = conn.createStatement() ; )
            
                stmt.execute( sql );
            
        
        catch ( SQLException e )
        
            e.printStackTrace();
        
    


    private void insertRow ( DataSource dataSource )
    
        System.out.println( "INFO - `insertRow` method. " + Instant.now() );
        String sql = """
                     INSERT INTO event_ ( title_ , year_ )
                     VALUES ( ? , ? )
                     ;
                     """;
        try (
                Connection conn = dataSource.getConnection() ;
                PreparedStatement pstmt = conn.prepareStatement( sql ) ;
        )
        
            pstmt.setString( 1 , "zero" );
//            pstmt.setObject( 2 , Year.of( 2020 ) );  // <-- java.time.Year not supported by this JDBC driver.
            pstmt.setInt( 2 , Year.of( 2020 ).getValue() );
            pstmt.executeUpdate();

            pstmt.setString( 1 , "one" );
            pstmt.setInt( 2 , Year.of( 2021 ).getValue() );
            pstmt.executeUpdate();

            pstmt.setString( 1 , "two" );
            pstmt.setInt( 2 , Year.of( 2022 ).getValue() );
            pstmt.executeUpdate();
        
        catch ( SQLException e )
        
            e.printStackTrace();
        
    

    private void dumpTable ( DataSource dataSource )
    
        System.out.println( "INFO - `dumpTable` method. " + Instant.now() );

        String sql = "SELECT * FROM event_ ;";
        try (
                Connection conn = dataSource.getConnection() ;
                Statement stmt = conn.createStatement() ;
                ResultSet rs = stmt.executeQuery( sql ) ;
        )
        
            System.out.println( "-------|  event_ table  |--------------------" );
            while ( rs.next() )
            
                //Retrieve by column name
                int id = rs.getInt( "id_" );
                String title = rs.getString( "title_" );
//                Year year = rs.getObject( "year_" , Year.class );     // <-- java.time.Year not supported by this JDBC driver.
                Year year = Year.of( rs.getInt( "year_" ) );

                System.out.println( "id_=" + id + " | title_=" + title + " | year_=" + year );
            
        
        catch ( SQLException e )
        
            e.printStackTrace();
        
    

    private DataSource configureDataSource ( )
    
        System.out.println( "INFO - `configureDataSource` method. " + Instant.now() );

        com.mysql.cj.jdbc.MysqlDataSource dataSource = Objects.requireNonNull( new com.mysql.cj.jdbc.MysqlDataSource() );  // Implementation of `DataSource` bundled with H2.
        dataSource.setServerName( "db-mysql-sfo3-422-do-user-8982-1.x.db.ondigitalocean.com" );
        dataSource.setPortNumber( 24_090 );
        dataSource.setDatabaseName( "defaultdb" );
        dataSource.setUser( "scott" );
        dataSource.setPassword( "tiger" );
        return dataSource;
    

【讨论】:

它通过将其设置为 pstmt.setShort() 来工作 你试过setObject吗?这就是我们根据 JDBC 4.2 和 4.3 交换 java.time 对象的当前途径。如果如果确实有效,我想编辑此答案以明确地说,而不是推测。如果setObject 确实有效,请准确说明您使用的是什么 JDBC 驱动程序以及什么版本。 是的,我会在尝试的时候通知您,谢谢

以上是关于如何使用java在mysql服务器中插入年份数据类型的主要内容,如果未能解决你的问题,请参考以下文章

在mysql数据库中存储月份和年份

java - 如何使用rmi在java中的mysql(jdbc)中插入一条记录? [关闭]

java 批量插入mysql 怎么去重

在informix中相当于日期时间年份的Mysql到分数(3)

如何在 Java 中将 ArrayList 数据类型插入 MySQL 数据库

年份显示不正确