What is the difference between a crud controller and a DAO? - java

I have received an assigned with some empty skeleton files. Amongst these files there's two interfaces which I can't seem to understand. This one:
/*
* Interface defining abstract CRUD methods for each of your Controllers.
*/
public interface CrudController<T> {
List<T> readAll();
T readyById();
T create();
T update();
int delete();
}
and this one:
/*
* Interface defining abstract CRUD methods for each of your Data Access Objects.
* Implementation of this will involve JDBC.
*/
public interface DAO<T> {
List<T> readAll();
T readById(Long id);
T readLatest();
T create(T t);
T update(T t);
int delete(Long id);
T modelFromResultSet(ResultSet resultSet) throws SQLException;
}
What I don't understand is why there is a need for both of these. The work is supposed to be related to managing a mySql schema using Java. What is the difference between a CrudController and a DAO class, I though both of these were used for Database persistence and reading.

Traditionally the separation exist to separate interactions with the database/persistence and business logic. The difference between the two in this case is the CrudController would handle the business/application logic and the dao would handle the persistence logic. For example, in the scope of a REST application, the controller is receiving the request and calling a implementation of the dao (or a service which calls the dao) to perform database actions.

By implementing the DAO design pattern we separate the part that communicates with the database from the rest of the application.
The DAO pattern defines the CRUD (create,read,update,delete) operations for all the entities. We can completely separate the persistence layer by adding named/native queries. These will be used for the entity itself.
public interface DAO<T,E extends Serializable>{
public T save(T object);
public Boolean delete(T object);
public T update(T object);
public T find(E id);
}
The interface for the DAO defines only the operations specified in the implementation.
So CRUD just an abbreviation but DAO is a design pattern.
LINK

Related

Need to inherit jpa and spanner interfaces to a common interface

// Interface 1:
#Repository
public interface EmpSpannerrepo extends SpannerRepository<Emp,Integer>{
}
// Interface 2:
#Repository
public interface EmpPsqlrepo extends JpaRepository<Emp,Integer>{
}
// Transfering emp details to Psql server and Spanner
public void insertEmpSpannerDetails(List<Emp> emps,int batchSize) throws SQLException, InterruptedException{
common.insert(emps,batchSize,Object);
}
public void insertEmpPsqlDetails(List<Emp> emps,int batchSize) throws SQLException, InterruptedException{
common.insert(emps,batchSize,Object);
}
Need this object to determine at runtime where to push the code either to spanner or PSql
Insert function is exactly same in both cases so rather than writing the same code again , how can i do that with a common code?
// What have i tried?
Tried extending both interfaces to a common one and then using that to save the list , but again it gives me error saying SpannerRepoFactory does not support Query by Example.
Any hints are appreciated.
Any interface that extends Spring Cloud GCP's SpannerRepository will have a concrete instance created for you at runtime. Spring Data JPA will do the same for its interfaces. Since Spring Cloud GCP's Spring Data Spanner implementation is not a JPA implementation, it's not valid for a repository interface to extend both, SpannerRepository and a JPA repository.
In this case, you'll have to write a common layer to invoke correct methods in each repository. By the way, SpannerRepository does not have an insert() method; it has save().

Implementing an existing interface which is having #query annotation

I am implementing an interface in my project(A spring MVC project) which has ten methods. I have implemented two methods and want spring to continue using the interface to query the database unless all of the methods are implemented.
The interface is having #Query annotation and is working fine, but the idea is to implement the method using criteria builder.
My interface
#Repository
public interface TagDAO extends JpaRepository<Tag, Integer> {
#Query("SELECT count(*) from Tag t WHERE t.isActive = true")
public Long getTagCount() throws DataAccessException;
#Query("SELECT t from Tag t WHERE t.tagName = :tagName")
public Tag findByTagName(#Param("tagName") String tagName) throws
DataAccessException;
...........
rest of the methods
}
I have implemented three methods in a class TagDAOImpl but want that the implementation is not to be used in my project unless the implementation is complete. Is there any way to force the use of interface until I complete the implementation?

How to integrate Repository with DDD and Spring

I want to create an app following the DDD approach using Spring. Supose that I have a business model class Foo and an interface FooRepository.
DDD tells that the implementation of FooRepository should include in Infrastructure layer.
I would want to use CrudRepository but if I define in the domain layer:
public interface FooRepository extends CrudRepository<Foo, Long>{
// Some methods
}
I break with the core concept that the domain layer (FooRepository interface) must not know the infrastructure layer (CrudRepository).
I'm reading about this Domain Driven Design a few months ago but I haven't found a framework that supports it purely.
How I can do it the right way?
In the layered architecture you usually have 3 layers: application, domain and infrastructure.
Infrastructure
Here I put the implementation of the repository. In your case this is the implementation of CrudRepository which I would implement directly in concrete classes, without the use of an intermediate interface. We make no whatsoever assumption as to how the single object in the warehouse behave, we only put them there and retrieve them efficiently. This way we have no knowledge of the domain. We only offer the domain an interface to interact with: the set of public methods of WarehouseRepository.
public class WarehouseRepository implements CrudRepository<Foo, Long> {
...
}
Domain
Here various part of the model interact with the WarehouseRepository when you are inside a UnitOfWork/Transaction. In the method adjustQuantityPlus we se only domain logic which is not interesting to the application and need not to be known at infrastructure level.
public class SaleOrder {
public adjustQuantityPlus(LineItemID lineItemID,
WarehouseRepository warehouseRepository) {
this.lineItems.get(lineItemID).addOne(); //<-- add one to the order
Product product =
warehouseRepository.findByLineItem(lineItem);
product.minusOneFromStock(); //<-- decrease one from stock
}
}
Application
Here we start and stop transactions (UOWork) which manipulates many domain objects. Every business method correspond to a business use case.
public class CustomerEventsManager {
#Inject WarehouseRepository warehouseRepository;
#Inject SaleOrderRepository saleOrderRepository;
#Transactional
public wantsOneMoreOf(ProductID productID, SaleOrderID saleOrderID) {
SaleOrder saleOrder =
saleOrderRepository.findByID(saleOrderID)
saleOrder.adjustQuantityPlus(productToLineItem(productID),
warehouseRepository); //<-- add product
webPage.showPromoDiscount(); //<-- show promotional advertisement
}
}
The above code is a transaction, if the system couldn’t add the product to the order I don’t want to give the discount to the customer. The adjustQuantityPlus in turn is an inner “transaction” with domain logic, hidden to the application layer.

DAO design pattern

So lets say we have a couple of entities we want to persist using DAO objects. So we implement the right interface so we end up with
class JdbcUserDao implements UserDao{
//...
}
class JdbcAddressDao implements AddressDao{
//...
}
So if I want to be able to switch persistance implementations from JDBC to JPA (for example) and vice versa, I'd need to have JPAUserDao and JPAAddressDao... Meaning if I had 20 entities, and decided to switch implementations(using DI container), I'd have to switch every Jdbc implementation with JPA in code.
Now it could be that I misunderstood how DAO works, but... If I just had
class JdbcDaoImpl implements UserDao,AddressDao{
//...
}
I'd then have all the JDBC implementations in one class, and switching implementations would be a piece of cake. Also, DaoImpl count is equal to number of Dao interfaces. Why not just group them by implementation (jdbc, JTA, JPA...) and have everything under one class?
Thanks in advance.
Having a single class implement every DAO interface in your entire application would be a rather bad design.
A more typical pattern is to have a BaseDAO interface (also often called GenericDAO) and have a JPABaseDAO, JDBCBaseDAO etc. These base classes will contain methods like find/get/read, save/store/persist, update/modify and delete/remove/purge.
Specific DAO interfaces like UserDAO then inherit from BaseDAO and concrete implementations like JPAUserDAO extends from JPABaseDAO.
A BaseDAO interface could look like this:
public interface BaseDAO <T> {
T getByID(Long ID);
T save(T type);
T update(T type);
void delete(T type);
}
And a UserDAO interface:
public interface UserDAO extends BaseDAO<User> {
List<User> getAllAuthorized();
}
Bare bones example of a JPABaseDAO implementing this interface:
#Stateless
public class JPABaseDAO<T> implements BaseDAO<T> {
#PersistenceContext
private EntityManager entityManager;
private final Class<T> entityType;
#SuppressWarnings("unchecked")
public JPABaseDAO() {
this.entityType = ((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}
#Override
public T getByID(Long ID) {
return entityManager.find(entityType, ID);
}
#Override
public T save(T type) {
return entityManager.persist(type);
}
#Override
public T update(T type) {
return entityManager.merge(type);
}
#Override
public void delete(T type) {
entityManager.remove(entityManager.contains(type) ? type : entityManager.merge(type));
}
}
And some sample UserDAO implementation that would inherit from it:
#Stateless
public class JPAUserDAO extends JPABaseDAO<User> implements UserDAO {
#PersistenceContext
private EntityManager entityManager;
#Override
public List<User> getAllAuthorized() {
return entityManager.createNamedQuery("User.getAllAuthorized", User.class)
.getResultList();
}
}
In practice the base class can often do some other things transparently, for instance checking if an entity implements some kind of Auditable interface, and automatically setting the date and user that modified it, etc.
When using EJB to implement your DAOs, one strategy to change implementations would be to put all JDBC implementations in one package and all JPA implementations in the other. Then just include only one implementation package in your build.
The whole point of Dependency Injection is to make switching between implementation easier and to decouple the user from the provider. Hence all DI frameworks provide some way to "group" several implementations (here your JDBC-group and your JPA-group) and switch them in one place.
Also: Usually the number of consumers (in your case: some business logic working on users and addresses) is usually higher than the number of DAOs the DI framework will uncouple most of the stuff for you anyway. Assume: 50 business beans, two interfaces and two implementations for each interface (4 total): even basic DI will take care for the 50. Using grouping will halve that remaining rest for you.
There are definitely possibilities to implement the DAO pattern in a widely technology agnostic way such that switching persistence technology or even mixing multiple technologies becomes feasible. This article presents one implementation scheme including source code on github.
http://codeblock.engio.net/?p=180

Spring-Hibernate DAO naming convention?

Is it typical to name DAOs in the following way:
UserDAO - interface
UserDAOImpl - implements UserDAO
I am wondering if its standard to use the suffix 'Impl' for the implementation or if something more meaningful is the best practice. Thanks.
That is generally what I use. Sometimes the Default prefix like DefaultUserDAO might make more sense if you're creating an interface that you expect others to implement but you're providing the reference implementation.
Most of the time I feel those two can be used interchangeably but in some situations one provides a little more clarity than the other.
There are two conventions that I've seen:
FooDao for the interface and FooDaoImpl for the implementation
IFooDao for the interface and FooDao for the implementation
The former has its roots in CORBA; the latter is a Microsoft COM/.NET convention. (Thanks to Pascal for the correction.)
"Don't Repeat the DAO" is a fine idea. I personally think that article is more complex than it needs to be. There's a way to do it without reflection in finders that I happen to prefer. If you use Hibernate, query by example can be a great way to do it simply. The interface would look more like this:
package persistence;
import java.io.Serializable;
import java.util.List;
public interface GenericDao<T, K extends Serializable>
{
T find(K id);
List<T> find();
List<T> find(T example);
List<T> find(String queryName, String [] paramNames, Object [] bindValues);
K save(T instance);
void update(T instance);
void delete(T instance);
}
First of all - you may not really need a DAO class for each of your classes. Don't repeat the DAO! article explains what is a generic DAO. Wondering how to name boilerplate code is not productive.
Now, when you have a generic DAO, you could go for:
DAO (interface)
SessionDAO and EntityManagerDAO - for using either Session or EntityManager
And, of course, use the DAO only by interface. You can easily switch between implementations.
(I actually prefer it lowercased - Dao, although it's an abbreviation; and the Impl suffix)
I've been also fan of the GenericDao and GenericDaoImpl -convention with some support from generic helper classes, should the save or delete require extra actions for some persistent classes:
public interface PersistListener<T> {
void onPersist(T item);
}
Similar constructs can be used also for deletion. This is especially useful if you need some kind of event log to write each activity to and you don't want to use AOP for that.
My GenericDaoImpl would look something like this:
public class GenericDaoImpl<T> extends HibernateTemplate {
public void setPersistListeners(List<PersistListener> listeners) {
this.persistListeners = new GenericInterfaceHandler( listeners,
PersistListener.class );
}
// hibernate updates the key to the object itself
public T save(T item) {
getSession().save( item );
List<PersistListener<T>> listeners = this.persistListeners.getAll( item );
for ( PersistListener<T> listener : listeners )
listener.persist( item );
}
// ...
}
What the persistListener in the above example will do is to find a PersistListener with generic class matching to that of the class given as a parameter. It such is found, then call is delegated to the proper listener(s). My GenericInterfaceHandler also can be used to return only most specific handler or only handler for the given class if present.
If you are interested, I could also post the GenericInterfaceHandler implementation as it's quite powerful construct on many occasions.

Categories