我目前正在处理一个项目并偶然发现一个非常常见的问题
"我应该在哪里放置此功能?"
基本上我有代表
等模型的类Store, Area, User, Item, Menu, Product and more...
我只考虑一些基本功能,如CRUD和其他搜索功能。
我在互联网上的教程和示例中看到的大部分内容都是
User.create(), User.delete(), User.update() and User.getUserById(int Id) User.getAllUsers() so on..
我的问题是它对我没有意义。
为什么用户模型能够搜索所有用户?甚至创建一个新用户?
更新和删除可能更有意义,但getUserById和getAllUsers也没有意义
我在想的不是商店模型有责任在该商店中添加用户,或者在该商店中创建菜单,商品和区域,然后&#&#&# 39;菜单模型有责任将产品添加到其菜单等等吗?
然后在搜索用户时,对于Store.getAllUsers()或Store.getUserById()或类似Menu.getAllCategories()和Category.getAllProducts()
更有意义。我知道我的想法会需要更多的代码和功能,但我不确定我所思考的是一个合理的架构,但我觉得它是。
我需要一些指导,或者可能是为了让自己直接思考。
答案 0 :(得分:1)
在决定如何在网络应用程序中实现持久性之前,您可能需要掌握一些概念。在我看来,有许多不同的设计模式,没有一个通用的解决方案。正确的答案应该与语言无关,但允许我举例说明您可能希望使用基本Java实现遵循的可能设计之一:
基本上,您创建了一个DAO,可以在您的应用程序中实现持久性(CRUD/SCRUD)。
此DAO将应用程序调用映射到持久层。我在Hibernate上使用tutorial(ORM)作为JPQL/HQL:
package org.mywebapp.pojos;
import org.hibernate.Query;
import org.hibernate.Session;
import java.io.Serializable;
import java.util.List;
public class myWebAppDAO {
private static myWebAppDAO _this = new myWebAppDAO();
public static myWebAppDAO getInstance() {
return _this;
}
public void persist(Object object) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.persist(object);
session.getTransaction().commit();
session.disconnect();
}
public void update(Object object) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.update(object);
session.getTransaction().commit();
session.disconnect();
}
public void delete(Object object) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.delete(object);
session.getTransaction().commit();
session.disconnect();
}
public Object getById(Class clazz, Serializable id) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Object o = session.load(clazz, id);
session.getTransaction().commit();
session.disconnect();
return o;
}
public List getTopicsByRef(int ref) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic AS t WHERE t.ref = :ref");
q.setParameter("ref", ref);
List topic = q.list();
session.getTransaction().commit();
return topic;
}
public long getTopicCount(int ref) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("SELECT COUNT(t) FROM Topic AS t WHERE t.ref = :ref");
q.setParameter("ref", ref);
Long l = (Long) q.uniqueResult();
session.getTransaction().commit();
return l;
}
public User getUser(String email, String password) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from User AS e WHERE e.email = :email AND e.password = :password");
q.setParameter("email", email);
q.setParameter("password", password);
User user = (User) q.uniqueResult();
session.getTransaction().commit();
return user;
}
//...
}
了解ORM如何处理数据库查询/查询结果的详细信息< - >对象转换,这个想法是通过在查询中使用Topic pojo来使您的应用数据库不可知。 MySQL的?甲骨文? PostgreSQL的? SQLite的?谁在乎?设置您想要/需要的数据源并且代码保持不变(通常,您只需将JDBC与适当的驱动程序一起使用)。
这是一个用于实例化User对象的非常简单的实现的示例(例如DAO上的getUser返回的实现);只是一个没有约束检查或任何东西的getter和setter的集合(另请查看Topic mapping的这个例子):
package org.mywebapp.pojos;
import java.io.Serializable;
public class User
implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String email;
private String password;
private String firstName;
private String lastName;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
这里是User.hbm.xml Hibernate映射,在这个简单的例子中,你只需要指定用户类中哪个属性匹配哪个表和列(同时检查Spring framework的这个例子):
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.mywebapp.pojos.User" table="user">
<id name="id" column="id">
<generator class="uuid" />
</id>
<property name="email" column="email"/>
<property name="firstName" column="firstName"/>
<property name="lastName" column="lastName"/>
<property name="password" column="password"/>
</class>
</hibernate-mapping>
所以现在你可以通过id选择用户,获取用户列表......无论你想做什么,你只需要在这些类和DAO上实现它,然后将它们导入到应用程序需要的任何地方并且你已经设置好了。
最重要的是:如果您想避免这些任务,有许多IDE和框架可以自动为您处理此过程。例如了解使用此Java web-app framework comparison上的Java django framework向/您的模型添加/修改参数是多么容易;或者如何在python Creating models中处理模型和应用程序之间的所有交互非常好,正如您在教程中看到的那样:Making queries和{{3}}