(本测试项目--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>使用非常简单。
<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三个注解。其他都是无可避免本身就需要做的。
定义一个接口:
public interface UserDao extends P4jDao<User> { }
public class UserDaoImpl extends P4jJdbcDaoSupport<User> implements UserDao { }
有一点需要注意我们的P4jJdbcDaoSupport需要NamedParameterJdbcTemplate资源,你可以像我们P4jJdbcDaoTemplate一样粗暴的手工塞入。不过我们建议借助Spring IoC,把你的UserDaoImpl交给Spring,自动塞入。