Spring Data的JPA详细学习

  1. jpa是什么?
    1)JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
    2)Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

  2. 为什么要学习JPA?
    1)个人认为,首先JPA 是 JCP 组织发布的 Java EE 标准之一,我们对于JAVA的面向对象能有更加深刻的理解。心中有对象,数据库表结构就会自动创建。
    2)JPA已经作为一项对象持久化的标准,不但可以获得Java EE应用服务器的支持,还可以直接在Java SE中使用。开发者将无需在现有多种ORM框架中艰难地选择。

  3. 开始学习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

临时字段,不会映射到数据库

下期我单独分享主键策略,还有表关系,希望加关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值