MySQL&JSP java.sql.Date与java.util.Date 的数据库存读问题

本文详细介绍了在Java中如何正确地处理日期类型,包括在数据库读取和写入日期时的方法选择,如使用getDate与setDate,以及如何在Student类中实现日期的正确转换与存储,确保数据的一致性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的目标:


实现我的用户的增删查改。

 我的数据库:

    其中还添加了生日:也就是日期

讲述有关日期的问题:


  • 遍历显示的时候(读)

读取 的时候

public List<Student> findAll() {
		List<Student> list = new ArrayList<>();
		Connection conn = DbUtil.getConn();
		String sql = "SELECT * FROM tb_student";
		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()){
				list.add(new Student(rs.getInt(1),rs.getString(2),rs.getString(3),
						rs.getString(4),rs.getDate(5),rs.getString(6),rs.getString(7)));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

刚开始的时候一直用:getString() 不知道有getDate方法-----------------------》严肃.jpg学到惹

----------》翻资料还有一些与时间相关的


rs.getDate()-------------------返回日期部分     java.sql.Date   -----------------  2018-18-18

rs.getTime() --------------------返回时间部分     java.sql.Time  -----------------  21:28:18

rs.getTimestamp()-------------返回时间和日期     java.sql.Timestamp-------- 2018-18-18  21:28:18

                         虽然我的Student类里Date是 java.util.Date  但我发现好像没毛病 ==  一样正确的显示到界面上了
 


之后便是添加:

头疼:因为一直无法存进去   setDate(4,stu.getBirth())------因为setDate是sql.Date  而我的stu.getBirth() 一直是util.Date

@Override
	public void addStudent(Student stu) {
		// TODO Auto-generated method stub
		List<Student> list = new ArrayList<>();
		Connection conn = DbUtil.getConn();
		String sql = "INSERT INTO tb_student (sname,gender,tele,birth,hobby,info) VALUES(?,?,?,?,?,?)";
		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, stu.getSname());
			pstmt.setString(2, stu.getGender());
			pstmt.setString(3, stu.getTele());
			pstmt.setDate(4, new java.sql.Date(stu.getBirth().getTime()));
			pstmt.setString(5, stu.getHobby());
			pstmt.setString(6, stu.getInfo());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

解决办法:

Step 1:

从jsp获取name="birth"的时候就完成过1次转换 :因为 void addStudent(Student stu)  函数传参为Student类

所以 在Servlet层传递它的时候就要完成建立stu对象:获取的日期从String->Date(util.Date)类

birthstr= request.getParamater("birth");
Date birth = new SimpleDateFormat("yyyy-MM-dd").parse(birthstr);

尝试过的人都懂:birth格式   -----   Fri Dec 25 00:00:00 CST 1998     没事!就使用这种Date格式继续new Student

Step 2:

有了stu对象传入了上面那个存数据库得代码(addStudent(stu))中,

stu.getBirth()  获取stu的birth;  虽然是上面那种格式

.getTime()         获取Date(util.Date)的日期!-----成功转换为 1998-12-25

new java.sql.Date(stu.getBirth().getTime())  ---- 转换为Date(sql.Date)

pstmt.setDate(4,new java.sql.Date(stu.getBirth().getTime()) );  放到第四个位置!!!完成!

HTTP状态 500 - 内部服务器错误 类型 异常报告 消息 class java.util.Date cannot be cast to class java.sql.Timestamp (java.util.Date is in module java.base of loader 'bootstrap'; java.sql.Timestamp is in module java.sql of loader 'platform') 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 java.lang.ClassCastException: class java.util.Date cannot be cast to class java.sql.Timestamp (java.util.Date is in module java.base of loader 'bootstrap'; java.sql.Timestamp is in module java.sql of loader 'platform') com.myblog.servlet.CommentServlet.doPost(CommentServlet.java:37) javax.servlet.http.HttpServlet.service(HttpServlet.java:555) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ):注意 主要问题的全部 stack 信息可以在 server logs 里查看 Apache Tomcat/9.0.98 CommentDAO.java package com.myblog.dao; import com.myblog.model.Comment; import com.myblog.util.DBUtil; import java.sql.*; import java.util.ArrayList; import java.util.List; public class CommentDAO { public boolean addComment(Comment comment) { String sql = "INSERT INTO comments (article_id, user_id, content) VALUES (?, ?, ?)"; try (Connection conn = DBUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setInt(1, comment.getArticleId()); stmt.setInt(2, comment.getUserId()); stmt.setString(3, comment.getContent()); int rows = stmt.executeUpdate(); return rows > 0; } catch (SQLException e) { e.printStackTrace(); return false; } } public List<Comment> getCommentsByArticle(int articleId) { List<Comment> comments = new ArrayList<>(); String sql = "SELECT * FROM comments WHERE article_id = ? ORDER BY created_at DESC"; try (Connection conn = DBUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setInt(1, articleId); try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { Comment comment = new Comment(); comment.setCid(rs.getInt("cid")); comment.setArticleId(rs.getInt("article_id")); comment.setUserId(rs.getInt("user_id")); comment.setContent(rs.getString("content")); comment.setCreatedAt(rs.getTimestamp("created_at")); comments.add(comment); } } } catch (SQLException e) { e.printStackTrace(); } return comments; } } Comment.java package com.myblog.model; import java.sql.Timestamp; public class Comment { private int cid; private int articleId; private int userId; private String content; private Timestamp createdAt; // 无参构造器 public Comment() {} // 全参构造器 public Comment(int cid, int articleId, int userId, String content, Timestamp createdAt) { this.cid = cid; this.articleId = articleId; this.userId = userId; this.content = content; this.createdAt = createdAt; } // 用于创建评论的构造器 public Comment(int articleId, int userId, String content) { this.articleId = articleId; this.userId = userId; this.content = content; } // Getter和Setter方法 public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public int getArticleId() { return articleId; } public void setArticleId(int articleId) { this.articleId = articleId; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Timestamp getCreatedAt() { return createdAt; } public void setCreatedAt(Timestamp createdAt) { this.createdAt = createdAt; } }
最新发布
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值