(三)play之yabe项目【数据模型】
创建项目
play new yabe
What is the application name? [yabe] Blog Engine
play eclipsify yabe
play run yabe
Eclipse引入项目
file -> import -> General ->Existing Projects into Workspaces -> select root directory ...
设置数据库
选择一个内存数据库
打开yabe/conf/application.conf,去掉下面这行的注释
db=mem #使用内存数据库,使用HSQL
【hsql 数据库是一款纯Java编写的免费数据库,体积小,才563kb。仅一个hsqldb.jar文件就包括了数据库引擎,数据库驱动,还有其他用户界面操作等内容。纯Java设计,又支持 SQL99,SQL2003大部分的标准】
************************************************************************************************************
增加模型User
- package models;
- import javax.persistence.Entity;
- import play.db.jpa.Model;
- @Entity
- public class User extends Model {
- public String email;
- public String password;
- public String fullname;
- public boolean isAdmin;
- public User(String email,String password, String fullname) {
- this.email = email;
- this.password = password;
- this.fullname = fullname;
- }
- }
使用JUNIT进行单元测试
打开命令行,切换到测试模式
play test yabe
play提供了默认的测试文件,打开yabe\test\BasicTest.java
删除aVeryImportantThingToTest,新建一个测试
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- }
打开http://localhost:9000/@tests
运行BasicTest,即上面写的测试单元,点击Start ! 进行测试
结果应该为绿色!
接下来测试User的email和password是否正确的方法
通过email和password两个条件来找到User对象
打开User.java,添加connect():
- package models;
- import javax.persistence.Entity;
- import play.db.jpa.Model;
- @Entity
- public class User extends Model {
- public String email;
- public String password;
- public String fullname;
- public boolean isAdmin;
- public User(String email,String password, String fullname) {
- this.email = email;
- this.password = password;
- this.fullname = fullname;
- }
- /**
- * 联合email和password两个条件查询User
- * @param email
- * @param password
- * @return
- */
- public static User connect(String email, String password) {
- return find("byEmailAndPassword", email, password).first();
- }
- }
在BasicTest.java里添加测试方法
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- /**
- * 测试用户的创建和查找
- */
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- /**
- * 测试联合条件查询
- */
- @Test
- public void tryConnectUser() {
- //Create a user and save it
- new User("zs@1.com", "123", "zhangsan").save();
- //Test
- assertNotNull(User.connect("zs@1.com", "123"));
- assertNull(User.connect("zs@1.com", "234"));
- assertNull(User.connect("zs@2.com", "234"));
- }
- }
测试BasicTest项,应该全部通过!
增加模型Post
Post类作为博客的实体类,与User之间为多对一的关系
- package models;
- import java.util.Date;
- import javax.persistence.Entity;
- import javax.persistence.Lob;
- import javax.persistence.ManyToOne;
- import play.db.jpa.Model;
- @Entity
- public class Post extends Model {
- public String title;
- public Date postedAt;
- //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容
- @Lob
- public String content;
- //@ManyToOne:声明Post与User之间是多对一的关系
- //一个用户可以发布多个博客,一个博客只能被一个用户所发布
- @ManyToOne
- public User author;
- public Post(String title, String content, User author) {
- this.title = title;
- this.content = content;
- this.author = author;
- this.postedAt = new Date();
- }
- }
对Post类进行测试
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- /**
- * 清空数据库中的数据,释放内存空间
- * Fixtures帮助在测试期间管理数据库
- */
- @Before
- public void setup() {
- Fixtures.deleteDatabase();
- }
- /**
- * 测试用户的创建和查找
- */
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- /**
- * 测试联合条件查询
- */
- @Test
- public void tryConnectUser() {
- //Create a user and save it
- new User("zs@1.com", "123", "zhangsan").save();
- //Test
- assertNotNull(User.connect("zs@1.com", "123"));
- assertNull(User.connect("zs@1.com", "234"));
- assertNull(User.connect("zs@2.com", "234"));
- }
- /**
- * 测试Post类
- */
- @Test
- public void createPost() {
- //Create a User and save it
- User Mike = new User("ls@1.com", "111", "Mike").save();
- //Create 2 Post
- new Post("First Blog", "first", Mike).save();
- new Post("Second Blog", "second", Mike).save();
- //测试是否成功创建了2个Post对象
- assertEquals(2, Post.count());
- //获取lisi发布的所有博客
- List<Post> posts = Post.find("byAuthor", Mike).fetch();
- assertEquals(2, posts.size());
- assertNotNull(posts.get(0));
- assertNotNull(posts.get(1));
- assertEquals(Mike, posts.get(0).author);
- assertEquals("First Blog", posts.get(0).title);
- assertEquals("second", posts.get(1).content);
- assertNotNull(posts.get(1).postedAt);
- }
- }
增加模型Comment
Comment 与 Post 之间为多对一的关系,多条评论对应一篇博客
- package models;
- import java.util.Date;
- import javax.persistence.Entity;
- import javax.persistence.Lob;
- import javax.persistence.ManyToOne;
- import play.db.jpa.Model;
- @Entity
- public class Comment extends Model {
- public String author;
- public Date postedAt;
- @Lob
- public String content;
- //一篇博客对应多条评论,一个评论属于一篇博客
- //评论与博客的关系:多对一
- @ManyToOne
- public Post post;
- public Comment(String author, String content, Post post) {
- super();
- this.author = author;
- this.content = content;
- this.post = post;
- this.postedAt = new Date();
- }
- }
修改模型Post,增加Comment属性
注:上面的User类也可以持有一个关于Post的集合,方法与此类似。
- package models;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import javax.persistence.CascadeType;
- import javax.persistence.Entity;
- import javax.persistence.Lob;
- import javax.persistence.ManyToOne;
- import javax.persistence.OneToMany;
- import play.db.jpa.Model;
- @Entity
- public class Post extends Model {
- public String title;
- public Date postedAt;
- //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容
- @Lob
- public String content;
- //@ManyToOne:声明Post与User之间是多对一的关系
- //一个用户可以发布多个博客,一个博客只能被一个用户所发布
- @ManyToOne
- public User author;
- //1篇博客对应多个评论
- //删除某篇博客,则级联删除其评论
- @OneToMany(mappedBy="post", cascade=CascadeType.ALL)
- public List<Comment> comments;
- public Post(String title, String content, User author) {
- this.comments = new ArrayList<Comment>(0);
- this.title = title;
- this.content = content;
- this.author = author;
- this.postedAt = new Date();
- }
- /**
- * 在Post中实现评论的添加保存操作
- * 同时更新Post所持有的Comment的集合!
- */
- public Post addComment(String author, String content) {
- //保存对方
- Comment newComment = new Comment(author, content, this).save();
- //把对方加入到自己管理的集合中
- this.comments.add(newComment);
- //同步到数据库
- this.save();
- return this;
- }
- }
所有的测试代码
- import org.junit.*;
- import java.util.*;
- import play.test.*;
- import models.*;
- /**
- * 测试单元 extends UnitTest
- * @author lenovo
- *
- */
- public class BasicTest extends UnitTest {
- /**
- * 清空数据库中的数据,释放内存空间
- * Fixtures帮助在测试期间管理数据库
- */
- @Before
- public void setup() {
- Fixtures.deleteDatabase();
- }
- /**
- * 测试用户的创建和查找
- */
- @Test
- public void createAndRetriveUser() {
- //Create a User and save
- new User("zs@162.com","******","ZS").save();
- //retrieve User by emial
- User user1 = User.find("email", "zs@162.com").first();
- //两种写法都可以 匹配email="zs@162.com"的User对象
- User user2 = User.find("byEmail", "zs@162.com").first();
- assertNotNull(user1);
- assertNotNull(user2);
- assertEquals(user1, user2);
- assertEquals("ZS", user1.fullname);
- assertEquals("ZS", user2.fullname);
- }
- /**
- * 测试联合条件查询
- */
- @Test
- public void tryConnectUser() {
- //Create a user and save it
- new User("zs@1.com", "123", "zhangsan").save();
- //Test
- assertNotNull(User.connect("zs@1.com", "123"));
- assertNull(User.connect("zs@1.com", "234"));
- assertNull(User.connect("zs@2.com", "234"));
- }
- /**
- * 测试Post类
- */
- @Test
- public void createPost() {
- //Create a User and save it
- User Mike = new User("ls@1.com", "111", "Mike").save();
- //Create 2 Post
- new Post("First Blog", "first", Mike).save();
- new Post("Second Blog", "second", Mike).save();
- //测试是否成功创建了2个Post对象
- assertEquals(2, Post.count());
- //获取lisi发布的所有博客
- List<Post> posts = Post.find("byAuthor", Mike).fetch();
- assertEquals(2, posts.size());
- assertNotNull(posts.get(0));
- assertNotNull(posts.get(1));
- assertEquals(Mike, posts.get(0).author);
- assertEquals("First Blog", posts.get(0).title);
- assertEquals("second", posts.get(1).content);
- assertNotNull(posts.get(1).postedAt);
- }
- /**
- * 测试Post与User的多对一关系
- */
- @Test
- public void testPost2User() {
- User Mike = new User("ls@1.com", "111", "Mike").save();
- Mike.addPost("First Blog", "first");
- Mike.addPost("Second Blog", "second");
- assertNotNull(Mike);
- assertEquals(2, Post.count());
- //从新查询User
- Mike = User.connect("ls@1.com", "111");
- //直接从User中获取Post的集合
- assertEquals(2, Mike.posts.size());
- assertEquals("first", Mike.posts.get(0).content);
- assertEquals("second", Mike.posts.get(1).content);
- }
- /**
- * 测试Comment类
- * 单向,由Comment得到Post
- */
- @Test
- public void testComment() {
- User Mike = new User("ls@1.com", "111", "Mike").save();
- Post post = new Post("First Blog", "first", Mike).save();
- new Comment("jeff", "nice post", post).save();
- new Comment("henrry", "good post", post).save();
- //获取博客的所有评论
- List<Comment> comments = Comment.find("byPost", post).fetch();
- assertEquals(2, comments.size());
- Comment firstComment = comments.get(0);
- assertNotNull(firstComment);
- assertEquals("jeff", firstComment.author);
- assertEquals("nice post", firstComment.content);
- assertNotNull(firstComment.postedAt);
- Comment secondComment = comments.get(1);
- assertNotNull(secondComment);
- assertEquals("henrry", secondComment.author);
- assertEquals("good post", secondComment.content);
- assertNotNull(firstComment.postedAt);
- }
- /**
- * 测试Comment与Post的多对一关系
- * 双向,由Post直接得到与此关联的Comment集合
- */
- @Test
- public void testComment2PostRelation() {
- //User
- User bob = new User("bob@123.com","111","Bob well").save();
- //Post
- Post post = new Post("First post","hello kelly",bob).save();
- //Comment
- post.addComment("jeff", "Nice Post!");
- post.addComment("Tom", "I knew that!");
- assertEquals(1, User.count());
- assertEquals(1, Post.count());
- assertEquals(2, Comment.count());
- //Retrieve Bob's post
- post = Post.find("byAuthor", bob).first();
- assertNotNull(post);
- //Navigation to comments
- assertEquals(2, post.comments.size());
- assertEquals("jeff", post.comments.get(0).author);
- //delete Post
- post.delete();
- //check that all commonts have been deleted
- assertEquals(1, User.count());
- assertEquals(0, Post.count());
- assertEquals(0, Comment.count());
- }
- }
(三)play之yabe项目【数据模型】的更多相关文章
- (九)play之yabe项目【发表博文】
(九)play之yabe项目[发表博文] 博客分类: 框架@play framework 发表一篇博文 填充管理页面 从主页链接到管理页面时,只简单显示了登陆用户的名称 现在对显示的内容加以丰富 ...
- Maven学习总结(三)——使用Maven构建项目
maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Java项目 1.1.创建Java Project 1.使用mvn archet ...
- (四)play之yabe项目【页面】
(四)play之yabe项目[页面] 博客分类: 框架@play framework 主页面 显示当前发表博客的完整内容,以及历史博客列表 Bootstrap Job 一个play job任务就是 ...
- (六)play之yabe项目【验证码】
(六)play之yabe项目[验证码] 博客分类: 框架@play framework 添加验证码功能 在Application.java中添加一个action:captcha() /** * 添 ...
- (八)play之yabe项目【身份验证】
(八)play之yabe项目[身份验证] 博客分类: 框架@play framework 添加身份验证 play提供了一个模块-Secure(安全模块),用来做身份验证 允许Secure模块 修改 ...
- (七)play之yabe项目【CRUD】
(七)play之yabe项目[CRUD] 博客分类: 框架@play framework 增加CRUD功能 使用CRUD能干嘛?----> 在页面对模型进行增删改查操作,这样有什么实际意义 ...
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 【转】第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
原文网址:http://www.cnblogs.com/smyhvae/p/4456420.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...
- 转】Maven学习总结(三)——使用Maven构建项目
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4240930.html 感谢! maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使 ...
随机推荐
- Adobe flash player更新失败
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...
- Ciel and Robot
C. Ciel and Robot time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- 开发一款高端大气上档次的android应用需要必备的知识——记于2013年末
Android入门还是很简单的,看两本书,翻阅几篇文章,搭建了开发环境就算入门了.可是怎样开发一款完备的android应用呢,开发一款高端的android应用又需要那些知识呢,作者根据几年的开发经验做 ...
- MyBatis知多少(25)动态SQL
使用动态查询是MyBatis一个非常强大的功能.有时你已经改变WHERE子句条件的基础上你的参数对象的状态.在这种情况下的MyBatis提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的 ...
- MVC 4 中编译时,让View 也弹出异常
前言 MVC在编译时,不会提示View中的错误,我们在发布项目的时候会一个一个的提示异常,项目大的时候会非常头疼,因为每次发布都需要至少5分钟,最后收到只有一个异常信息,如果页面异常过多,例如最近整理 ...
- oc调用rest api
无需其他类库 1: - (IBAction)callapi:(id)sender { 2: NSURL *url=[NSURL URLWithString:@"http://..." ...
- [OpenCV] Image Processing - Image Elementary Knowledge
"没有坚实的理论基础,实践只会浅尝于表面." 这是两本打基础的书,没系统学过的话,怎么好意思说自己会CV. 该领域,兴军亮 这个名字屡次出现,看来是计算机视觉领域国内的年轻才俊,向 ...
- [Python] Create a Django project in Pycharm
From: http://blog.csdn.net/u013088062/article/details/50158239 From: http://blog.csdn.net/u013088062 ...
- 简约而不简单:网站着陆页的设计(Landing Page Design)
着陆页是一个在线营销的概念,是指当访客点击一个搜索引擎优化的搜索结果进入的第一个页面或“着陆”页面.这是一个重要的页面,它和提供的产品或服务的广告有点类似,提供了与产品相关的精确的信息,告诉客户可以购 ...