今天写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时需要特别注意日期的转换问题.