SpringBoot jpa

225 阅读5分钟

参考资料: 主要参考 参考

官网

何为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的核心概念:

  1. Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。
  2. CrudRepository :是Repository的子接口,提供CRUD的功能
  3. PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能
  4. JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操3作等。
  5. JpaSpecificationExecutor:用来做负责查询的接口
  6. 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类自动更新表结构

以上配置全部正确,则这个时候运行这个项目 系统自动将数据表给我们建好了。在数据库中查看表及表结构