我正在 Java 6(及更高版本)中开发玩具数据访问机制。每个模型类都应该有一个findById
静态方法,该方法应该从具有指定 id 的行实例化一个对象。我想出了下面显示的方法。我的方法被认为是好的做法吗?如果没有,有什么可以改进的?
数据库 (MySQL) 引导脚本:
create database test;
create user test identified by 'test';
grant all on test.* to test;
use test;
create table products(id integer,name varchar(10));
insert into products values(1,'led');
源代码:
import java.sql.*;
class Test {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
Product p = Product.findById(1);
System.out.println(p.id + " " + p.name);
}
}
class Database {
static <T extends Model<T>> T findById(T m, String sql, int id) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:mysql:///test", "test", "test");
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, id);
try (ResultSet rs = stmt.executeQuery()) {
rs.next();
m.load(rs);
}
}
return m;
}
}
abstract class Model<T> {
abstract void load(ResultSet rs) throws SQLException;
}
class Product extends Model<Product> {
int id;
String name;
static Product findById(int id) throws SQLException {
return Database.findById(new Product(), "select * from products where id=?", id);
}
@Override
void load(ResultSet rs) throws SQLException {
this.id = rs.getInt("id");
this.name = rs.getString("name");
}
}