【发布时间】:2012-08-28 03:40:50
【问题描述】:
我正在 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");
}
}
【问题讨论】:
-
为什么每次都需要tp pass
"select * from products where id=?"查询?它可以移动到 findById 方法。 -
Database.findById 是通用的,因为它可以被任何模型使用。
标签: java reflection dao genericdao