210 likes | 322 Views
Yagdao 0.3.1. Yet Another DAO Hibernate Guide. yagdao. http://www.altuure.com/projects/yagdao Mert Can Akkan mcakkan@yahoo.com http://www.altuure.com. overview. Popular Java ORM layer JPA 2.0 Hibernate Spring 3.0+ Support (optional) Lightweight No Implementation Framework
E N D
Yagdao 0.3.1 Yet Another DAO Hibernate Guide
yagdao • http://www.altuure.com/projects/yagdao • Mert Can Akkan • mcakkan@yahoo.com • http://www.altuure.com
overview • Popular Java ORM layer • JPA 2.0 • Hibernate • Spring 3.0+ Support (optional) • Lightweight • No Implementation Framework • No Static Code Generation • Annotation Based • GenericDAO/CRUD operations • Custom operations
dependency-heaven Lightweight framework with minimal dependency
maven dependecy <dependencies> <dependency> <groupId>com.altuure</groupId> <artifactId>com.altuure.yagdao</artifactId> <version>0.3.1</version> </dependency> <dependencies> <!-- repo.altuure.com--> <repositories> <repository> <id>repo.altuure.com</id> <name>repo.altuure.com</name> <url>http://repo.altuure.com</url> <layout>default</layout> </repository> </repositories>
my first yagdao • easy implementation public interface UserDAO extends GenericDAO<User,Long>{ }
quickstart • GenericHibernateDAOFactory userDAO = (UserDAO) GenericHibernateDAOFactory.createInstance(UserDAO.class, sessionAccessor); The GenericHibernateDAOFactory will create instance of given DAO at the runtime
springframework support • package scan feature <yagdao:hibernate id="DAOFactory1" base-package="com.altuure.yagdao.blog.dao" session-factory="mySessionFactory"/> • one by one definition <yagdao:hibernate base-class="com.altuure.yagdao.blog.dao.UserDAO" session-factory="mySessionFactory"/>
GenericDAO • save(Object entity) • update(Object entity) • load(T id) • loadLazy(T id) • delete(Object object) • delete(T id) • vs….
custom methodscreate & update • Get rid of all setter and getter operations public interface UserDAO extends GenericDAO<User,Long>{ @YMethod(type = YMethodType.SAVE) User create( @YParameter("username")String username, @YParameter("password")String password, @YParameter("email")String email); @YMethod(type = YMethodType.UPDATE) User updateRoles(long id, @YParameter("roles")Set roles); }
custom methodsquery • Embeded Query Support @YMethod( type = YMethodType.QUERY, query="select u.username from User u where u.email=:email“ ) String findUsernameByEmailQuery( @YParameter(value = "email")String email); • Named Query Support @YMethod(type = YMethodType.QUERY,queryName="findByEmail") String findUsernameByEmailNamed( @YParameter(value = "email")String email);
custom methodsexecute @YMethod(type = YMethodType.EXECUTE, query="update User set password=:password") intupdateAllPasswords(String newPassword); Tip: All execute methods must return an integer
custom methodsappend • APPEND Method handler is a simple query builder in which you can append query strings with not null parameters @YMethod(type = YMethodType.APPEND, select = "pbyte,count(id)", groupBy = "pbyte", having = "count(id)>10") List<SimpleBean> appendQuery( @YParameter("pint>=?") inti);
custom methods criteria &count(experimental) • Criteria method handler is like append method handler tries to build a query with not null values by parsing query parameters. • Due to incomplete criteria API of hibernate it supports hibernate partially
custom methods criteria @YMethod(type = YMethodType.CRITERIA) SearchResultList<SimpleBean> criteria1(@YParameter(value = "pint", operator = YOperator.GE) Integer arg1); • Custom Paging and order is supported • Selected field and fetch are supported • Grouping and having clauses are not supported
custom methodscount @YMethod(type = YMethodType.COUNT) long count2(@YParameter(value = "pint", operator = YOperator.GE) Integer arg1, @YParameter(value = "pdate", operator = YOperator.LE) Date endDate); Returns only count query result of criteria method To execute both see SearchResultList
smart parameters & return types • YPage: enables order and paging • criteria methods • YLimit: enables only paging • append method • criteria methods • SearchResultList: fetch total size of result list public SearchResultList(List<T> result, long totalCount, YPage paging) { super(result); this.totalCount = totalCount; this.paging = paging; }
paging To add paging to any querying method is easy just add YPage,YLimit as a method parameter @YMethod(type = YMethodType.APPEND,orderBy = "id desc") SearchResultList appendPage1(@YParameter("pbyte>=?") byte arg1,YLimit limit); PS: YLimit is valid in all while YPage is valid on only Criteria Methods
prefetch result size Defining ‘SearchResultList’ as a return type enables a count queires for all methods @YMethod(type = YMethodType.CRITERIA) SearchResultList<SimpleBean> criteria1(@YParameter(value = "pint", operator = YOperator.GE) Integer arg1);
and more • Object based and method based fetch support @YMethod(type = YMethodType.CRITERIA) @YFetch({ "product", "order", "order.customer" }) List<OrderItem> findByCustomerCityAndMaxPrice2(…); • projection support at append methods
thanks For more please see sample application: http://code.google.com/p/yagdao/downloads/list?q=label:Type-Sample maven jetty:run