SpringDataJpa注解--学习需要坚持不懈-我必成功

本文详细解析SpringDataJPA中关键注解的使用,包括@Query、@Modifying、@Entity、@Column、@Id、@GeneratedValue、@OneToMany、@JoinColumn、@ManyToOne、@Transactional、@ManyToMany和@JoinTable,涵盖查询、修改、实体映射、关系管理及事务处理。
摘要由CSDN通过智能技术生成

SpringDataJpa注解

接口方法必须在dao接口中定义,且该接口继承JpaRepository、JpaSpecificationExecutor

public interface MyRepository<T> extends JpaRepository<T, String>, JpaSpecificationExecutor<T> {
    
}

符合SpringDataJpa的dao层接口规范

JpaRepository<操作的实体类类型,实体类中主键属性的类型>

封装了基本CRUD操作

JpaSpecifictionExecutor<操作的实体类类型>

封装了复杂查询(分页)

@Query

○代表的是进行查询

属性:

value:jpql语句或sql语句

nativeQuery:是否使用本地查询【false(使用jpql语句) 或true(使用本地查询:sql查询)】

//形参按照顺序传递值
@Query(value="from Customer where custName=? and custId=?")
public Customer findNameAndId(String name,Long id);
//形参没有按照顺序传递,需要在注解中声明位置。
@Query(value="from Customer where custName=?2 and custId=?1")
public Customer findNameAndId(Long id,String name);
@Query(value="select * from cat_customer",nativeQuery=true)
public List<Object []>findSql();;啦啦啦啦啦李乐 3呃呃呃鹅鹅鹅鹅鹅鹅饿 

@Modifying

与query配合使用,由query来声明Jpql语句

○当前执行的是一个更新操作

@Query(value="update Customer set custName=? where custId=?")
@Modifying
public Customer findNameAndId(String name,Long id);

@Entity

说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名 。如果想改变这种默认的orm规则,就要使用@Table来改变class名与数据库中表名的映射规则。

@Entity@Table(name = "his_announcement")
public class AnnouncementEntity extends MyEntity

@Column

用来标识实体类中属性与数据表中字段的对应关系

属性:

​ name
​ 定义了被标注字段在数据库表中所对应字段的名称;

​ unique
​ 表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。

​ nullable
​ 表示该字段是否可以为null值,默认为true。

​ insertable
​ 表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。

​ updatable
​ 表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。

​ columnDefinition(大多数情况,几乎不用)
​ 表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)

​ table
​ 表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。

​ length
​ 表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。

​ precision和scale
​ precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

@Column(name = "create_datetime", length = 20, nullable = false)
private String createDatetime = DateUtil.getCurrentDateToString();

@Id

用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上

@GeneratedValue

  1. 为一个实体生成一个唯一标识的主键、@GeneratedValue提供了主键的生成策略。

  2. 注解有两个属性,分别是strategy( GenerationType类型 )和generator(String类型 )

    generator属性的值是一个字符串,默认为"",其声明了主键生成器的名称

    (对应于同名的主键生成器@SequenceGenerator和@TableGenerator)

    strategy属性:提供四种值:

    • AUTO主键由程序控制, 是默认选项 ,不设置就是这个, 自动选择合适的策略
    • IDENTITY 采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式,适合mysql
    • SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持,适合oracle. 通过@SequenceGenerator 注解指定序列名
    • Table 通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
@GeneratedValue(generator = "paymentableGenerator")

@OneToMany

配置一对多关系

属性:

targetEntity:对方对象的字节码对象。

mappedBy:对方配置关系的属性名称.(用于放弃外键的维护权,只需要声明关系即可,不用加JoinColmn注解),一般是被选择一方放弃维护权,比如角色类型。

cascade:【CascadeType.ALL(所有)、CascadeType.MERGE(更新)、CascadeType.PERSIST(保存)、CascadeType.REMOVE(删除)】配置级联操作

fetch:【EAGER(立即加载)、LAZY(延迟加载)】配置关联对象的加载方式

@OneToMany(targetEntity=LinkMan.class)
@JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")
private Set<LinkMan> linkMans=new HashSet<>();
@OneToMany(mappedBy="customer")
private Set<LinkMan> linkMans=new HashSet<>();
@OneToMany(mappedBy="customer" cascade=CascadeType.ALL)
private Set<LinkMan> linkMans=new HashSet<>();

@JoinColumn

配置外键。配合声明表关系的注解使用,例:OneToMany注解

属性:

name:外键字段名称

referencedColumnName : 参照的主表的主键字段名称

@OneToMany(targetEntity=LinkMan.class)
@JoinColumn(name="lkm_cust_id",referenceColumnName="cust_id")
private Set<LinkMan> linkMans=new HashSet<>();

@ManyToOne

配置多对一关系

属性:

targetEntity:对方对象的字节码对象。

mappedBy:对方配置关系的属性名称.(用于放弃外键的维护权,只需要声明关系即可,不用加JoinColmn注解),一般是被选择一方放弃维护权,比如角色类型。

cascade:【CascadeType.ALL(所有)、CascadeType.MERGE(更新)、CascadeType.PERSIST(保存)、CascadeType.REMOVE(删除)】配置级联操作

fetch:【EAGER(立即加载)、LAZY(延迟加载)】配置关联对象的加载方式

@ManyToOne(targetEntity=Customer.class)
@JoinColumn(name="lkm_cust_id",referenceColumnName="cust_id")
private Customer customer;

@Transactional

配置事务。

默认自动回滚

故与**@Rollback(false)**搭配使用,代表不自动回滚。

@Transactional
@Rollback(false)
public void testAdd(){

}

@ManyToMany

配置多对多关系。

属性:

targetEntity:对方对象的字节码对象。

mappedBy:对方配置关系的属性名称.(用于放弃外键的维护权,只需要声明关系即可,不用加JoinColmn注解),一般是被选择一方放弃维护权,比如角色类型。

cascade:【CascadeType.ALL(所有)、CascadeType.MERGE(更新)、CascadeType.PERSIST(保存)、CascadeType.REMOVE(删除)】配置级联操作

fetch:【FetchType.EAGER(立即加载)、FetchType.LAZY(延迟加载)】配置关联对象的加载方式

@ManyToMany(targetEntity=Role.class)
@JoinTable(name="sys_user_role",joinColumns={@JoinColumn(name="sys_user_id",referencedColumnName="user_id")},inverseJoinColumns={@JoinColumn(name="sys_role_id",referencedColumnName="role_id")})
private Set<Role> roles=new HashSet<>();

@JoinTable

配合ManyToMany注解使用。

属性:

name : 中间表的名称

joinColumns : 配置当前对象在中间表的外键

inverseJoinColumns:配置对方对象在中间表中的外键

@ManyToMany(targetEntity=Role.class)
@JoinTable(name="sys_user_role",joinColumns={@JoinColumn(name="sys_user_id",referencedColumnName="user_id")},inverseJoinColumns={@JoinColumn(name="sys_role_id",referencedColumnName="role_id")})
private Set<Role> roles=new HashSet<>();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值