2.6 mysql和hibernate支持
这是一个完整的eclipse项目,点击下载后导入,可直接运行。
上一节的数据库是内置的h2数据库,假如使用mysql数据库,该怎么配置呢?
以下配置假定已经在本地安装了mysql数据库
1.配置pom.xml,首先要把之前的注释掉,如上所示,然后加上mysql的包标签,如下所示:
<!--dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2.配置application.properties
在src/main/rescources找到这个文件,然后把下面的配置复制进去
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名字?characterEncoding=utf-8&serverTimezone=UTCspring.datasource.username=账号spring.datasource.password=密码spring.datasource.driver-class-name=com.mysql.jdbc.Driver#如果mysql版本是6或者以上,需要使用下面的驱动,否则使用上面的驱动#spring.datasource.driver-class-name=com.mysql.jc.jdbc.Drivespring.jpa.database=MYSQL#是否显示sqlspring.jpa.show-sql=true#hibernateddl模式,可选参数:#create启动时删数据库中的表,然后创建,退出时不删除数据表#create-drop启动时删数据库中的表,然后创建,退出时删除数据表如果表不存在报错#update如果启动时表格式不一致则更新表,原有数据保留#validate项目启动表结构进行校验如果不一致则报错spring.jpa.hibernate.ddl-auto=update#命名策略spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy#支持mysql特性spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
这段关于数据库的配置,关键的是数据库URL、数据库的账号和密码是可连通的,否则SpringBoot启动会失败。
Spring Boot启动的时候,会扫描项目内所有的实体类,每个实体类都需要与一个数据库表对应,如果实体类关联的表不存在,那么Spring Boot将会创建一个,如果上面的配置的库abc是真实存在的,并且7.5节的Customer.java的实体类存在,那么当abc内不存在表Customer的时候,SpringBoot会创建一个,如图所示:
按照上一节Customer.java类的三个属性配置:
@Entity public class Customer{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String firstName; private String lastName; //其余代码略....}
按照上面的java代码生成的数据库表是这样的:
生成的表的主键id的自动递增属性是根据实体类的标签@GeneratedValue配置而成的,它的值是(strategy=GenerationType.IDENTITY)。GenerationType有四个值可选:
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。
3.映射类(实体类)
映射类是指和数据库表一一对应的Java类。
所有想要映射到数据库表的实体类,都必须使用@Entity注解。这样标记后的类,才能被Spring Data JPA识别为一个有效的实体,并在Repository接口中使用,上一节的Customer类就是一个实体类。下面再以User实体作为例子来说明,如代码所示:
package com.example.accessingdatajpa;import javax.persistence.*;@Entity @Table(name="sys_user")public class User{ @Id private String username; private String password; private String role; private String nickname; @Column(name="create_date") private String createDate; public User(){ } public User(String username){ super(); this.username=username; } public String getUsername(){ return this.username; } public void setUsername(String username){ this.username=username; } public String getPassword(){ return this.password; } public void setPassword(String password){ this.password=password; } public String getRole(){ return this.role; } public void setRole(String role){ this.role=role; } public String getNickname(){ return this.nickname; } public void setNickname(String nickname){ this.nickname=nickname; } public String getCreateDate(){ return this.createDate; } public void setCreateDate(String createDate){ this.createDate=createDate; }}
@Entity声明User为一个实体类,并且由于实体类的字段名和数据库表的列名默认是直接对应的,所以如果它们名称相同则不需要额外的配置。
同样的,如果表名与类名不只是大小写上的差异,或者包含有下划线等,那么需要使用@Table注解来明确指定表名,如代码7-15所示:
@Entity @Table(name="sys_user")// 明确指定表名publicclass User{ //类的成员变量和方法}
主键id除了@Id的说明外,还可以用标签@GeneratedValue指定id的生成方式,
如果表的字段名和类的属性不只是大小写上的差异,或者包含有下划线等,比如上面的User.java的create_date列,我们可以使用@Column注解来指明对应的类属性名是createDate。
@Column(name="create_date")private String createDate;
建议表名和类名一致,减少配置。
在具有众多数据库表的大型项目中手动创建每一个实体类是非常繁琐的。开发环境一般都提供了从数据库生成实体类的工具,下面分别介绍eclipse和Idea的生成方法。
username是主键,可以看到属性上方有两个标签,一个@ID,一个是GenerateValue,Id表示这个属性对应的字段是主键,GenerateValue表示Id值是指定的(不是自动生成)