Play framework 2.0 -访问SQL数据库

#访问Sql数据库

1.配置JDBC连接池

play2.0提供了管理JDBC连接池的插件。你可以安装需要来配置许多数据库。

要启用数据库插件,就要在conf/application.conf文件中配置一个连接池。根据约定默认的JDBC数据源,必须调用缺省:

# Default database configuration
	db.default.driver=org.h2.Driver
	db.default.url="jdbc:h2:mem:play"

 

配置多个数据源:

# Orders database
db.orders.driver=org.h2.Driver
db.orders.url="jdbc:h2:mem:orders"

# Customers database
db.customers.driver=org.h2.Driver
db.customers.url="jdbc:h2:mem:customers"

 

如果有地方配置不对,在浏览器中会直接给你提示。

2.访问JDBC数据源

play.db包提供了对数据源的访问:

import play.db.*;

DataSource ds = DB.getDatasource();
 

3.获取JDBC连接

通过如下方式得到一个JDBC连接:

Connection connection = DB.getConnection();

4.通过JNDI暴露数据源

一下库期望从JNDI获取到数据源的引用,通过在conf/application.conf中加入下面的配置,你可以使用JDNI暴露任意Play管理的数据源。

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.jndiName=DefaultDS
 

5.引入数据库驱动

除了主要用于开发模式下的h2内存数据库外,Play没有提供其他数据库的驱动。所以,要部署到生产环境,你得添加你的数据库驱动作为应用的依赖。

举个例子,如果你使用mysql5数据库,你需要为连接添加这样的依赖:

val appDependencies = Seq(
     // Add your project dependencies here,
     ...
     "mysql" % "mysql-connector-java" % "5.1.18"
     ...
)
 

#使用Ebean ORM

1.配置Ebean

Play2.0有一个Ebean ORM(对象关系映射)的新特性。在conf/applicatio.conf中加如下的一行代码就可以启用它:

ebean.default="models.*"
 

它定义了一个默认的Ebean服务,使用默认的数据源,数据源必须正确的配置。你需要多少完全可以创建多少个Ebean服务。

只需要显示地定义每个服务映射的类:

ebean.orders="models.Order,models.OrderItem"
ebean.customers="models.Customer,models.Address"
 

这个例子中,我们设置了连个Ebean服务。

2.使用play.db.eban.Model超类

play2.0为你的Ebean模型类定义了一个方便的超类,这是Play2.0中一个典型的Ebean类:

	package models;

	import java.util.*;
	import javax.persistence.*;

	import play.db.ebean.*;
	import play.data.format.*;
	import play.data.validation.*;

	@Entity 
	public class Task extends Model {

	  @Id
	  @Constraints.Min(10)
	  public Long id;
	  
	  @Constraints.Required
	  public String name;
	  
	  public boolean done;
	  
	  @Formats.DateTime(pattern="dd/MM/yyyy")
	  public Date dueDate = new Date();
	  
	  public static Finder<Long,Task> find = new Finder<Long,Task>(
	    Long.class, Task.class
	  ); 

	}
 

如你所见,我们增加了一个静态的find字段,为一个有Long类型唯一标识的Task实体定义了一个finder方法。

	// Find all tasks
	List<Task> tasks = Task.find.all();
	    
	// Find a task by ID
	Task anyTask = Task.find.byId(34L);

	// Delete a task by ID
	Task.find.ref(34L).delete();

	// More complex task query
	List<Task> tasks = find.where()
	    .ilike("name", "%coco%")
	    .orderBy("dueDate asc")
	    .findPagingList(25)
	    .getPage(1);
 

3.事务Action

默认情况下,Ebean不使用事务。但是你可以利用事务助手为你的Ebean创建一个事务。例如:

	// run in Transactional scope...  
	Ebean.execute(new TxRunnable() {  
	  public void run() {  
	      
	    // code running in "REQUIRED" transactional scope  
	    // ... as "REQUIRED" is the default TxType  
	    System.out.println(Ebean.currentTransaction());  
	      
	    // find stuff...  
	    User user = Ebean.find(User.class, 1);  
	    ...  
	      
	    // save and delete stuff...  
	    Ebean.save(user);  
	    Ebean.delete(order);  
	    ...  
	  }  
	});
 

你也可以使用@play.db.ebean.Transactional注解你的Action来自动为你的Action中的方法提供事务管理。

	@Transactional
	public static Result save() {
	  ...
	}
 

#集成JPA

1.通过JNDI暴露数据源

JPA要求通过JNDI访问数据源。添加如下配置就可以通过JDNI暴露Play管理的任意数据源。

	db.default.driver=org.h2.Driver
	db.default.url="jdbc:h2:mem:play"
	db.default.jndiName=DefaultDS
 

2.为你的项目添加JPA的实现

Play2.0没有内建的JPA的实现,你可以选择可用的实现,例如要用Hibernate,只需要加入如下依赖到你的工程:

	val appDependencies = Seq(
	  "org.hibernate" % "hibernate-entitymanager" % "3.6.9.Final"
	)
 

3.创建持久层测试

下一步你得创建一个正确的persistence.xml JPA配置文件。把它放到conf/META_INF目录下,这样它就会正确的加到你的classpath里了。

这里是一个Hibernate的简单配置:

	<persistence xmlns="http://java.sun.com/xml/ns/persistence"
		     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
		     version="2.0">
		     
	    <persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<non-jta-data-source>DefaultDS</non-jta-data-source>
		<properties>
		    <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
		</properties>
	    </persistence-unit>
	    
	</persistence>
 

4.使用@Transactional为JPAAction做事务注解

每个JPA调用必须完成事务,要为某个特定的Action启用JPA,用@play.db.jpa.Transactional注解。这样会将你的Action方法与管理事务

的JPA Action组合。

	@Transactional
	public static Result index() {
	  ...
	}
 

如果你的Action仅是完成查询,你可以设置readOnly属性为true:

	@Transactional(readOnly=true)
	public static Result index() {
	  ...
	}
 

5.使用play.db.jpa.JPA助手

通过play.db.jpa.JPA辅助类,在任何时候你可以获取到当前实体的管理器。

	public static Company findById(Long id) {
	  return JPA.em().find(Company.class, id);
	}
 

猜你喜欢

转载自shenbai.iteye.com/blog/1502667