-
jpa是什么?
1)JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
2)Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。 -
为什么要学习JPA?
1)个人认为,首先JPA 是 JCP 组织发布的 Java EE 标准之一,我们对于JAVA的面向对象能有更加深刻的理解。心中有对象,数据库表结构就会自动创建。
2)JPA已经作为一项对象持久化的标准,不但可以获得Java EE应用服务器的支持,还可以直接在Java SE中使用。开发者将无需在现有多种ORM框架中艰难地选择。 -
开始学习JPA
首先我使用的是Spring Boot集成JPA+Maven(提示:Spring Boot可以去看我上一期的Spring Boot 学习)
1)首先开始导入依赖(这里使用了Spring Data)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2)配置application.properties(这里我使用资源文件中的 .properties文件 “基本够用”,你们可以使用 .yml 文件)
#datasource
spring.datasource.url=jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=UTF8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=用户名
spring.datasource.password=密码
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#jpa
#要操作的目标数据库,默认自动检测。也可以通过 databasePlatform 属性进行设置。
spring.jpa.database=MYSQL
#建表模式( none 、 validate 、 update 、 create 和 create-drop )。
这是 hibernate. hbm2ddl.auto 属性的一个快捷方式。在使用嵌入式数据库时,默认为 create-drop ,
其他情况下默认为 none 。
(**提示:这个东西可不能乱弄,上次有个新人就把数据库的数据全部给更新了,谨慎**)
spring.jpa.hibernate.ddl-auto=update
#显示SQL(默认值: false 。)
#spring.jpa.showSql = true 或者如下:
spring.jpa.show-sql=true
#格式化SQL
spring.jpa.properties.hibernate.format_sql=true
#命名规范(必须):Hibernate 命名策略的全限定类名。
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
#方言,如果不指定,将根据数据库类型自动选择
#spring.jpa.properties.hibernate.dialect = 方言
3)现在开始对类进行配置
1)在启动类上标注
(1)@EntityScan(“实体类层的包名”)(扫描实体类)
(2)@SpringBootApplication
(3)@EnableJpaRepositories(“指定dao层”)
(4)@EnableTransactionManagement(开启事物管理)
@EntityScan("")
@SpringBootApplication
@EnableJpaRepositories("")
@EnableTransactionManagement
public class Appliaction {
public static void main(String[] args) {
SpringApplication.run(Appliaction.class,args);
}
}
4)实体类配置(注意:导包时使用 javax 的包)
(1)@MappedSuperclass (可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解)
(2)@Entity (标注是实体类)
(3)@Table (name=“表名”,indexes = @Index (name=“索引名”,columnList=“列名”,unique:是否唯一索引 (true or false)))
@Entity
@Table(name = "user_account", indexes = @Index(name = "idx_user_account", columnList = "account", unique = true))
public class Account extends BaseEntity{
}
5)主键的生成策略
(1)@Id (主键的策略,具体的我就不一一列举了)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)//自增长
protected Integer id;
(2)@Column
name:表列名,默认为Java实体类属性名 unique:是否唯一值,如果是,自动建立唯一索引 nullable:是否允许为空,默认是
insertable:是否允许插入,默认是允许 updatable:是否可更新,默认是允许
columnDefinition:根据不同数据库指定列定义,相当于本地SQL,例如写字段注释 length:字段长度,默认是255个字符
precision:浮点类型的长度 scale:浮点类型小数点后面的长度,注意 precision包含了这个长度。
(3)@Temporal
时间映射: value:时间类型,详细选项: TemporalType.DATE 只存日期 TemporalType.TIME 只存时间
TemporalType.TIMESTAMP 包括日期时间
示例:
@Temporal(TemporalType.TIMESTAMP)
private Date created;
(4)@Enumerated
枚举映射: value:映射类型,详细如下: EnumType.ORDINAL :映射为整型,表里存的是枚举顺序号
EnumType.STRING:映射为字符型,表里存的是枚举的元素名称,因此还需要搭配@Column注解标注字段长度
示例:
数据库存储枚举顺序:
@Enumerated(EnumType.ORDINAL)
private Gender gender;
数据库存储枚举名称:
@Enumerated(EnumType.STRING)
@Column(length = 6)
private Gender gender;
(5)@Lob(大字段 效率太低了,不建议使用,实在要使用还是分表吧。)
- 大字段
- clob:text/longtext
- blob:image/
使用 @Basic(FetchType.LAZY)设置为懒加载
(6)@Transient
临时字段,不会映射到数据库
下期我单独分享主键策略,还有表关系,希望加关注。