#访问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);
}