Java -- JDBC学习笔记5、日期格式转换
1、Date工具类
现有问题:在对数据库进行插入数据操作时,如果数据库表中有时间类型的字段,就需要用到PreparedStatement接口中的setDate()方法,但是有一下两个问题:
- setDate()第二个参数类型是java.sql.Date,而Java编程应用层用的都是java.util.Date类型。
- 在servlet中接收用户输入的数据类型是字符串类型。
所以当我们用Java应用程序插入时间类型的数据时,需要进行转换。
1.1、java.util.Date
- Java语言常规应用层面日期类型,可以通过合格的时间字符串转换为java.util.Date。
- 无法直接通过JDBC插入到数据库中,因为PreparedStetement接口中的setDate()方法参数类型是java.sql.Date.
1.2、java.sql.Date
- 不可以通过字符串转换为java.sql.Date。只能使用该对象的构造函数,传入毫秒值获得该对象。
1.3、SimpleDateFormat
- 格式化和解析日期的具体类。
- 格式化(日期-->文本)Date-->String
- 解析(文本-->日期)String-->Date
1.3.1、SimpleDateFormat应用
//创建SimpleDateFormat对象,并且通过构造函数设置日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//创建java.util.Date对象
Date localDate = new Date();
//通过format()方法将java.util.Date转为String
String strDate = sdf.format(localDate);
//输出:2021-05-04
System.out.println(strDate);
//创建字符串
String str = "2012-01-12";
//通过parse()方法将String转为Date
Date dateStr = sdf.parse(str);
//输出:Thu Jan 12 00:00:00 CST 2012
System.out.println(dateStr);
2、封装DateUtils工具类
DateUtils中定义三个静态方法和一个SimpleDateFormat对象、方法的功能分别是:
- String-->java.util.Date:字符串转为java.util.Date
- java.util.Date-->java.sql.Date:java.util.Date转为java.sql.Date
- java.util.Date-->String:java.util.Date转换为字符串
2.1、具体实现
- 创建SimpleDateFormat对象:
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- 字符串转util.Date
public static Date strToUtilDate(String str)
{
try
{
return sdf.parse(str);
}
catch (ParseException e)
{
e.printStackTrace();
}
return null;
}
- util.Date转sql.Date
public static java.sql.Date utilToSql(Date date)
{
return new java.sql.Date(date.getTime());
}
- util.Date转string
public static String utilToStr(Date date)
{
return sdf.format(date);
}
3、案列
- 首先定义一个实体类,里边定义四个个字段、和数据库表中字段相对应。再添加构造方法、get和set方法、重写toString()。字段如下:
private int id;
private String Account;
private String Pwd;
private Date Birthday;
- 创建servlet,接收用户输入的值,这里写死,主要测试类型转换,如下:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
//假设bornDate为用户输入的日期
String bornDate = "2000-9-17";
//调用工具类,将其转为java.util.Date
Date date = DateUtils.strToUtilDate(bornDate);
//通过构造方法给属性赋值
Client client = new Client("169@qq.com", "169",date);
//调用Service层的ClientService,创建对象
ClientService clientService = new ClientService();
//调用AddClient方法,将client对象传入、执行添加操作
clientService.AddClient(client);
}
- 在ClientService中的AddClient()连接数据库、插入数据
public void AddClient(Client client)
{
Connection conn = null;
PreparedStatement statement = null;
String insertSql = "insert into Client(Account,Pwd,Birthday) values(?,?,?)";
try
{
conn = DBUtils.getConnection();
statement = conn.prepareStatement(insertSql);
statement.setString(1, client.getAccount());
statement.setString(2, client.getPwd());
//调用工具类,将java.util.Date转为java.sql.Date
statement.setDate(3, DateUtils.utilToSql(client.getBirthday()));
int count = statement.executeUpdate();
System.out.println(count == 1 ? "添加成功" : "添加失败");
}
catch (SQLException sqlException)
{
sqlException.printStackTrace();
}
DBUtils.closeDb(conn, statement, null);
}
概括来讲、就是接收到用户输入的值后,先转为java.util.Date,添加到数据库时,再转为java.sql.Date即可。