《partner4java 讲述 p4jorm》之第二步:jdbc的使用

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

传统JDBC:当您进行增删改查时是不是拼写SQL到都想吐了?好不容易拼写完,想获取结果,还要再遍历封装,遇到一个字段上百的遗留表简直就疯了。

p4jorm:当使用p4jorm时,普通的CURD,也就是占据我们大部分工作的CURD就不需要再书写(真的是一行都不用写);当前端查询时我们只需要把相应数据放入formbean就可以了(如果你使用struts之类的框架formbean数据封装工作也不需要自己完成);你再多的字段也不用担心;更不会再因为忘了关闭数据库连接而被老大k了。

下面进入我们三十分钟学习时间:

(以MySQL数据库进行展示,目前也只支持了MySQL,如需要支持其他数据库,请邮件告知,会尽量添加)

首先创建一个web项目,如果你使用maven的话,请把压缩包的maven目录放入你本机(因为没有发布到公服),且加入maven依赖

		<dependency>
			<groupId>partner4java</groupId>
			<artifactId>p4jorm</artifactId>
			<version>1.0.0</version>
			<exclusions>
				<exclusion>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

 
如果没有使用maven,本架构的jar为p4jorm-1.0.0.jar,还需要依赖其他jar,你直接考入helloworld项目所有jar(p4jorm_jdbc_test\WebRoot\WEB-INF\lib)即可。

第一步:创建表

就和你平时一样创建表就ok了。

我们这里简单创建了一个user表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  `address` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
第二步:创建表对应的实体

换句话说,创建表数据的携带对象,这个也是我们平时所需要的。(你从数据库中取出了数据总要有地方存吧,总不能放到Map里吧?亲,我们可是面向对象啊)

public class User implements Serializable {
	private static final long serialVersionUID = -8804762279661495240L;
	private int id;
	private String username;
	private String password;
	private String address;
...

你也可以借助工具通过已创建的表,自动生成实体,详细查看文章

http://blog.csdn.net/partner4java/article/details/8560289

(我们这里是不需要JPA之类的注解,生成后,你需要删除)

第三步:添加实体注解

因为我需要对实体进行识别分析,这里您一般只需要添加两个注解

P4jEntity标注于类上、P4jId标注于对应的主键字段上

(具体注解详解,请参照附件文档doc/index.html,后面我们就不再说“请参照文档”之类的客套话,有不明白的,你第一时间就去找文档即可,文档中若解释不清晰,请邮件我)

@P4jEntity
public class User implements Serializable {
	private static final long serialVersionUID = -8804762279661495240L;
	@P4jId
	private int id;
	private String username;
	private String password;
	private String address;
我们说过p4jorm只需要两个注解就齐活了,也就是说现在你就可以对user表进行增删改查操作了。

第四步:整理测试环境书写测试用例

环境:

我们在第一步文章中提到过,p4jorm目前版本需要借助spring,如果对spring ioc不是很熟悉的同学,可参照文章

http://blog.csdn.net/partner4java/article/details/8194747

若当前spring并不在你的学习范围内,也不用担心,你只需要把我提供的配置文件拷入相应的目录即可

p4jorm_jdbc_test\src\main\resources中有三个文件:

datasource-c3p0.xml、beans.xml

jdbc-c3p0.properties:你只需要关心这个,这里配置了你的数据库连接信息

(由于我们这里使用了c3p0,那么相应的jar也需要加入)

单元测试:

我们目前使用第一个工具类 --P4jJdbcDaoTemplate

public class UserTest {
	private P4jJdbcDaoTemplate daoTemplate;

	// setUp方法其实就是为我们创建了一个P4jJdbcDaoTemplate,具体参照文档中P4jJdbcDaoTemplate说明
	@Before
	public void setUp() throws Exception {
		// 这里为spring的容器创建
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/META-INF/spring/beans.xml");
		// 创建了daoTemplate,并传入了namedParameterJdbcTemplate
		daoTemplate = new P4jJdbcDaoTemplate(applicationContext.getBean("namedParameterJdbcTemplate",
				NamedParameterJdbcTemplate.class));
	}

	// 我们进行第一个保存测试
	@Test
	public void testSave() {
		for (int i = 0; i < 1000; i++) {
			// 创建一个user实体,往里赛数据
			User user = new User();
			user.setPassword("123456" + i);
			user.setUsername("partner4java" + i);
			user.setAddress("[email protected]");

			// 我们就只需要这一句话就可以保存user进数据库了
			daoTemplate.save(user);
		}
	}

}
一千条保存,当你看到数据表中新增的数据,是否心里暗暗欢喜

	// 更新的数据,需要说明一点的是,我们只会更新指定id的数据,且不更新值为null的数据,你可以置空字符
	@Test
	public void testUpdate() {
		User user = new User();
		user.setPassword("");
		user.setUsername("world");

		// 设置id,表示需要更新的数据
		user.setId(1);

		daoTemplate.update(user);
	}
	
	@Test
	public void testDelete(){
		daoTemplate.delete(User.class, 1);
	}
更新和删除也是如此简单。
关于实体,我们还有两个注解:

P4jTransient 用于指定该字段和数据库没关系、P4jColumn对字段的映射进行特殊指定(因为我们是根据实体成员字段的名称对应数据库字段名称,若两者不相同,就需要该注解)。

查询数据:

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

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

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

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

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

我们定义了formbean:

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

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

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

@P4jQueryForm
public class UserFormBean implements Serializable {
	private static final long serialVersionUID = 4358513464951563450L;

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

	// 表示我们会根据地址模糊查询
	@P4jLike
	private String address;
在我们没有写任何dao和service的情况下,就可以直接完成显示层:

/**
 * 我们这里简单示例,直接使用了Servlet,如果你使用MVC框架,UserFormbean的获取会自动进行
 * 
 * @author partner4java
 * 
 */
public class UserListServlet extends HttpServlet {
	private static final long serialVersionUID = -5372697351493999670L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
			IOException {
		UserFormBean formBean = getUserForm(request);

		String currentPage = getCurrentPage(request);

		// 这里只给你要了要返回的类型,formbean,当前页,返回类型连强转都不用,不过分吧?
		PageData<User> users = P4jJdbcDaoTemplateSingleton.getJdbcDaoTemplate().query(User.class, formBean,
				new PageIndex(new Integer(currentPage)), null);
		request.setAttribute("users", users);

		request.getRequestDispatcher("/WEB-INF/page/users.jsp");
	}
jsp和普通的界面一样,我又给大家封装了一个分页:

<input type="hidden" name="currentPage" value="${pageData.pageIndex.currentPage }"/>
<div class="pager">
		<c:if test="${pageData.pageIndex.currentPage > 1 }">
				<a class="prv" href="javascript:topage('${pageData.pageIndex.currentPage - 1 }')"><span>上一页</span></a>
	    </c:if>
		<c:forEach begin="${pageData.pageIndex.startPage }" end="${pageData.pageIndex.endPage }" varStatus="varStatus">
			<c:if test="${pageData.pageIndex.currentPage == (pageData.pageIndex.startPage + varStatus.count - 1) }">
				<strong><span>${pageData.pageIndex.startPage + varStatus.count - 1} </span></strong>
			</c:if>
			<c:if test="${pageData.pageIndex.currentPage != (pageData.pageIndex.startPage + varStatus.count - 1) }">
				<a href="javascript:topage('${pageData.pageIndex.startPage + varStatus.count - 1 }') "><span>${pageData.pageIndex.startPage + varStatus.count - 1} </span></a>
			</c:if>
		</c:forEach>
		<c:if test="${pageData.pageIndex.currentPage <  pageData.totalCount/pageData.pageIndex.maxResult}">
			<a class="next" href="javascript:topage('${pageData.pageIndex.currentPage + 1}') "><span>下一页</span></a>
		</c:if>
</div>
使用非常简单。
jsp方面,我们只需要完成一个类似于users.jsp:

  	<form action="userlist" method="post">
  	  用户名:<input type="text" name="username" value="${username }"/><br/>
  	  地址:<input type="text" name="address" value="${address }"/>
  	  <input type="submit" value="查询"/><br/>
	  <c:forEach items="${pageData.resultlist }" var="user">
	  	${user.username } -- ${user.password } -- ${user.address } <br/>
	  </c:forEach>
	  
	  <%@ include file="fenye.jsp"%>
	  
	</form>  
到目前为止我们已经完成了CURD操作,回想一下,都需要你做什么?entity两个注解,formbean三个注解。其他都是无可避免本身就需要做的。
如果上面通用的CURD已经无法满足你的需求时,你可以借助P4jJpaDaoSupport,用法如:

定义一个接口:

public interface UserDao extends P4jDao<User> {

}

public class UserDaoImpl extends P4jJdbcDaoSupport<User> implements UserDao {

}

 
如果你需要额外的方法,在你自己的UserDao接口中完成,在UserDaoImpl类中实现即可。(如果通过继承,你会发现,当你再继续进行CURD操作时,可以省略传入实体类型,因为在继承时父类要求传入了实体类型) 

有一点需要注意我们的P4jJdbcDaoSupport需要NamedParameterJdbcTemplate资源,你可以像我们P4jJdbcDaoTemplate一样粗暴的手工塞入。不过我们建议借助Spring IoC,把你的UserDaoImpl交给Spring,自动塞入。

你可能感兴趣的:(java)