错误笔记:JDBC中Statement和PreparedStatement对于Date类型写入数据库问题

来源:互联网 发布:域名注册管理机构 编辑:程序博客网 时间:2024/06/05 04:12

今天写JDBC使用Statement执行sql语句向oracle数据库中插入Date类型数据时,遇到了一些问题:


首先Date类在java.util下和java.sql下都有,他们在控制台上的答应分别是:

java.util.date:


java.sql.date:



接下来  我们需要跟数据库建立连接,把我们写的POJO类中的数据插入oracle数据库中

POJO类:

package com.briup.day2;import java.util.Date;public class Student {   private  long id;   private   String name;   private Date date;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "Studnet [id=" + id + ", name=" + name + ", date=" + date + "]";}   }
接着要把POJO类对象中的数据拿出来插入数据库,需要对应数据库中的表

建student表:

create table student(id number primary key,name varchar2(100),birthday date);

对应的把对象中的数据插入数据库的操作:

首先要想日期类型要怎么往数据库中插入,我的oracle时Session是中文格式,必须要插入xx-xx月-xx类型的日期,而我的POJO类中Date时java.util.date类,所对应的日期不符合规则.因此需要先写一个方法把java.util.date类转换成java.sql.date类型. java.sql.date类型创建对象时,需要传一个long类型的日期,因此调用java.util.date.getTime()方法来获得,传入:

   public   java.sql.Date   getDate(long time){     return   new java.sql.Date(time);        }
但是这样转换后的日期格式时"xx-xx-xx",因此我一直报一个数据类型不符合的错.那怎么办呢?首先用toString()将Date类型转化成字符串,在使用SQL语句to_date('date','yyyy-mm-dd')方法,将"xx-xx-xx"转换成"xx-xx月-xx"的字符串方可插入数据库:

public class StatementTest {private   String driver ="oracle.jdbc.driver.OracleDriver";private   String url ="jdbc:oracle:thin:@127.0.0.1:1521:XE";private  String user=nameprivate  String pass=password;   public  void  StTestInsert(Student  s){   Connection  conn=null;   Statement  st =null;   try {     Class.forName(driver);     conn  =     DriverManager.getConnection(url, user, pass);     System.out.println(conn);         st=conn.createStatement();         long id  = s.getId();         String name  = s.getName();         java.sql.Date date  = getDate(s.getDate().getTime());         String   date1 = date.toString();         String  sql="insert into student  values("+id+",'"+name+"',to_date('"+date1+"','yyyy-mm-dd'))";         System.out.println(sql);         st.execute(sql);          System.out.println("执行成功");   } catch (Exception e) {e.printStackTrace();}finally{ if(st!=null){ try {st.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} } if(conn!=null){ try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}      }    public   java.sql.Date   getDate(long time){     return   new java.sql.Date(time);        }

这样可以将date正确的插入数据库中



接着时prepareStatement:

prepareStatement中有对应的方法,getDate()  里面需要传的就是java.sql.date类型的数据,因此不需要麻烦的转换:

  public  void preTestInsert(Student s){   Connection  conn=null;   PreparedStatement  pst =null;   try {     Class.forName(driver);     conn  =     DriverManager.getConnection(url, user, pass);     System.out.println(conn);         long id  = s.getId();         String name  = s.getName();         java.sql.Date date  = getDate(s.getDate().getTime());             //构建PreparedStatement 对象  ,这个对象提供预编译功能         //可以帮我们把sql语句发送到数据库         String sql  ="insert into  student values(?,?,?)";         pst=conn.prepareStatement(sql);         pst.setLong(1, id);         pst.setString(2, name);         pst.setDate(3, date);         pst.execute();         System.out.println("执行成功");   } catch (Exception e) {e.printStackTrace();}finally{ if(pst!=null){ try {pst.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} } if(conn!=null){ try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}   }

总结下来,statement插入数据时比较麻烦,如果数据类型太多的话,字符串的拼接就会很长,稍不留神就会出错,因此觉得还是preparedStatement比较好用.

用statement时需要特别注意日期的转换问题.


阅读全文
0 0