《partner4java 讲述 p4jorm》之第三步:hibernate、jpa的使用

(本测试项目--Helloworld下载地址: http://download.csdn.net/detail/partner4java/5045151 http://download.csdn.net/detail/partner4java/5045975为了减少刷屏,一些比如POJO的get和set方法就省略了,具体查看下载包)

相对于 p4jorm 对 JDBC的支持,hibernate和jpa的亮点在于formbean封装部分。

我们接下来将学习两部分:

1、省略Hibernate的dao或service代码。(能够做到大部分基本CURD,一行dao或service代码都不写)

2、简化HQL的封装。虽然我们使用ORM框架不需要书写SQL语句,但是HQL的查询条件等还是需要手工拼写,这里我们将帮您省去。

我们接下来不会像上一篇“《partner4java 讲述 p4jorm》之第二步:jdbc的使用 ”讲述细致,因为会hibernate的同学想必对spring也有了解,若真心不会spring,请查看:http://blog.csdn.net/partner4java/article/details/8194747

假设我们现在的hibernate实体、映射文件、spring配置文件等都已经完成(具体请查看附件测试项目):

entity -- Contact:

public class Contact implements Serializable {
	private static final long serialVersionUID = -5446015810608365114L;
	private Long contactId;
	// ------基本联系方式
	/** 真实的名字、公司名称、合作社名称、政府单位名称 */
	private String realName;
	/** 所在地区 */
	// private Area area;
	/** 详细地址 */
	private String address;
	/** 手机号 */
	private String phoneNumber;
	/** 座机号 */
	private String planeNumber;
	/** 传真号 */
	private String faxNo;
	private String qq;
	private String msn;
上面的entity已经伴随hibernate实体映射时创建,我们接下来就要实现dao:

首先dao接口,我们提供了父类接口P4jDao,所以ContactDao只需要继承:(具体请查看附件文档,后面我们就省略提醒,本文不会对提供的类或注解做过多说明,请动起手来看我提供的文档)

//继承P4jDao接口,传入实体泛型参数
public interface ContactDao extends P4jDao<Contact> {

}
实现我们提供了 P4jHibernateDaoSupport,这里ContactDaoImpl实现ContactDao也只需要额外继承P4jHibernateDaoSupport:

//实现了我们刚才定义的ContactDao接口,但是具体实现我们没有做,由P4jHibernateDaoSupport父类实现
@Service("contactDao")
public class ContactDaoImpl extends P4jHibernateDaoSupport<Contact> implements ContactDao {

}
是不是,dao的接口和实现我们一行代码也没写啊?请问,没写可以CURD么?

我们做下单元测试:

public class ContactDaoImplTest {
	private ContactDao contactDao;

	@Before
	public void setUp() throws Exception {
		// 我们这里可以借助spring继承的test工程,这里不在使用,请参考
		// http://blog.csdn.net/partner4java/article/details/7020300
		// http://blog.csdn.net/partner4java/article/details/7020483
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				"/META-INF/spring/beans.xml");
		contactDao = (ContactDao) applicationContext.getBean("contactDao");
	}

	// 首先来我们进行1000次的插入(说实话执行起来比我们上一篇的JDBC慢太多了)
	@Test
	public void testSave() {
		for (int i = 0; i < 1000; i++) {
			Contact contact = new Contact();
			contact.setRealName("partner4java");
			contact.setAddress("hello" + i);

			// 我们虽然没有书写save方法,但是底层接口已经定义,P4jHibernateDaoSupport进行了实现
			contactDao.save(contact);
		}
	}

	// 删除某条数据,你可能疑惑,你也没告诉他是哪个实体,他如何删除的?别让了继承的时候我们传入了entity的类型“<Contact>”
	@Test
	public void testDeleteSerializableArray() {
		contactDao.delete(2L);
	}

	// 获取一条数据,也是只需传入主键id
	@Test
	public void testFind() {
		System.out.println(contactDao.get(1L));
	}

	// 更新
	@Test
	public void testUpdate() {
		Contact contact = new Contact();
		// 指定主键
		contact.setContactId(1L);
		contact.setAddress("hello 北京");
		contactDao.update(contact);
	}
通过单元测试,我们很容易的掌握和验证了p4jorm的简答易用。

接下来,让您见识一下简化HQL封装:

查询数据:

每次你点击form表单的查询提交后,是否心里暗想,我都已经把数据给你了,你为什么不自动给我返回我想要的数据呢?为什么还需要我费劲的去拼写查询SQL呢?

好吧,我帮你实现,而且不对你奢求太多工作:

如果你使用了struts类似框架,你一定有一层叫formbean,你只需要在formbean为几个需要参与查询字段加上注解就可以了(额外让你劳苦了几秒钟)。

(首先说明一点哈,form的提交到formbean中的数据封装,这是MVC框架的工作,我不会帮你做)

我们这里没有使用MVC框架,直接使用了Servlet:com.partner4java.jdbctest.web.UserListServlet(这个不是我们的重点就不贴出来了,自己去看附件)

我们定义了formbean:

public class ContactFormBean implements Serializable {
	private static final long serialVersionUID = 4358513464951563450L;

	private String realName;
	private String qq;
	private String address;
有了formbean我们还是加俩注解:

P4jQueryForm(标注于类上,表明本类的字段赋值会用于查询拼写,必须指定本注解)、P4jGeneral(用于声明某字段为普通查询,如等值查询)、P4jLike(用于声明某字段为like模糊查询)具体查看附件文档

/**
 * 你会发现和我的Contact类很相似,通常情况下formbean会比entity少很多字段,或者多一些时间字段,这不是我们这里的重点,就不多解释了
 * 
 * @author partner4java
 * 
 */
@P4jQueryForm
public class ContactFormBean implements Serializable {
	private static final long serialVersionUID = 4358513464951563450L;

	// 表示我们会查找名字为此的数据
	@P4jGeneral(generalQueryType = GeneralQueryType.EQ)
	private String realName;
	// 我没有任何注解,不会参与查询
	private String qq;

	// 表示我们会根据地址模糊查询
	@P4jLike
	private String address;
接下来就是我们的Servlet(和往常一样)这里就不贴出来了:

		//你会发现,你至始至终没有进行HQL封装,只是传入了formbean,我就给你返回了结果列表
		PageData<Contact> pageData = contactDao.query(formBean, new PageIndex(new Integer(currentPage)), null);
jsp和普通的界面一样,我又给大家封装了一个分页:

[html]  view plain copy
  1. <input type="hidden" name="currentPage" value="${pageData.pageIndex.currentPage }"/>  
  2. <div class="pager">  
  3.         <c:if test="${pageData.pageIndex.currentPage > 1 }">  
  4.                 <a class="prv" href="javascript:topage('${pageData.pageIndex.currentPage - 1 }')"><span>上一页</span></a>  
  5.         </c:if>  
  6.         <c:forEach begin="${pageData.pageIndex.startPage }" end="${pageData.pageIndex.endPage }" varStatus="varStatus">  
  7.             <c:if test="${pageData.pageIndex.currentPage == (pageData.pageIndex.startPage + varStatus.count - 1) }">  
  8.                 <strong><span>${pageData.pageIndex.startPage + varStatus.count - 1} </span></strong>  
  9.             </c:if>  
  10.             <c:if test="${pageData.pageIndex.currentPage != (pageData.pageIndex.startPage + varStatus.count - 1) }">  
  11.                 <a href="javascript:topage('${pageData.pageIndex.startPage + varStatus.count - 1 }') "><span>${pageData.pageIndex.startPage + varStatus.count - 1} </span></a>  
  12.             </c:if>  
  13.         </c:forEach>  
  14.         <c:if test="${pageData.pageIndex.currentPage <  pageData.totalCount/pageData.pageIndex.maxResult}">  
  15.             <a class="next" href="javascript:topage('${pageData.pageIndex.currentPage + 1}') "><span>下一页</span></a>  
  16.         </c:if>  
  17. </div>  
使用非常简单。
jsp方面,我们只需要完成一个类似于users.jsp:

[html]  view plain copy
  1.     <form action="userlist" method="post">  
  2.       用户名:<input type="text" name="username" value="${username }"/><br/>  
  3.       地址:<input type="text" name="address" value="${address }"/>  
  4.       <input type="submit" value="查询"/><br/>  
  5.   <c:forEach items="${pageData.resultlist }" var="user">  
  6.     ${user.username } -- ${user.password } -- ${user.address } <br/>  
  7.   </c:forEach>  
  8.     
  9.   <%@ include file="fenye.jsp"%>  
  10.     
  11. </form>    
到目前为止我们已经完成了CURD操作,回想一下,我都额外需要你做什么?至始至终只给formbean添加三个注解,你就摆脱了CURD的书写,连HQL都不需要自己拼写。

你可能感兴趣的:(《partner4java 讲述 p4jorm》之第三步:hibernate、jpa的使用)