1、使用jdbc连接数据库
1、1 简介
JDBC是一个阻塞操作,它将导致线程等待,直接使用JDBC进行查询将导致性能降低
1、2 配置数据源
play提供了一个用于管理JDBC连接池的插件,可以根据需要配置任意多个数据库,想要使用此插件,需要在build.sbt依赖项中添加如下依赖项:
libraryDependencies += javaJdbc
之后便可以在conf/application.conf文件中配置数据源,默认的数据源必须叫做default:
可以配置多个数据源:
如果连接数据库,则需要使用到username和password的值,配置一下即可
1、3 访问并使用数据源
play.db包中定义了操作数据源的类,主要使用的类是play.db.Database类
这是对默认的数据库进行的访问,当访问其他的数据库时可以用如下方式:
使用一个@NameDatabase注解
1、4 配置连接池
Play使用HikariCP作为默认的连接池,建议JDBC连接池配置为物理磁盘数加上cpu核数的两倍,即,如果您有一个四核CPU和一个磁盘,则池中总共有9个JDBC连接:
1、5 获取数据库连接
注意:play不会自动释放数据库连接,需要手动释放
1、6 SQL语句日志配置
Play使用 jdbcdslog-exp来实现日志记录,开启日志需要先在application.conf配置文件中设置:
然后在logback.xml文件中进行日志详细记录方式配置:
此内容在logback.xml中
注意:这仅用于开发环境,不应在生产环境中配置它,因为性能会降低,并且会污染日志。
1、7 配置JDBC驱动
在build.sbt文件中添加jdbc驱动依赖,例如添加mysql的:
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.41"
当依赖的东西太多时,可以换种写法:
libraryDependencies ++= Seq(
javaJdbc,
"mysql" % "mysql-connector-java" % "5.1.41",
.....
)
1、8 配置自定义连接池
首先创建连接池个参数设置类,此类需要实现
play.api.db.ConnectionPool接口
另外需要将此类进行配置:
play.db.pool=your.own.ConnectionPool(全类名)
配置的参数可以查看jdbc-reference.conf文件
2、JPA集成
2、1 添加JPA和实现依赖
首先添加JPA依赖JavaJPA,这是默认依赖JDBC,接下来添加一个JPA实现依赖,例如使用Hibernate:
libraryDependencies ++= Seq(
javaJpa,
"org.hibernate" % "hibernate-core" % "5.4.2.Final"
)
JPA要求数据源可以通过JNDI访问,可以通过在conf/application.conf中添加响应配置,使得jndi公开任何play管理的数据源,如下:
db.default.jndiName=DefaultDS
2、2 创建持久化单元
首先创建JPA的配置文件persistence.xml,放在conf/META-INF目录下(可以尝试直接放在conf目录下试试),具体内容在persistence.xml中
再在conf/application.conf文件中配置JPA的持久化单元:jpa.default=defaultPersistenceUnit
2、3 使用JPA部署应用
build.sbt中添加配置:
playKeys.externalizeResourcesExcludes += baseDirectory.value / "conf" / "META-INF" / "persistence.xml"
2、4 使用JPA
Play提供了play.db.jpa.JPAApi来处理实体管理器和事务,操作jpa方式如下:
直接在一个操作中使用JPA(使用play的默认线程池)将限制异步使用play的能力,因为JDBC会阻塞它运行的线程。
3、使用Ebean ORM
3、1 配置Ebean
1)需要在project/plugins.sbt中添加Ebean插件:
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "4.1.0")
2)接下来修改build.sbt 文件,用来启动使用ebean:
lazy val myProject = (project in file(".")) .enablePlugins(PlayJava, PlayEbean)
3)Ebean插件带有两个组件,一个是与数据库对话的运行库,以及一个SBT插件,它增强了与Ebean一起使用的model的编译Java字节码。这两个组件都需要进行配置,以便Ebean知道使用到的模型在哪里。运行库可以可以将用到的模型配置到应用配置文件中,在appliaction.conf文件中配置,配置方式如下:
ebean.default = ["models.*"]
针对多个数据库可以进行不同的配置,每个数据库对应的实体可以不一样=,配置如下:
ebean.orders = ["models.Order", "models.OrderItem"]
ebean.customers = ["models.Customer", "models.Address"]
如果application.conf文件与ebean模型类所在的项目不同,可能导致模型不可用,这是可以使用playEbeanModels 来指定模型在哪些module中起作用,其配置如下:
playEbeanModels in Compile := Seq("models.*")
3、2 Model superclass
Play中提供了一个model的超类io.ebean.Model
Ebean会自动为model生成getter、setter方法,如果用户自定义了,则ebean不会再重复生成,在编译时期,ebean生成的setter、getter方法是不可用的
3、3 事务操作
Ebean在默认情况下进行insert、delete、update、query是使用事务操作的,如果想在一个事务中进行多个操作,可以如此使用:
可以使用注解来控制事务:
也可以使用代码来控制事务:
提示:文中提到的文件,在资源中均可找到,或者联系作者,免费获取