Java Derby插入Java TIMESTAMP

时间:2017-08-28 01:48:15

标签: java derby

大家好我已经谷歌搜索了一个小时左右我的所有测试插页都失败了。我尝试了很多,他们被评论出来了。它们在插入时间戳的时刻失败。 第49和50行 学生表创建 2017-08-27 21:44:00.318 线程" main"中的例外情况java.sql.SQLSyntaxErrorException:语法错误:遇到" 21"在第1栏第92栏。

排第51行 学生表创建 2017-08-27 21:44:00.318 线程" main"中的例外情况java.sql.SQLSyntaxErrorException:语法错误:遇到" 2017"在第1行,第86栏。

任何帮助?

    package timeclock;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;



public  class CreateDB {
    public static final String DRIVER= "org.apache.derby.jdbc.EmbeddedDriver";
    public static final String JDBC_URL = "jdbc:derby:students;create=true";
    public static void main(String[] args) throws ClassNotFoundException, SQLException
    {
        Class.forName(DRIVER);
        isTableExist("STUDENTS");



    }

    public static boolean isTableExist(String sTablename) throws SQLException{
        Connection connection = DriverManager.getConnection(JDBC_URL);
        if(connection!=null)
        {
            DatabaseMetaData dbmd = connection.getMetaData();
            ResultSet rs = dbmd.getTables(null, null, sTablename.toUpperCase(),null);
            if(rs.next())
            {
                System.out.println("Table "+rs.getString("TABLE_NAME")+" already exists !!");
            }
            else
            {
                Timestamp time = new Timestamp(System.currentTimeMillis());
                String timefix = time.toString();
                connection.createStatement().execute("create table Students(id INT not null primary key GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1), FirstName varchar(20), LastName varchar(20), Class varchar(20), ClassNumber INT, StudentIDNumber INT, ClockInTime timestamp, ClockOutTIme timestamp)");
                System.out.println(" Students Table created");
                System.out.println(time);
                //connection.createStatement().execute("insert into Students values " + "('First Name','Last Name','class','123456','123456', To_TIMESTAMP( "+timefix+")" + "," + " To_TIMESTAMP( "+timefix+")"  );
                connection.createStatement().execute("insert into Students values " + "('First Name','Last Name','class','123456','123456',"+timefix+","+timefix+")"  );
                //connection.createStatement().execute("insert into Students values " + "('First Name','Last Name','class','123456','123456', {ts " +timefix+"}" + "," + "ts { "+timefix+"})"  );
                System.out.println(" Students record sucessfully inserted");
            }
            return true;
        }
        return false;
}
}

2 个答案:

答案 0 :(得分:0)

我被Basil Boutque引导得很好。它花了一些技巧但我终于明白了。

package timeclock;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;



public  class CreateDB {
    public static final String DRIVER= "org.apache.derby.jdbc.EmbeddedDriver";
    public static final String JDBC_URL = "jdbc:derby:student_;create=true";
    public static void main(String[] args) throws ClassNotFoundException, SQLException
    {
        Class.forName(DRIVER);
        isTableExist("STUDENT_");



    }

    public static boolean isTableExist(String sTablename) throws SQLException{
        Connection connection = DriverManager.getConnection(JDBC_URL);
        if(connection!=null)
        {
            DatabaseMetaData dbmd = connection.getMetaData();
            ResultSet rs = dbmd.getTables(null, null, sTablename.toUpperCase(),null);
            if(rs.next())
            {
                System.out.println("Table "+rs.getString("TABLE_NAME")+" already exists !!");
            }
            else
            {
                //LocalDateTime timeIn = LocalDateTime.now();
                //LocalDateTime timeOut = LocalDateTime.now();
                Timestamp timeIn = new Timestamp(System.currentTimeMillis());
                Timestamp timeOut = new Timestamp(System.currentTimeMillis());
                connection.createStatement().execute("create table STUDENT_(id_ INT not null primary key GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1), first_name_ varchar(20), last_name_ varchar(20), class_ varchar(20), class_number_ INT, student_id_number_ varchar(6), clock_in_time_ timestamp, clock_out_time_ timestamp)");
                System.out.println(" Students Table created");
                System.out.println(timeIn);
                //connection.createStatement().execute("insert into Students values " + "('First Name','Last Name','class','123456','123456', To_TIMESTAMP( "+time+")" + "," + " To_TIMESTAMP( "+time+")"  );
                //connection.createStatement().execute("insert into Students values " + "('First Name','Last Name','class','123456','123456',"+time+","+time+")"  );
                //connection.createStatement().execute("insert into Students values " + "('First Name','Last Name','class','123456','123456', {ts " +time+"}" + "," + "ts { "+time+"})"  );
                String sql = "INSERT INTO STUDENT_ ( first_name_, last_name_, class_, class_number_, student_id_number_, clock_in_time_, clock_out_time_  ) VALUES ( ?, ?, ?, ?, ?, ?, ? )  " ;
                PreparedStatement ps = connection.prepareStatement( sql );
                ps.setString( 1, "Ben" );
                ps.setString( 2, "Tester");
                ps.setString( 3, "DBA");
                ps.setObject( 4, 123456);
                ps.setObject( 5, "649619");
                ps.setObject( 6 , timeIn ) ;
                ps.setObject( 7 , timeOut ) ;
                ps.executeUpdate();
                connection.commit();

                System.out.println(" Students record sucessfully inserted");
            }
            return true;
        }
        return false;
}
}

答案 1 :(得分:-1)

java.time

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime in = ZonedDateTime.of( LocalDate.parse( "2017-08-27" ) , LocalTime.parse( "21:00:00" ) , z ) ;
ZonedDateTime out = ZonedDateTime.of( LocalDate.parse( "2017-08-27" ) , LocalTime.parse( "21:45:00" ) , z ) ;

Derby 10.13及更高版本支持JDBC 4.2,因此您应该能够直接使用java.time类型而不是旧版java.sql类型。您应该避免使用java.sql.Timestamp java.time类型。 (警告:我不是德比用户,所以我没试过这个。)

通常最好习惯只使用PreparedStatement来避免SQL注入黑客的危险。

将我对省略号的使用替换为您的实际参数和值。

String sql = "INSERT INTO student_ ( first_name_ , … , clock_in_ , clock_out_ ) VALUES ( ? , … , ? , ? ) ; " ;
PreparedStatement ps = conn.prepareStatement( sql ) ;
ps.setString( 1 , 'Ben' ) ;
…
ps.setObject( … , in ) ;
ps.setObject( … , out ) ;
…

要获取此类值,请使用ResultSet::getObject

我假设Derby以UTC格式保存日期时间值。如果是,则检索为Instant个对象。但我不知道,所以请阅读你的文档。数据库的日期时间处理差异很大。

Instant in = myResultSet.getObject( … , Instant.class ) ; 
Instant out = myResultSet.getObject( … , Instant.class ) ; 

申请时区。

ZonedDateTime zdtIn = in.atZone( z ) ;

要获取当前时刻,请致电:

Instant.now()

...或:

ZonedDateTime.now( z )

命名提示:

根据关系理论,一般使用单数名词作为表名。

在表和列名称后面附加一个尾随下划线,以避免与每个SQL规范的保留字冲突。

在名称中使用所有小写ASCII字母,以便跨数据库实现最大可移植性,并简化SQL编码。