使用 JPA 的注解,来配置实体类,指定实体类和数据库表之间的关系,指定实体类中的属性名和数据库表中的字段之间的关系。
指定实体类的数据库表之间的关系
@Entity 注解和 @Table 注解,加在实体类的上面
@Entity 指定当前类是一个实体类
@Table(name = '''') 指定当前实体类对应数据库中的哪个表
指定实体类中的属性名和数据库表中的字段之间的关系
@Id、@Colum、@GeneratedValue、@JsonFormat 加在实体类中的属性上
@Id 指定当前的实体类属性在数据库表中是主键
@GeneratedValue(strategy = '' '',generator=" ")
指定主键的生成方式,strategy :指定主键生成策略,generator:选择主键别名
strategy 默认有四种情况:
SEQUENCE :使用数据库序列,要求使用的数据库必须支持序列,比如Oracle
AUTO:由程序自动控制,自动选择使用哪种生成方式
IDENTITY:自增,要求使用的数据库必须支持自动增长,比如 mysql、sqlserver
Table:jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
@SequenceGenerator(sequenceName = " ",name = " ")
指定数据库序列别名,当主键的生成方式指定为 SEQUENCE 时,才会用到这个注解
sequenceName:数据库序列名,与 generator 相同。name:别名
@Colum(name = " ",unique = " ",nullable = " ",nserttable = " ",updateable = " ")
指定当前实体类属性在数据库表中对应的字段是哪一个
name:表中的字段名,unique:是否是唯一的,nullable:是否可以为空,nserttable:是否可以插入,updateable:是否可以修改
@JsonFormat(pattern = " ",timezone = " ")
将数据库中的时间类型数据,转换成想要的格式,赋值给此实体类属性,pattern:展示的格式,timezone:国际时间
编写Dao层接口使用 SpringDataJpa 后,只需要编写 dao 层的接口即可,无需编写接口对应的实现类。但是在编写接口的时候,必须继承两个接口,JpaRepository
JpaRepository
PagingAndSortingRepository
CrudRepository
PagingAndSortingRepository
JpaSpecificationExecutor
dao 接口中,有两个根据 id 查询对象的方法,findOne() 和 getOne()
findOne() 底层是用 em.find() 方法查询对象,立即加载
getOne() 底层使用 em.getReference() 延时加载,返回的是一个动态代理对象,当这个对象被使用的时候,才会进行查询。
jpql查询使用 jpql 语句进行查询,需要在创建的 dao 接口中添加新的方法,在方法上使用注解 @Query() 进行 jpql 语句的编写。jpql 语句与 sql 类似,但有区别,sql 语句是对数据库中的表以及字段进行操作,而 jpql 语句是对实体类以及实体类中的属性名进行操作。
jpql 语句,编写的时候,有两种传参的方式
@Query(select userId,userName from User where userAge=?1) User findUserByuserAge(Integer userAge)
使用 ?+参数位置 进行参数的传递,参数位置表示当前 ? 占位符要匹配的参数,在方法的参数列表中的位置,位置从1开始,?1 就是表示,读取方法的参数列表中的第一个参数替换?
@Query(select userId,userName from User where userAge=:age) User findUserByuserAge(Integer age)
使用 :+参数名 进行参数的传递,参数名指的是方法列表中的参数名称,无顺序对照,参数名必须对应,或使用 @Param("参数名") 来进行传递
@Query(select userId,userName from User where userAge=:userAge)
User findUserByuserAge(@Param("userAge")Integer age)
jpql修改
使用 @Query() 注解也可以完成修改的操作,但是需要注意的是,需要在 dao 接口的方法上加入
@Modifying注解,以及在业务层上,加入开启事务的注解,以及取消自动回滚的注解
@Transactional
@Rollback(value = false)



