`
schy_hqh
  • 浏览: 552591 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(三)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"));
    }

}

 http://localhost:9000/@tests

 

测试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());
    }
    
}

 

 

 

 

     

    

 

 

 

 

 

 

  • 大小: 30.7 KB
分享到:
评论

相关推荐

    Play框架7版本教程-数据模型的首次迭代.doc

    Play框架7版本教程中的"数据模型的首次迭代"部分主要讲解了如何在Play应用中设置数据模型,特别是利用Java Persistence API (JPA) 和 Hibernate 进行对象关系映射(ORM)。以下是对这部分内容的详细说明: 首先,...

    play framework测试项目

    首先,Play Framework的核心特性之一是它的MVC(模型-视图-控制器)架构模式。在MVC模式下,应用被划分为三个主要部分:模型负责业务逻辑,视图负责用户界面呈现,而控制器则处理用户请求并协调模型和视图之间的交互...

    新建play框架项目.pdf

    在后续的教程中,我们将逐步学习如何在Yabe项目中添加数据验证、错误处理、权限管理、自动化测试、Web界面和国际化功能。Play框架提供了丰富的内置支持,使得开发者可以专注于业务逻辑,而不是基础设施的配置和管理...

    yabe:另一个博客引擎-Curso Play 1.3.1

    "yabe-master"可能是博客引擎项目的源代码,包含了所有必要的文件和目录,如控制器、模型、视图、配置文件等,开发者可以下载并进行本地开发和部署。 综上所述,"yabe:另一个博客引擎 - Curso Play 1.3.1"涉及到...

    play框架教程前6章

    创建一个新的Play应用,只需在命令行输入`play new yabe`,然后按照提示输入应用的全名,如"Yet Another Blog Engine"。这将生成一个名为yabe的目录,包含了标准的工程结构: 1. `App/`:包含应用程序的核心代码,...

    学习BACnet/IP协议所使用的Yabe和VTS工具

    在使用Yabe和VTS学习BACnet/IP协议的过程中,你将深入理解BACnet对象模型、服务和操作流程。同时,这两个工具也适用于实际项目中的设备调试和系统集成工作。安装文件"SetupYabe_v1.2.2.exe"是Yabe的安装程序,而"VTS...

    yabe:另一个博客引擎(Play Framework 1.3.x)

    矢部 另一个博客引擎(Play Framework 1.3.x)

    yabe:另一个后端库

    yabe:另一个后端库

    Yet Another Bacnet Explorer:Yabe-BACnet设备的图形资源管理器程序-C#代码-开源

    包括三个演示服务器应用程序:通用服务器,壁挂式房间控制器模拟器,天气服务器(从中获取数据互联网网络服务)。 包括许多示例C#源代码。 Raspberry Pi服务器示例代码,也已在Beaglebone和Intel Edison上进行了...

    数据采集.rar

    "数据采集.rar"这个压缩包文件显然包含了一个系统,该系统能够利用Bacnet协议从PLC(可编程逻辑控制器)中获取数据,并通过DTU(数据传输单元)的串口将这些数据发送到服务器。让我们深入探讨一下涉及的各个知识点。 ...

    BACnet设备Socket UDP通信源码

    BACnet是基于ISO/OSI模型的七层通信协议,主要应用于楼宇自动化、暖通空调(HVAC)、照明控制系统等领域。它定义了一套标准的数据对象、服务和网络层协议,使得设备间可以共享数据和控制指令。BACnet支持多种传输层...

    yabe_sql:剧本1.3.x教程紧随其后

    "yabe_sql" 可能是一个开源项目或工具的名字,而 "剧本1.3.x教程" 指的是该项目或工具的1.3.x版本的相关教学材料。"紧随其后" 暗示这是一个系列教程中的一个后续部分,可能是对之前版本的更新或者扩展。 【描述分析...

    BACnet常用的开发工具,包括点位扫描工具,主站模拟工具以及抓包分析工具

    一些常用的BACnet点位扫描工具包括Yabe,BACnetscan 等。 BACnet主站模拟工具:主站模拟工具用于模拟BACnet主站的功能,以便测试和验证设备的响应和行为。它们允许开发人员发送和接收BACnet命令和数据,并模拟不同的...

    yabe-online-mall.github.io

    "矢部网上商城"是一个基于GitHub Pages部署的在线商城项目,其源代码托管在"yabe-online-mall.github.io"的仓库中。这个项目主要利用HTML(HyperText Markup Language)来构建网页结构,展示了如何使用基本的Web技术...

    BacNet协议应用软件

    "yetanotherbacnetexplorer-code-282-trunk"可能表示的是YABE项目的某个版本或分支。"code-282"可能是一个版本号,而"trunk"通常指的是主分支,意味着这是项目的主线开发代码。解压这个文件后,开发者将能看到源代码...

    bacnet-IP C#版本

    至于压缩包中的"YaBe"文件,可能是源代码、文档或者示例项目。由于信息不全,无法确定其具体内容,但可以推测这可能是实现Bacnet-IP协议的C#代码库,或者是包含详细说明和使用示例的文档。开发者可能需要将这些文件...

    SetupYabe_v1.1.9.exe

    Currently supports both BACnet IPv4, IPv6 + BACnet MSTP + BACnet PTP + BACnet Ethernet. Basic functions for read, write, read multiple, write multiple, iam, whois, subscribeCOV, notify, WriteFile, ...

    YABE - Yet Another Bookmarks Extension-crx插件

    语言:English 更好的书签弹出窗口 功能:1.左键单击​​可在新选项卡中打开书签。 2.单击鼠标中键或Ctrl键并单击以在新的背景选项卡中打开书签。 3.通过打开另一个文件夹来关闭所有打开的文件夹。...

Global site tag (gtag.js) - Google Analytics