在上一篇文章中,我简单介绍了一下我所知道的,关于在Bukkit环境下使用Ebean构建自己的数据库的过程。
没有看到的小伙伴可以通过这个链接去看一下:[教程]认识Ebean数据库
上篇文章中我只介绍了如何:
- 创建自己的数据类
- 注册数据类
- 操作数据库做增、删、查、改等操作
- 插件目录的配置
写那篇文章时我还对Ebean一知半解,原谅我不知深浅的教程差点误人子弟,在这篇教程中我将会介绍一下:
- 如何配置让Ebean支持MySQL(简单)
- JPA注解的简单介绍(重要)
教程:认识
Ebean数据库(二)1.如何配置让Ebean支持MySQL
这是非常简单的配置问题,Bukkit已经为我们准备好了配置文件
是的,这就是Bukkit.yml,在你服务器端里十分不起眼的一个配置文件,一般我们很少会去修改它,
如果想让你的插件使用MySQL作为数据库,你需要修改Bukkit.yml中的database字段
默认的配置是使用Sqlite作为数据库
- database:
- username: bukkit
- isolation: SERIALIZABLE
- driver: org.sqlite.JDBC
- password: walrus
- url: jdbc:sqlite:{DIR}{NAME}.db
他是安全的(因为在本地)
我们希望的配置是使用Mysql作为数据库
- database:
- username: userName
- isolation: SERIALIZABLE
- driver: com.mysql.jdbc.Driver
- password: yourPassword
- url: jdbc:mysql://localhost:3306/minecraft
| username | 你访问数据库服务器的用户名 | ||||||
| driver | 请修改为com.mysql.jdbc.Driver | ||||||
| password | 你访问数据库服务器的对应密码 | ||||||
| url | 数据库服务器的所在地址 jdbc:mysql://localhost:3306/minecraft
|
保存配置,剩下的工作都是Ebean的事情了。
这一步关键在于你的Mysql服务器是正常工作的,如果你在这步失败了,你可以尝试检查一下:
- Mysql服务器是否正在正常工作?
- 用户和数据库是否存在?
- 用户是否拥有远程访问权限?
- 密码是否正确?
2.JPA注解简易教程
Ebean用到了JPA注解,注解将会帮助我们不用去写配置文件而直接将配置写在代码里。(以下部分转自网络、部分难点作者点评)
除了红色标记的1和3是每个实体类所必须的之外,其他的注解你需要通过自己的需求进行设置。1、@Entity(name="EntityName")
必须
name为可选,对应数据库中一的个表
2、@Table(name="",catalog="",schema="")
可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息
name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
catalog:可选,表示Catalog名称,默认为Catalog("").
schema:可选,表示Schema名称,默认为Schema("").
3、@id
必须
@id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.置于getXxxx()前.
4、@GeneratedValue(strategy=GenerationType,generator="")
可选
strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4种,分别表示让ORM框架自动选择,
根据数据库的Identity字段生成,根据数据库表的Sequence字段生成,以有根据一个额外的表生成主键,默认为AUTO
generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式.
示例:
- @Id
- @GeneratedValues(strategy=StrategyType.SEQUENCE)
- public int getPk() {
- return pk;
- }
可选
@Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认即为@Basic
fetch: 表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER.
optional:表示该属性是否允许为null,默认为true
示例:
- @Basic(optional=false)
- public String getAddress() {
- return address;
- }
6、@Column
可选
@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.
| name | 表示数据库表中该字段的名称,默认情形属性名称一致 |
| nullable | 表示该字段是否允许为null,默认为true |
| unique | 表示该字段是否是唯一标识,默认为false |
| length | 示该字段的大小,仅对String类型的字段有效 |
| insertable | 表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true |
| updateable | 表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段. |
| columnDefinition | 表示该字段在数据库中的实际类型.通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是 DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或 TEXT字段类型,该属性非常有用. |
示例:
- @Column(name="BIRTH",nullable="false",columnDefinition="DATE")
- public String getBithday() {
- return birthday;
- }
7、@Transient
可选
@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic
示例:
- //根据birth计算出age属性
- @Transient
- public int getAge() {
- return getYear(new Date()) - getYear(birth);
- }
8、@MappedSuperclass
可选
@MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解
示例:
- @MappedSuperclass
- public class Employee() {
- ....
- }
- @Entity
- public class Engineer extends Employee {
- .....
- }
- @Entity
- public class Manager extends Employee {
- .....
- }
9、@Embedded
可选
@Embedded将几个字段组合成一个类,并作为整个Entity的一个属性.
例如User包括id,name,city,street,zip属性.
我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address这三个属性.
Address对象必须定义为@Embededable
示例:
- @Embeddable
- public class Address {city,street,zip}
- @Entity
- public class User {
- @Embedded
- public Address getAddress() {
- ..........
- }
- }
还有几个复杂的注解,如:
@OneToOne,@OneToMany,@ManyToOne,@ManyToMany
这四个注解应用于复杂的数据库结构,在这简单的教程中不再叙述。
各位如果有兴趣可以在网上找相应资料进一步研究。
3.结语
使用MySQL作为数据库大大增加了读取查询的效率,
应用于BungeeCord群组服时十分有效,
为了提高插件的品质和稳定性,
魔族宝呼吁大家——
根据插件需求,尽可能的使用Bukkit提供的Ebean,
它简易、便于开发、安全、快速。
是一个很好的工具。
(如本文章中有任何叙述错误的地方请各位大佬及时指出,以免误人子弟。
同时请各位读者注意,该文章只能为您做引导和参考,并不是严谨的教学文案,请保持自我分辨力)
