Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用反射就可以用Java编写简单的泛型DAO吗?_Java_Reflection_Dao_Genericdao - Fatal编程技术网

不使用反射就可以用Java编写简单的泛型DAO吗?

不使用反射就可以用Java编写简单的泛型DAO吗?,java,reflection,dao,genericdao,Java,Reflection,Dao,Genericdao,我正在用Java6(及更高版本)开发一个玩具数据访问机制。每个模型类都应该有一个findById静态方法,该方法应该用指定的id从行实例化一个对象。我的方法是否被视为良好实践?如果没有,可以改进什么 数据库(MySQL)引导脚本: 创建数据库测试; 创建由“测试”标识的用户测试; 批准所有测试。*进行测试; 使用试验; 创建表产品(id integer,name varchar(10)); 插入产品值(1,'led'); 源代码: import java.sql.*; 课堂测试{ 公共静态vo

我正在用Java6(及更高版本)开发一个玩具数据访问机制。每个模型类都应该有一个
findById
静态方法,该方法应该用指定的id从行实例化一个对象。我的方法是否被视为良好实践?如果没有,可以改进什么

数据库(MySQL)引导脚本:

创建数据库测试;
创建由“测试”标识的用户测试;
批准所有测试。*进行测试;
使用试验;
创建表产品(id integer,name varchar(10));
插入产品值(1,'led');
源代码:

import java.sql.*;
课堂测试{
公共静态void main(字符串[]args)抛出SQLException、ClassNotFoundException{
Class.forName(“com.mysql.jdbc.Driver”);
产品p=产品findById(1);
System.out.println(p.id+“”+p.name);
}
}
类数据库{
静态T findById(tm,字符串sql,int-id)抛出SQLException{
try(Connection conn=DriverManager.getConnection(“jdbc:mysql:///test“,”测试“,”测试“);
PreparedStatement stmt=conn.prepareStatement(sql)){
stmt.setInt(1,id);
try(ResultSet rs=stmt.executeQuery()){
rs.next();
m、 负载(rs);
}
}
返回m;
}
}
抽象类模型{
抽象无效加载(ResultSet rs)引发SQLException;
}
类产品扩展模型{
int-id;
字符串名;
静态产品findById(int-id)引发SQLException{
return Database.findById(new Product(),“select*from products,其中id=?”,id);
}
@凌驾
无效加载(结果集rs)引发SQLException{
this.id=rs.getInt(“id”);
this.name=rs.getString(“name”);
}
}

我宁愿使用基于DAO的方法。您需要使用基本的CRUD方法创建一个
GenericDao
类,并且所有派生的DAO类对于指定的实体类都具有现成的CRUD功能

以下两篇文章演示了所描述的技术:
我宁愿使用基于DAO的方法。您需要使用基本的CRUD方法创建一个
GenericDao
类,并且所有派生的DAO类对于指定的实体类都具有现成的CRUD功能

以下两篇文章演示了所描述的技术:
我喜欢基本的设计。但对于一个真正的生产项目,我会做3个改变:

  • 在数据库和任何资源代码中,添加一个finally块并在单独的try-catch中关闭每个连接(您只有1个),否则您将得到con泄漏
  • 在数据库中:使用共享连接池
  • 在产品getById中,如果产品正在重复使用,请将其缓存在HashMap中,如果已经加载,则在每次生成新对象时返回该值。这取决于使用情况,但我们对很多有100到5000行的表执行此操作,这些表偶尔会更改,但会读取很多次

  • 我喜欢基本的设计。但对于一个真正的生产项目,我会做3个改变:

  • 在数据库和任何资源代码中,添加一个finally块并在单独的try-catch中关闭每个连接(您只有1个),否则您将得到con泄漏
  • 在数据库中:使用共享连接池
  • 在产品getById中,如果产品正在重复使用,请将其缓存在HashMap中,如果已经加载,则在每次生成新对象时返回该值。这取决于使用情况,但我们对很多有100到5000行的表执行此操作,这些表偶尔会更改,但会读取很多次

  • 您正在重新发明对象关系映射(ORM)和数据访问对象(DAO)方法。例如,存在许多Java库,它们正是您在这里尝试做的事情。我想您可能会发现这个库比获得这个问题的正确答案更有用。

    您正在重新发明对象关系映射(ORM)和数据访问对象(DAO)方法。例如,存在许多Java库,它们正是您在这里尝试做的事情。我想您可能会发现这个库比获得这个问题的正确答案更有用。

    您将关注点和责任混为一谈,在您的实体(
    产品
    )和数据访问层之间引入了紧密耦合

    你应该分开

    • 实体(只有getter/setter和可能的内部业务逻辑,根据您的总体模型,您可能也想将它们分开)
    • 数据访问层:我将为您的每个实体(
      ProductDao
      )提供接口,其中包含您要执行的检索/存储/删除实体的方法。然后,您可以使用您选择的技术(在您的案例中是JDBC)实现这些功能的具体实现。因此,如果以后您想更改数据访问技术,您可以使用这些技术的另一个实现(
      JdbcProductDao
      HibernateProductDao
    您甚至可能想更进一步,将DAO层与实际的存储库层分离,但这可能被视为过早的优化,具体取决于系统中不同实体类的数量

    这有很多好处:

    • 光耦合是更好的整体设计
    • 更好的可测试性等
    此外,在任何地方都尝试使用通用方法也不一定是个好主意:通常,您会发现您想要的
    findById
    对于每个实体都略有不同,并且其中一些方法不适合您在
    数据库中描述的通用方法(我甚至没有提到它是一个静态方法,这是一种不好的味道)。在我目前的团队中,我们使用三条规则:只有在编写系统的第三个元素时才引入重构的泛型类/方法,这将从中受益。否则我们认为这是早熟的优化。

    < P>