何为JPA?
JPA是Java Persistence API的简写,是Sun官方提出的一种ORM规范!
对于Sun官网而言, 一是想简化现有Java EE和Java SE应用开发工作。 二是想整合ORM技术,实现天下归一。
对于JPA规范,都在包路径:javax.persistence.*下,像一些常用的如:@Entity、@Id及@Transient都在此路径下。这些也是一些现在市面上常用的ORM一些约定俗成的注解了。
简单来说,JPA是一套规范。所以使用Jpa的一个好处是,可以更换实现而不必改动太多代码。
Spring Data JPA提供的接口,也是Spring Data JPA的核心概念:
- Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。
- CrudRepository :是Repository的子接口,提供CRUD的功能
- PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能
- JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操3作等。
- JpaSpecificationExecutor:用来做负责查询的接口
- Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可。
关键字 方法命名 sql where字句
And findByNameAndPwd where name= ? and pwd =?
Or findByNameOrSex where name= ? or sex=?
Is,Equals findById,findByIdEquals where id= ?
Between findByIdBetween where id between ? and ?
LessThan findByIdLessThan where id < ?
LessThanEquals findByIdLessThanEquals where id <= ?
GreaterThan findByIdGreaterThan where id > ?
GreaterThanEquals findByIdGreaterThanEquals where id > = ?
After findByIdAfter where id > ?
Before findByIdBefore where id < ?
IsNull findByNameIsNull where name is null
isNotNull,NotNull findByNameNotNull where name is not null
Like findByNameLike where name like ?
NotLike findByNameNotLike where name not like ?
StartingWith findByNameStartingWith where name like ‘?%’
EndingWith findByNameEndingWith where name like ‘%?’
Containing findByNameContaining where name like ‘%?%’
OrderBy findByIdOrderByXDesc where id=? order by x desc
Not findByNameNot where name <> ?
In findByIdIn(Collection<?> c) where id in (?)
NotIn findByIdNotIn(Collection<?> c) where id not in (?)
True findByAaaTue where aaa = true
False findByAaaFalse where aaa = false
IgnoreCase findByNameIgnoreCase where UPPER(name)=UPPER(?)
####SpringBoot集成Spring-data-jpa
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
编写User的实体类
@Entity//@Entity 是一个必选的注解,声明这个类对应了一个数据库表。
@Table(name="users")//自定义表名,如果没有指定,则表名和实体的名称保持一致。
@Getter
@Setter
public class User implements Serializable {
/**
* 唯一标示
*/
@Id //@Id 注解声明了实体唯一标识对应的属性。
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 编码
*/
@Column
private String code;
/**
* 名称
*/
@Column
private String name;
/**
* 创建时间
*/
@CreatedDate //自动创建
@Column
private Date gmtCreate;
/**
* 修改时间
*/
@LastModifiedDate //有修改时 会自动时间
@Column
private Date gmtModified;
}
@Entity 是一个必选的注解,声明这个类对应了一个数据库表。 @Table(name = "AUTH_USER") 是一个可选的注解。声明了数据库实体对应的表信息。包括表名称、索引信息等。如果没有指定,则表名和实体的名称保持一致。 @Id 注解声明了实体唯一标识对应的属性。 @Column(length = 32) 用来声明实体属性的表字段的定义。默认的实体每个属性都对应了表的一个字段。字段的名称默认和属性名称保持一致(并不一定相等)。字段的类型根据实体属性类型自动推断。这里主要是声明了字符字段的长度。如果不这么声明,则系统会采用 255 作为该字段的长度
@GeneratedValue @GeneratedValue(strategy = GenerationType.IDENTITY)
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
- TABLE:使用一个特定的数据库表格来保存主键。
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
- IDENTITY:主键由数据库自动生成(主要是自动增长型)
- AUTO:主键由程序控制。
- TABLE比较复杂,这里不讲解。分别介绍其他三个:
dao层
/**
* 资源类
*
* @author oKong
*/
public interface UserDao extends PagingAndSortingRepository<User, Long> {
Optional<User> findById(Long id);
//使用自动命名规则进行查询服务
List<User> findByCodeAndName(String code, String name);
List<User> findUserByCode(String code);
//分页
Page<User> findByCode(String code, Pageable pageable);
//使用@Query进行 自定义sql编写
//nativeQuery=true,正常的sql语法
//负责是hsql语法
@Query(value = "select * from users where code = :code", nativeQuery = true)
List<User> queryByCode(@Param("code") String code);
List<User> findByNameContaining(String name);
}
注意:这里直接继承了PagingAndSortingRepository,其本身实现了分页功能,还可以按需要继承CrudRepository或者JpaRepository等。而且,占位符为:?+具体的参数索引值
控制层
/**
* 测试类
*
* @author
*/
@RestController
@Slf4j
public class DemoController {
@Autowired
UserDao userDao;
@PostMapping("/add")
public String addUser(@RequestBody User user) {
log.info("新增用户:{}", user);
try {
user = userDao.save(user);
} catch (Exception e) {
e.printStackTrace();
}
return "新增成功,返回用户id为:" + user.getId();
}
@GetMapping("/find/{id}")
public Optional<User> findUser(@PathVariable Long id) {
log.info("查找用户ID:{}", id);
return userDao.findById(id);
}
@GetMapping("/del/{id}")
public String delUser(@PathVariable Long id) {
log.info("删除用户ID:{}", id);
userDao.deleteById(id);
return "用户id为:" + id + ",已被删除!";
}
@GetMapping("/findName")
public List<User> findUserByCodeAndName(@RequestParam("code") String code, @RequestParam("name") String name) {
log.info("命名规则方式,查找用户:编码:{},名称:{}", code, name);
return userDao.findByCodeAndName(code, name);
}
@GetMapping("/findNameTest")
public List<User> findUserByCode(@RequestParam("code") String code,@RequestParam("name") String name) {
// log.info("命名规则方式,查找用户:编码:{},名称:{}", code, name);
List<User> list = userDao.findByNameContaining(name);
String result = JSON.toJSONString(list);
log.info(result);
return userDao.findUserByCode(code);
}
@GetMapping("/find/paging/{code}")
public Page<User> findUserByCodePagin(@PathVariable("code") String code) {
log.info("分页模式,查找用户:编码:{}", code);
//这里注意 page是从0开始的
return userDao.findByCode(code, new PageRequest(0, 10));
}
@GetMapping("/find/sql/{code}")
public List<User> findUserByQuerySql(@PathVariable("code") String code) {
log.info("自定义sql方式,查找用户:编码:{}", code);
return userDao.queryByCode(code);
}
}
配置文件
main:
allow-bean-definition-overriding: true
jpa:
properties:
hibernate:
temp:
use_jdbc_metadata_defaults: false
show-sql: true #显示sql
hibernate:
ddl-auto: update#第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构
以上配置全部正确,则这个时候运行这个项目 系统自动将数据表给我们建好了。在数据库中查看表及表结构