使用 Java、Javalin 和 SQL
SQL 数据库表:
账号
account_id integer primary key auto_increment,
username varchar(255),
password varchar(255)
留言
message_id integer primary key auto_increment,
posted_by integer,
message_text varchar(255),
time_posted_epoch long,
foreign key (posted_by) references Account(account_id)
作为用户,我应该能够在端点 POST localhost:8080/messages 上提交新帖子。请求正文将包含消息的 JSON 表示形式,该消息应持久保存到数据库中,但不包含 message_id。
以下代码是我所做的。在 SocialMediaController 类中,我如何编码 posted_by 指的是真实的现有用户?
SocialMediaController.java
public class SocialMediaController {
AccountService accountService;
MessageService messageService;
public SocialMediaController() {
this.accountService = new AccountService();
this.messageService = new MessageService();
}
public Javalin startAPI() {
Javalin app = Javalin.create();
app.post("/messages", this::createMessageHandler);
return app;
}
// 3. Create new messages
private void createMessageHandler(Context ctx) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Message message = mapper.readValue(ctx.body(), Message.class);
/*
Creation of the message successful if message_text is not blank, is under 255 characters,
and posted_by refers to a real, existing user
*/
if(message.getMessage_text().isBlank() || message.getMessage_text().length() >= 255){
ctx.status(400); // Client error
}else{
Message addedMessage = messageService.addMessage(message);
ctx.json(mapper.writeValueAsString(addedMessage));
ctx.status(200); // Successful response
}
}
MessageDAO.java
public class MessageDAO {
public Message createMessage(Message message){
Connection connection = ConnectionUtil.getConnection();
try {
//Write SQL logic here
String sql = "INSERT INTO message (posted_by, message_text, time_posted_epoch) VALUES (?, ?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setInt(1, message.getPosted_by());
preparedStatement.setString(2, message.getMessage_text());
preparedStatement.setLong(3, message.getTime_posted_epoch());
preparedStatement.executeUpdate();
ResultSet pkeyResultSet = preparedStatement.getGeneratedKeys();
if(pkeyResultSet.next()){
int generated_message_id = (int) pkeyResultSet.getInt(1);
return new Message(generated_message_id, message.getPosted_by(), message.getMessage_text(), message.getTime_posted_epoch());
}
}catch(SQLException e){
System.out.println(e.getMessage());
}
return null;
}
MessageService.java
public class MessageService {
private MessageDAO messageDAO;
public MessageService(){
messageDAO = new MessageDAO();
}
// Constructor for a MessageService when a MessageDAO is provided
public MessageService(MessageDAO messageDAO){
this.messageDAO = messageDAO;
}
// Use MessageDAO to create new message
public Message addMessage(Message message) {
return messageDAO.createMessage(message);