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

今天写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;
}
@Override
public 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=name
	private  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 block
				e.printStackTrace();
			}
		 }
		 if(conn!=null){
			 try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.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 block
				e.printStackTrace();
			}
		 }
		 if(conn!=null){
			 try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 }
		
	}
   }

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值