SpringDataJpa注解
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
-
为一个实体生成一个唯一标识的主键、@GeneratedValue提供了主键的生成策略。
-
注解有两个属性,分别是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<>();