(三)play之yabe项目【数据模型】

(三)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

Java代码  

  1. package models;
  2. import javax.persistence.Entity;
  3. import play.db.jpa.Model;
  4. @Entity
  5. public class User extends Model {
  6. public String email;
  7. public String password;
  8. public String fullname;
  9. public boolean isAdmin;
  10. public User(String email,String password, String fullname) {
  11. this.email = email;
  12. this.password = password;
  13. this.fullname = fullname;
  14. }
  15. }

使用JUNIT进行单元测试

打开命令行,切换到测试模式

play  test yabe

play提供了默认的测试文件,打开yabe\test\BasicTest.java

删除aVeryImportantThingToTest,新建一个测试

Java代码  

  1. import org.junit.*;
  2. import java.util.*;
  3. import play.test.*;
  4. import models.*;
  5. /**
  6. * 测试单元 extends UnitTest
  7. * @author lenovo
  8. *
  9. */
  10. public class BasicTest extends UnitTest {
  11. @Test
  12. public void createAndRetriveUser() {
  13. //Create a User and save
  14. new User("[email protected]","******","ZS").save();
  15. //retrieve User by emial
  16. User user1 = User.find("email", "[email protected]").first();
  17. //两种写法都可以 匹配email="[email protected]"的User对象
  18. User user2 = User.find("byEmail", "[email protected]").first();
  19. assertNotNull(user1);
  20. assertNotNull(user2);
  21. assertEquals(user1, user2);
  22. assertEquals("ZS", user1.fullname);
  23. assertEquals("ZS", user2.fullname);
  24. }
  25. }

打开http://localhost:9000/@tests

运行BasicTest,即上面写的测试单元,点击Start !   进行测试

结果应该为绿色!

接下来测试User的email和password是否正确的方法

通过email和password两个条件来找到User对象

打开User.java,添加connect():

Java代码  

  1. package models;
  2. import javax.persistence.Entity;
  3. import play.db.jpa.Model;
  4. @Entity
  5. public class User extends Model {
  6. public String email;
  7. public String password;
  8. public String fullname;
  9. public boolean isAdmin;
  10. public User(String email,String password, String fullname) {
  11. this.email = email;
  12. this.password = password;
  13. this.fullname = fullname;
  14. }
  15. /**
  16. * 联合email和password两个条件查询User
  17. * @param email
  18. * @param password
  19. * @return
  20. */
  21. public static User connect(String email, String password) {
  22. return find("byEmailAndPassword", email, password).first();
  23. }
  24. }

在BasicTest.java里添加测试方法

Java代码  

  1. import org.junit.*;
  2. import java.util.*;
  3. import play.test.*;
  4. import models.*;
  5. /**
  6. * 测试单元 extends UnitTest
  7. * @author lenovo
  8. *
  9. */
  10. public class BasicTest extends UnitTest {
  11. /**
  12. * 测试用户的创建和查找
  13. */
  14. @Test
  15. public void createAndRetriveUser() {
  16. //Create a User and save
  17. new User("[email protected]","******","ZS").save();
  18. //retrieve User by emial
  19. User user1 = User.find("email", "[email protected]").first();
  20. //两种写法都可以 匹配email="[email protected]"的User对象
  21. User user2 = User.find("byEmail", "[email protected]").first();
  22. assertNotNull(user1);
  23. assertNotNull(user2);
  24. assertEquals(user1, user2);
  25. assertEquals("ZS", user1.fullname);
  26. assertEquals("ZS", user2.fullname);
  27. }
  28. /**
  29. * 测试联合条件查询
  30. */
  31. @Test
  32. public void tryConnectUser() {
  33. //Create a user and save it
  34. new User("[email protected]", "123", "zhangsan").save();
  35. //Test
  36. assertNotNull(User.connect("[email protected]", "123"));
  37. assertNull(User.connect("[email protected]", "234"));
  38. assertNull(User.connect("[email protected]", "234"));
  39. }
  40. }

http://localhost:9000/@tests

测试BasicTest项,应该全部通过!

增加模型Post

Post类作为博客的实体类,与User之间为多对一的关系

Java代码  

  1. package models;
  2. import java.util.Date;
  3. import javax.persistence.Entity;
  4. import javax.persistence.Lob;
  5. import javax.persistence.ManyToOne;
  6. import play.db.jpa.Model;
  7. @Entity
  8. public class Post extends Model {
  9. public String title;
  10. public Date postedAt;
  11. //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容
  12. @Lob
  13. public String content;
  14. //@ManyToOne:声明Post与User之间是多对一的关系
  15. //一个用户可以发布多个博客,一个博客只能被一个用户所发布
  16. @ManyToOne
  17. public User author;
  18. public Post(String title, String content, User author) {
  19. this.title = title;
  20. this.content = content;
  21. this.author = author;
  22. this.postedAt = new Date();
  23. }
  24. }

对Post类进行测试

Java代码  

  1. import org.junit.*;
  2. import java.util.*;
  3. import play.test.*;
  4. import models.*;
  5. /**
  6. * 测试单元 extends UnitTest
  7. * @author lenovo
  8. *
  9. */
  10. public class BasicTest extends UnitTest {
  11. /**
  12. * 清空数据库中的数据,释放内存空间
  13. * Fixtures帮助在测试期间管理数据库
  14. */
  15. @Before
  16. public void setup() {
  17. Fixtures.deleteDatabase();
  18. }
  19. /**
  20. * 测试用户的创建和查找
  21. */
  22. @Test
  23. public void createAndRetriveUser() {
  24. //Create a User and save
  25. new User("[email protected]","******","ZS").save();
  26. //retrieve User by emial
  27. User user1 = User.find("email", "[email protected]").first();
  28. //两种写法都可以 匹配email="[email protected]"的User对象
  29. User user2 = User.find("byEmail", "[email protected]").first();
  30. assertNotNull(user1);
  31. assertNotNull(user2);
  32. assertEquals(user1, user2);
  33. assertEquals("ZS", user1.fullname);
  34. assertEquals("ZS", user2.fullname);
  35. }
  36. /**
  37. * 测试联合条件查询
  38. */
  39. @Test
  40. public void tryConnectUser() {
  41. //Create a user and save it
  42. new User("[email protected]", "123", "zhangsan").save();
  43. //Test
  44. assertNotNull(User.connect("[email protected]", "123"));
  45. assertNull(User.connect("[email protected]", "234"));
  46. assertNull(User.connect("[email protected]", "234"));
  47. }
  48. /**
  49. * 测试Post类
  50. */
  51. @Test
  52. public void createPost() {
  53. //Create a User and save it
  54. User Mike = new User("[email protected]", "111", "Mike").save();
  55. //Create 2 Post
  56. new Post("First Blog", "first", Mike).save();
  57. new Post("Second Blog", "second", Mike).save();
  58. //测试是否成功创建了2个Post对象
  59. assertEquals(2, Post.count());
  60. //获取lisi发布的所有博客
  61. List<Post> posts = Post.find("byAuthor", Mike).fetch();
  62. assertEquals(2, posts.size());
  63. assertNotNull(posts.get(0));
  64. assertNotNull(posts.get(1));
  65. assertEquals(Mike, posts.get(0).author);
  66. assertEquals("First Blog", posts.get(0).title);
  67. assertEquals("second", posts.get(1).content);
  68. assertNotNull(posts.get(1).postedAt);
  69. }
  70. }

增加模型Comment

Comment 与 Post 之间为多对一的关系,多条评论对应一篇博客

Java代码  

  1. package models;
  2. import java.util.Date;
  3. import javax.persistence.Entity;
  4. import javax.persistence.Lob;
  5. import javax.persistence.ManyToOne;
  6. import play.db.jpa.Model;
  7. @Entity
  8. public class Comment extends Model {
  9. public String author;
  10. public Date postedAt;
  11. @Lob
  12. public String content;
  13. //一篇博客对应多条评论,一个评论属于一篇博客
  14. //评论与博客的关系:多对一
  15. @ManyToOne
  16. public Post post;
  17. public Comment(String author, String content, Post post) {
  18. super();
  19. this.author = author;
  20. this.content = content;
  21. this.post = post;
  22. this.postedAt = new Date();
  23. }
  24. }

修改模型Post,增加Comment属性

注:上面的User类也可以持有一个关于Post的集合,方法与此类似。

Java代码  

  1. package models;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Entity;
  7. import javax.persistence.Lob;
  8. import javax.persistence.ManyToOne;
  9. import javax.persistence.OneToMany;
  10. import play.db.jpa.Model;
  11. @Entity
  12. public class Post extends Model {
  13. public String title;
  14. public Date postedAt;
  15. //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容
  16. @Lob
  17. public String content;
  18. //@ManyToOne:声明Post与User之间是多对一的关系
  19. //一个用户可以发布多个博客,一个博客只能被一个用户所发布
  20. @ManyToOne
  21. public User author;
  22. //1篇博客对应多个评论
  23. //删除某篇博客,则级联删除其评论
  24. @OneToMany(mappedBy="post", cascade=CascadeType.ALL)
  25. public List<Comment> comments;
  26. public Post(String title, String content, User author) {
  27. this.comments = new ArrayList<Comment>(0);
  28. this.title = title;
  29. this.content = content;
  30. this.author = author;
  31. this.postedAt = new Date();
  32. }
  33. /**
  34. * 在Post中实现评论的添加保存操作
  35. * 同时更新Post所持有的Comment的集合!
  36. */
  37. public Post addComment(String author, String content) {
  38. //保存对方
  39. Comment newComment = new Comment(author, content, this).save();
  40. //把对方加入到自己管理的集合中
  41. this.comments.add(newComment);
  42. //同步到数据库
  43. this.save();
  44. return this;
  45. }
  46. }

所有的测试代码

Java代码  

  1. import org.junit.*;
  2. import java.util.*;
  3. import play.test.*;
  4. import models.*;
  5. /**
  6. * 测试单元 extends UnitTest
  7. * @author lenovo
  8. *
  9. */
  10. public class BasicTest extends UnitTest {
  11. /**
  12. * 清空数据库中的数据,释放内存空间
  13. * Fixtures帮助在测试期间管理数据库
  14. */
  15. @Before
  16. public void setup() {
  17. Fixtures.deleteDatabase();
  18. }
  19. /**
  20. * 测试用户的创建和查找
  21. */
  22. @Test
  23. public void createAndRetriveUser() {
  24. //Create a User and save
  25. new User("[email protected]","******","ZS").save();
  26. //retrieve User by emial
  27. User user1 = User.find("email", "[email protected]").first();
  28. //两种写法都可以 匹配email="[email protected]"的User对象
  29. User user2 = User.find("byEmail", "[email protected]").first();
  30. assertNotNull(user1);
  31. assertNotNull(user2);
  32. assertEquals(user1, user2);
  33. assertEquals("ZS", user1.fullname);
  34. assertEquals("ZS", user2.fullname);
  35. }
  36. /**
  37. * 测试联合条件查询
  38. */
  39. @Test
  40. public void tryConnectUser() {
  41. //Create a user and save it
  42. new User("[email protected]", "123", "zhangsan").save();
  43. //Test
  44. assertNotNull(User.connect("[email protected]", "123"));
  45. assertNull(User.connect("[email protected]", "234"));
  46. assertNull(User.connect("[email protected]", "234"));
  47. }
  48. /**
  49. * 测试Post类
  50. */
  51. @Test
  52. public void createPost() {
  53. //Create a User and save it
  54. User Mike = new User("[email protected]", "111", "Mike").save();
  55. //Create 2 Post
  56. new Post("First Blog", "first", Mike).save();
  57. new Post("Second Blog", "second", Mike).save();
  58. //测试是否成功创建了2个Post对象
  59. assertEquals(2, Post.count());
  60. //获取lisi发布的所有博客
  61. List<Post> posts = Post.find("byAuthor", Mike).fetch();
  62. assertEquals(2, posts.size());
  63. assertNotNull(posts.get(0));
  64. assertNotNull(posts.get(1));
  65. assertEquals(Mike, posts.get(0).author);
  66. assertEquals("First Blog", posts.get(0).title);
  67. assertEquals("second", posts.get(1).content);
  68. assertNotNull(posts.get(1).postedAt);
  69. }
  70. /**
  71. * 测试Post与User的多对一关系
  72. */
  73. @Test
  74. public void testPost2User() {
  75. User Mike = new User("[email protected]", "111", "Mike").save();
  76. Mike.addPost("First Blog", "first");
  77. Mike.addPost("Second Blog", "second");
  78. assertNotNull(Mike);
  79. assertEquals(2, Post.count());
  80. //从新查询User
  81. Mike = User.connect("[email protected]", "111");
  82. //直接从User中获取Post的集合
  83. assertEquals(2, Mike.posts.size());
  84. assertEquals("first", Mike.posts.get(0).content);
  85. assertEquals("second", Mike.posts.get(1).content);
  86. }
  87. /**
  88. * 测试Comment类
  89. * 单向,由Comment得到Post
  90. */
  91. @Test
  92. public void testComment() {
  93. User Mike = new User("[email protected]", "111", "Mike").save();
  94. Post post = new Post("First Blog", "first", Mike).save();
  95. new Comment("jeff", "nice post", post).save();
  96. new Comment("henrry", "good post", post).save();
  97. //获取博客的所有评论
  98. List<Comment> comments = Comment.find("byPost", post).fetch();
  99. assertEquals(2, comments.size());
  100. Comment firstComment = comments.get(0);
  101. assertNotNull(firstComment);
  102. assertEquals("jeff", firstComment.author);
  103. assertEquals("nice post", firstComment.content);
  104. assertNotNull(firstComment.postedAt);
  105. Comment secondComment = comments.get(1);
  106. assertNotNull(secondComment);
  107. assertEquals("henrry", secondComment.author);
  108. assertEquals("good post", secondComment.content);
  109. assertNotNull(firstComment.postedAt);
  110. }
  111. /**
  112. * 测试Comment与Post的多对一关系
  113. * 双向,由Post直接得到与此关联的Comment集合
  114. */
  115. @Test
  116. public void testComment2PostRelation() {
  117. //User
  118. User bob = new User("[email protected]","111","Bob well").save();
  119. //Post
  120. Post post = new Post("First post","hello kelly",bob).save();
  121. //Comment
  122. post.addComment("jeff", "Nice Post!");
  123. post.addComment("Tom", "I knew that!");
  124. assertEquals(1, User.count());
  125. assertEquals(1, Post.count());
  126. assertEquals(2, Comment.count());
  127. //Retrieve Bob‘s post
  128. post = Post.find("byAuthor", bob).first();
  129. assertNotNull(post);
  130. //Navigation to comments
  131. assertEquals(2, post.comments.size());
  132. assertEquals("jeff", post.comments.get(0).author);
  133. //delete Post
  134. post.delete();
  135. //check that all commonts have been deleted
  136. assertEquals(1, User.count());
  137. assertEquals(0, Post.count());
  138. assertEquals(0, Comment.count());
  139. }
  140. }
时间: 2024-12-10 14:51:33

(三)play之yabe项目【数据模型】的相关文章

Maven学习总结(三)——使用Maven构建项目

maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Java项目 1.1.创建Java Project 1.使用mvn archetype:generate命令,如下所示: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -Dinteract

第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4456420.html 联系方式:[email protected] [系列] 第一次使用Android Studio时你应该知道的一切配置 第一次使用Android Studio时你应该知道的一切配置(二):新建一个属于自己的工程并安装Genymotion模拟器 第一次使用Android Stu

【转载】Maven学习总结(三)——使用Maven构建项目

maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Jave项目 1.1.创建Jave Project 1.使用mvn archetype:generate命令,如下所示: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -Dinteract

(七)play之yabe项目【CRUD】

(七)play之yabe项目[CRUD] 博客分类: 框架@play framework  增加CRUD功能 使用CRUD能干嘛?----> 在页面对模型进行增删改查操作,这样有什么实际意义呢? 不使用CRUD模块的功能,只要模型继承了Model类,就有save(),delete()等方法可以调用了 这个CRUD对开发有什么帮助? 用于快速生成一个基本的管理区域,如初始化一个登陆用户,很方便. 到目前为止,我对CRUD功能的理解只能这样: 提供一个可视化的对象管理界面,就好比数据库的客户端,pl

三、自动化生成项目中的html页面

 1. 现在项目下已经有了初始页面,页面引用的是bundle.js,但是我们打包后的文件名是不确定的(带hash等),有什么办法能自动改变路径?借助插件;  2. 安装npm install html-webpack-plugin –save-dev;  3. 配置文件中引用 官网=>using Plugins 初始化插件,运行 npm run webpack ;发现插件生效;生成了html文件,并且对两个js进行了引用:但是这个跟我们根目录下的html文件没有什么关系,或者说怎样以根目录下的h

第三视角团队:项目UML设计(团队)

项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 张扬(组长) 031602345 肖地秀 031602336 朱文婧 031602148 洪泽波 031602312 郑愈明 031602147 陈加伟 031602631 苏韫月 031602204 郭俊彦 031602213 李翔 031602418 王全炯 031602331 组长作业博客链接 本次作业链接 团队分工(10分) 成员负责事务 | | | | | ---- | ---- | ---- | | |

.NET Core Community 第三个千星项目诞生:爬虫 DotnetSpider

本文所有打赏将全数捐赠于 NCC(NCC 的资金目前由 倾竹大人 负责管理),请注明捐赠于 NCC.捐赠情况将由倾竹大人在此处公示. DotnetSpider 至力于打造一个轻量化.高效率.易开发.可管理的一体化爬虫框架.它的核心要素是URL调度.基本的网页内容下载器.基于爬虫实体类的爬虫实现模式.常用数据库的支持.多线程的支持.状态的监控.运行日志.网页端管理. DotnetSpider 具有相当高的可定制性,支持包括 MSSQL.MySQL.PostgreSQL.MongoDB 在内的多种数

爬虫代码实现三:打通爬虫项目的下载、解析、存储流程

1.新建一个存储接口IStoreService package com.dajiangtai.djt_spider.service; import com.dajiangtai.djt_spider.entity.Page; /** * 数据存储接口 * @author Administrator * */public interface IStoreService { public void store(Page page);} 2.新建一个存储接口实现类ConsoleStoreService

第三周作业-个人项目黑盒测试

黑盒测试是一种从软件外部对软件实施的测试,也称功能测试或基于规格说明的测试.它将所有程序都看作是从输入定义域到输出值域的映射,这种观点将被测程序看作是一个打不开的黑盒子,黑盒内的内容是完全不可知的,只要知道软件要做什么.因无法看到盒子中的内容,所以不知道软件是如何实现的,也不关心黑盒里面的结构,只关心软件的输入数据和输出结果. 常见的黑盒测试方法有等价类划分.边界值分析.决策表测试等. 下面采用等价类划分的方法对个人项目(PCAI登陆注册模块)进行测试. 输入条件 有效等价类 无效等价类 账户名