SpringDataJpa由Spring基于Hibernate开发的一个JPA框架。可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。与SpringBoot整合更是锦上添花,下面我将讲解其用法。
1. 实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | @Entity @Table(name = "t_accountinfo") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull(message = "用户名不能为空") @Column(length = 64,nullable = false,unique = true) private String username; @NotNull(message = "密码不能为空") private String password; private int age; @Lob private String image; @Email(message = "邮箱格式错误") private String email; @Size(max=11,min=11,message="你所输入手机号不是11位") private String phone; @CreationTimestamp private Timestamp createTime; @UpdateTimestamp private Timestamp updateTime; //此处 get() set()省略。。。 } |
1. @Entity:代表这是一个实体Bean;@Table():其中的name属性代表的是所映射数据库表的名字,如果没有@Table,默认生成类名对应的表。如:User(类)->user(表); HuUser(类)->hu_user(表)
2. @Id:代表这是一个主键;
3. @GeneratedValue()增长策略:strategy属性其中有四个用法:
- TABLE:使用一个特定的数据库表格来保存主键。
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
- IDENTITY:主键由数据库自动生成(主要是自动增长型)
- AUTO:主键由程序控制。
- 如果你想字符串生成uuid可自定义生成策略:@GenericGenerator(name = “uuid”,strategy = “uuid”)@GeneratedValue(generator = “uuid”)
4.@Column()代表字段映射的一些属性
- lenth:表示该字段的长度,默认为255
- nullable:表示该字段是否为空,默认为ture;注解使用@NotNull: message:为空时抛出的错误信息
- unqique:表示该字段是否唯一;默认为false;
- 其他的没用过!!!
5. 字段约束
- @Size表示字段一些约束:mix:最小长度;max:最大长度,message:表示违反约束抛出的错误信息
- @Enail:表示该字段格式必须为邮箱格式,其中message表示不满足时抛出的错误信息
- @Pattern:regexp属性:正则表达式,message属性:不满足时抛出的错误信息
6. @Lob:该字段映射表中该字段类型为text属性
7. @CreationTimestamp:表示插入数据自动生成时间; @UpdateTimestamp:更新数据时生成当前时间;
8. @OneToMany一对多,@ManyToOne多对一
- mappedBy:用于双向关联时使用,值为放弃维护的表名,否则会引起数据不一致的问题
- fetch:可取的值有FetchType.EAGER:即时加载;FetchType.LAZY:懒加载;@OneToMany中默认为懒加载
- cascade:CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)、CascadeType.ALL(选择全部)
9. @ManyToOne多对一
- optional 属性是定义该关联类对是否必须存在,值为false时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。 值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。 optional 属性的默认值是true。
- 其他和 @OneToMany一样,注意:fetch默认为即时加载
9. @ManyToMany多对多
- fetch默认为懒加载
- 定义多对多时的其他配置:实例
1 2 3 4 5 | //name:第三张表的表名; joinColumns和inverseJoinColumns::name:字段名;referencedColumnName:绑定哪个字段名,nullable:是否可以为空; @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id",referencedColumnName = "Id",nullable = false), inverseJoinColumns =@JoinColumn(name = "role_id",referencedColumnName = "id",nullable = false)) |
10. 其他
- @NotNull:不能为空 message:为空时抛出的错误信息
2. 接口
这里我就讲解我所用的:
1 | extends JpaRepository<User,Long> |
定义一个接口继承此接口 <User,Long>第一个值为映射表中的类名,第二个值为此类的Id类型
默认的方法:
- save:新增或修改一条数据;saveAll:新增或修改多条数据; 注意:当传入的数据没有id时,会是修改数据
- delete:删除一条数据;deleteById:根据id删除数据;
- findById:根据id查询信息,返回的是Optional<>类型;
- finAll:查询所有信息;返回类型一个是List,一个是Page:分页的类型
- 还有其他的方法暂时没研究;
当然这些往往不够,还有一些自定义的方法:
- 关键字—————–样例——————————–对应sql
- And——————findByUsername——————…where username=?1
- Or——————-findByUsernameOrAge————-…where username=?! or age=?2
- Like—————–findByUsernameLike————-…where username like ?1
- Between————–findByAgeBetween—————…where age between 1? and ?2
- LessThan————–findByAgeLessThan————-…where age<?1
- LessThanEqual————-findByAgeLessThanEqual————-…where age<=?1
- GreaterThan—————findByAgeGreaterThan—————…where age>?1
- GreaterThanEqual————-findByAgeGreaterThanEqual————-…where age>=?1
findDistinct:去重;
其他:还有其他关键字我就不写了,可以去查;
3. @Query
如果上面那些还不能达到你的要求,那就是用@Query
- 属性:nativeQuery = true时 代表可以写原生的sql语句了。。对,没错原生的,不是hql语句;例子:
1 2 | @Query(value = "SELECT c.id,c.name,c.create_time,c.update_time,c.comment FROM aimi_store.user_role AS a JOIN aimi_store.aimi_user AS b ON a.user_id=b.id JOIN aimi_store.`role` AS c ON a.role_id=c.id WHERE b.id=?1",nativeQuery = true) List<Role> listRoleByUser(String Id); |
没错,任何sql语句都可以写,所以,,可以和mybatis一较高下来了;
还有其他很多功能我就不一一说出来了,你们可以看文档;
1. 总结
Spring Data Jpa 是真的太强大了,不仅有默认的基本方法,分页简单;还可以写原生sql语句。和SpringBoot整合,简直完美!!!