项目如何重新设计以使用独特的 Dao
project how to redesign to use unique dao
我有两个项目,但它们没有使用相同的 DAO 层,并且一个项目使用 URL 请求来调用另一个项目的方法。
我遇到了一个问题,当我创建一个实体时,我必须创建单独的 DAO、服务等。这个 DAO 使用不同的碎片。
我想找到一种方法或一种甜美的设计模式来使用独特的抽象DAO,并将URL调用方式更改为更清晰,更灵活的方式。
我的代码是这样的:
public static String apiDeviceEdit(Device device, HttpSession session,
Long operate) {
String userId = (String) session
.getAttribute(CommonAttributes.API_USERID_SESSION);
String token = (String) session
.getAttribute(CommonAttributes.API_TOKEN_SESSION);
Assert.notNull(userId);
Assert.notNull(token);
String param = "user_id=" + userId + "&device_sn=" + device.getfSn()
+ "&operate=" + operate + "&token=" + token;
String string = sendPost(setting.getApiDeviceEdit(), param,
"DeviceEdit");
return string;
}
不同的刀法:
@Component
@Scope("singleton")
public class ConductorDao extends BaseHBDao <Conductor, Long> {
@Autowired
public ConductorDao (@Qualifier("sessionFactory") SessionFactory session) {
super ();
this.setSessionFactory (session);
}
}
public interface ConductorDao extends BaseDao<Conductor, Long> {
final String SELECT_BY_SN = "from Conductor c where c.sn =:sn";
Conductor findBySn(String sn) throws Exception;
Page<Conductor> findByUserId(Long getfId, Pageable pageable);
}
@Component
@Scope("singleton")
public class ConductorDaoImpl extends BaseDaoImpl<Conductor, Long> implements ConductorDao {
@Override
public Conductor findBySn(String sn) throws Exception {
List<Conductor> conductors = entityManager.createQuery(SELECT_BY_SN).setParameter("sn", sn).getResultList();
if (conductors == null || conductors.size()== 0) {
return new Conductor();
}
else {
return conductors.get(0);
}
}
@Override
public Page<Conductor> findByUserId(Long getfId, Pageable pageable) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Conductor> criteriaQuery = criteriaBuilder.createQuery(Conductor.class);
Root<Conductor> root = criteriaQuery.from(Conductor.class);
criteriaQuery.select(root);
Predicate restrictions = criteriaBuilder.conjunction();
restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("userId"), getfId));
criteriaQuery.where(restrictions);
return super.findPage(criteriaQuery, pageable);
}
}
确定添加第三层抽象,将其称为业务,并从这个新项目中对 dao 层进行所有调用,切断所有直接进入 dao 的调用以使用您的业务层。然后你可以在那个项目中使用你的两个 dao 罐子,这样你就可以将它公开为 rest 或 web 服务,如果你愿意的话。
我有两个项目,但它们没有使用相同的 DAO 层,并且一个项目使用 URL 请求来调用另一个项目的方法。 我遇到了一个问题,当我创建一个实体时,我必须创建单独的 DAO、服务等。这个 DAO 使用不同的碎片。
我想找到一种方法或一种甜美的设计模式来使用独特的抽象DAO,并将URL调用方式更改为更清晰,更灵活的方式。
我的代码是这样的:
public static String apiDeviceEdit(Device device, HttpSession session,
Long operate) {
String userId = (String) session
.getAttribute(CommonAttributes.API_USERID_SESSION);
String token = (String) session
.getAttribute(CommonAttributes.API_TOKEN_SESSION);
Assert.notNull(userId);
Assert.notNull(token);
String param = "user_id=" + userId + "&device_sn=" + device.getfSn()
+ "&operate=" + operate + "&token=" + token;
String string = sendPost(setting.getApiDeviceEdit(), param,
"DeviceEdit");
return string;
}
不同的刀法:
@Component
@Scope("singleton")
public class ConductorDao extends BaseHBDao <Conductor, Long> {
@Autowired
public ConductorDao (@Qualifier("sessionFactory") SessionFactory session) {
super ();
this.setSessionFactory (session);
}
}
public interface ConductorDao extends BaseDao<Conductor, Long> {
final String SELECT_BY_SN = "from Conductor c where c.sn =:sn";
Conductor findBySn(String sn) throws Exception;
Page<Conductor> findByUserId(Long getfId, Pageable pageable);
}
@Component
@Scope("singleton")
public class ConductorDaoImpl extends BaseDaoImpl<Conductor, Long> implements ConductorDao {
@Override
public Conductor findBySn(String sn) throws Exception {
List<Conductor> conductors = entityManager.createQuery(SELECT_BY_SN).setParameter("sn", sn).getResultList();
if (conductors == null || conductors.size()== 0) {
return new Conductor();
}
else {
return conductors.get(0);
}
}
@Override
public Page<Conductor> findByUserId(Long getfId, Pageable pageable) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Conductor> criteriaQuery = criteriaBuilder.createQuery(Conductor.class);
Root<Conductor> root = criteriaQuery.from(Conductor.class);
criteriaQuery.select(root);
Predicate restrictions = criteriaBuilder.conjunction();
restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("userId"), getfId));
criteriaQuery.where(restrictions);
return super.findPage(criteriaQuery, pageable);
}
}
确定添加第三层抽象,将其称为业务,并从这个新项目中对 dao 层进行所有调用,切断所有直接进入 dao 的调用以使用您的业务层。然后你可以在那个项目中使用你的两个 dao 罐子,这样你就可以将它公开为 rest 或 web 服务,如果你愿意的话。