如何使用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#setObject
和ResultSet#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#setObject
和 ResultSet#getObject
与 java.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 上。
此示例应用程序中的两个关键行标有// <-- 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服务器中插入年份数据类型的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何使用rmi在java中的mysql(jdbc)中插入一条记录? [关闭]
在informix中相当于日期时间年份的Mysql到分数(3)