实体类注解:
@Data
用途:可自己生成getset方法(本地使用需要使用下载lombok插件)
@Entity
用途:表名这是一个Entity类
@Table(name = “数据库表名”)
用途:对应数据库表名
属性字段注解:
@Id
用途:声明这是主键id
@GeneratedValue(stratefy=GenerationType.IDENTITY)
用途:设置自增策略为自动
@Column
用途:包含长短、表结构中对应的列名等等。
使用方法:
1.创建repository.StudentRepository.interface extends JpaRepository<对应的类, 类中主键的类型>
2.JpaRepository接口会定制生成简单的怎删改查方法,可直接调用以下方法;
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.data.jpa.repository;
import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
也可以自定义sql,实例:
public interface StudentRepository extends JpaRepository<Student, Integer> {
public Optional<Student> findById(Integer id);
public List<Student> findByOld(Integer old);
@Query(nativeQuery = true, value = "select * from user where id=?1", nativeQuery = true)
public Optional<Student> findById2(Integer id);
}
nativeQuery = true 有于没有的区别;
- 有nativeQuery = true时,是可以执行原生sql语句,所谓原生sql,也就是说这段sql拷贝到数据库中,然后把参数值给一下就能运行了;
- 没有nativeQuery = true时,就不是原生sql,而其中的select * from xxx中xxx也不是数据库对应的真正的表名,而是对应的实体名,并且sql中的字段名也不是数据库中真正的字段名,而是实体的字段名;
自定义方法的实现规则:
Jpa本身还提供了一些自定义声明方法的规则,例如:在接口中使用关键字findBy、readBy、getBy作为方法名的前缀,拼接实体类中的属性字段(首字母大写),并可选择拼接一些SQL关键字来组合成一个查询方法,例如,对于用户实体,关键字可以这样使用:
1.And,如:findByIdAndName(Long id, String name);
2.Or,如:findByIdOrName(Long id, String name);
3.Between,如:findByCreateDateBetween(Date start, Date end);
4.LessThan,如:findByCreateDateLessThan(Date start);
5.GreaterThan,如:findByCreateDateGreaterThan(Date start);
6.IsNull,如:findByNameIsNull();
7.IsNotNull,与上等价
8.Like,如:findByNameLike(String name);
9.NotLike:与上等价
10.OrderBy,如:findByNameOrderByIdAsc(String name);
11.Not,如:findByNameNot(String name);
12.In,如:findByNameIn(Collection nameList);
13.NotIn,与上等价。
加入说上面这些还是不能够满足你的业务需求,你同样可以写一个自定义的方法,使用@Query注解+HQL语句实现你想要的效果
注意点:
- 怎么定义名字:如果是查询的话直接find,如果要添加条件By什么条件Id
如果能确认返回值只有一个或者0个,推荐使用Optional包装返回的Entity - 如果返回值可能有多个,则需要List来封装