在进一步讨论之前,我很高兴知道到目前为止我的程序中是否存在任何重大设计缺陷。在我继续之前还有什么值得改变的吗?
模型
package model;
import java.sql.*;
import java.util.*;
public class MovieDatabase {
@SuppressWarnings({ "rawtypes", "unchecked" })
public List queryMovies() throws SQLException {
Connection connection = null;
java.sql.Statement statement = null;
ResultSet rs = null;
List results = new ArrayList();
try {
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
statement = connection.createStatement();
String query = "SELECT * FROM movie";
rs = statement.executeQuery(query);
while(rs.next()) {
MovieBean bean = new MovieBean();
bean.setMovieId(rs.getInt(1));
bean.setTitle(rs.getString(2));
bean.setYear(rs.getInt(3));
bean.setRating(rs.getInt(4));
results.add(bean);
}
} catch(SQLException e) {
}
return results;
}
}
的Servlet
public class Service extends HttpServlet {
@SuppressWarnings("rawtypes")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Movies!");
MovieDatabase movies = new MovieDatabase();
try {
List results = movies.queryMovies();
Iterator it = results.iterator();
while(it.hasNext()) {
MovieBean movie = new MovieBean();
movie = (MovieBean)it.next();
out.println(movie.getYear());
}
}
catch(SQLException e) {
}
}
}
豆
package model;
@SuppressWarnings("serial")
public class MovieBean implements java.io.Serializable {
protected int movieid;
protected int rating;
protected int year;
protected String title;
public MovieBean() {
}
public void setMovieId(int movieidVal) {
movieid = movieidVal;
}
public void setRating(int ratingVal) {
rating = ratingVal;
}
public void setYear(int yearVal) {
year = yearVal;
}
public void setTitle(String titleVal) {
title = titleVal;
}
public int getMovieId() {
return movieid;
}
public int getRating() {
return rating;
}
public int getYear() {
return year;
}
public String getTitle() {
return title;
}
}
答案 0 :(得分:3)
以下是一些建议:
package persistence; public interface MovieDao { List<Movie> find(); Movie find(int id); List<Movie> find(String title); void save(Movie movie); void update(Movie movie); void delete(Movie movie); }
答案 1 :(得分:2)
以下大部分是风格,不一定是“正确”的方式,当然也不是唯一的方式。
如果您实施了上述建议,则可能会将您的代码行数减少50%或更多。学习Hibernate可能是一个头痛,所以第一次不一定更容易或更快。它减少代码行的原因(在完成相同的工作时)是生成的代码非常正确,编码器不必担心它。
我一直在servlet中使用以下模式。这是伪代码,而不是真正的java。
Connection conn = null;
try {
conn.getConnection(...);
// your implementation here
conn.commit();
} catch (Exception e) {
conn.rollback();
} finally {
conn.close();
}
重点是数据库连接总是可以传递给worker,除非出现问题,否则总是会提交工作。如果出现问题,可以保证回滚。在任何一种情况下,数据库连接都会在全部结束时关闭。
答案 2 :(得分:1)
这非常简单明了,没有大问题。我唯一要指出的是你正在做一个SELECT *
然后通过列索引引用结果集。在这个阶段这不是问题,但是如果您的架构发生了变化(例如,在中间添加了一个字段),那么您的代码将会中断。我会明确选择列名:
SELECT id, title, year, rating FROM movie
答案 3 :(得分:-1)
有很多错误(许多人已经指出了大部分内容)。好像代码是用90年代写的。我强烈建议您阅读layered architecture,separation of concerns,MVC,DAO模式。然后你会自己回答这个问题,我会投票给你答案; - )。