先来看个例子:
package com.xintouyun.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class JdbcTest1 {
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
Scanner sc=new Scanner(System.in);
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库
conn = DriverManager.getConnection("jdbc:mysql:///baidu", "root", "123456");
System.out.println("请输入序号");
int id=sc.nextInt();
System.out.println("请输入姓名");
String name=sc.next();
System.out.println("请输入学号");
String num=sc.next();
System.out.println("请输入生日");
String birthday=sc.next();
//3.创建statement
String sql="insert into student values(?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2,name);
ps.setString(3, num);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date dbirthday=sdf.parse(birthday);//将输入的字符串转换为格式化后的时间
java.sql.Date sqlbirthday=new java.sql.Date(dbirthday.getTime());
ps.setDate(4, sqlbirthday);
//4.执行查询
int affectrows=ps.executeUpdate();
System.out.println("受影响行数为"+affectrows);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
这是我用jdbc连接MySQL数据库时候遇到的问题,当我用java程序执行插入语句时,不免要用控制台来输入数据,这里我就用到了Scanner 类来进行控制台输入,但是从控制台输入的是字符串类型,而数据库中的生日birthday是date型的,所以这里就遇到了类型转换的问题。
那么要怎么转换呢?
一、从控制台得到一个birthday,这里是String类型的
System.out.println("请输入生日");
String birthday=sc.next();
二、将String类型的转换为Date型,并将其格式化为我们熟悉的年月日类型的,注意我这里的Date是java.util里面的Date
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date dbirthday=sdf.parse(birthday);//parse方法在api中如下
SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat 。 |
parse
public Date parse(String text, ParsePosition pos)
解析字符串的文本,生成 Date
。
此方法试图解析从 pos
给定的索引处开始的文本。如果解析成功,则将 pos
的索引更新为所用最后一个字符后面的索引(不必对直到字符串结尾的所有字符进行解析),并返回解析得到的日期。更新后的 pos
可以用来指示下次调用此方法的起始点。如果发生错误,则不更改 pos
的索引,并将 pos
的错误索引设置为发生错误处的字符索引,并且返回 null。
指定者:
类 DateFormat
中的 parse
参数:
text
- 应该解析其中一部分的 String
。
pos
- 具有以上所述的索引和错误索引信息的 ParsePosition
对象。
返回:
从字符串进行解析的 Date
。如果发生错误,则返回 null。
抛出:
NullPointerException
- 如果 text
或 pos
为 null。
另请参见:
DateFormat.setLenient(boolean)
三、将java.util中的Date转换为java.sql.Date
java.sql.Date sqlbirthday=new java.sql.Date(dbirthday.getTime());
Date(long date) 使用给定毫秒时间值构造一个 Date 对象。 |
在java.sql中Date类的构造方法如下,我们可以将第二部得到的long型的Date作为参数传进去,这样就能得到sql
中的Date对象。
四、在jdbc中使用
ps.setDate(4, sqlbirthday);
这样就可以实现了转换的原理