jpa

作者: Jason_c8d4 | 来源:发表于2022-02-14 09:12 被阅读0次

导入方式
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

配置

spring:
  datasource:
    password: 123456
    username: root
    url: jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=CTT&allowMultiQueries=true
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    # 开发开启 开启逆向工程 正向 根据实体类 生成表 逆向 根据表生成实体类
    generate-ddl: true
    hibernate:
      # create 每次运行 将原来的表删除 重新创建一个表
      # update 将实体类和表进行校正更新
      # validate 将实体类和表进行校正更新 不一致会抛出异常
      ddl-auto: none
    # 展示sql语句
    show-sql: true
    # 指定了数据库的类型
    #    database-platform: org.hibernate.dialect.MySQL57InnoDBDialect

映射方式
@Entity 映射 表——对象
@Column 映射 属性——字段 columnDefinition 默认值
@Id 主键id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键生成策略 自增
默认驼峰转下划线,如果需要定制则加上注解@Table(name = "table_name") 如果报Cannot resolve table 'table_name' 则需要在view->Tool Windows->Persistence 然后右击项目:选择Assign Data Source中选择相应的数据库Data Source就可以了

@Data
@Entity
@Table(name = "sns_moment")
public class SnsMoment {
    @Id
    // 主键生成策略 自增
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column
    private String content;
    @Column(columnDefinition = "0")
    private Integer status; //动态状态: 0-normal, 1-deleted
}

查询方式
1、接口中定义好的方法进行查询JpaRepository<T, ID>
2、jpql
jpa query language(jpa查询语句)
在接口方法上加上注解@query
3、sql原生语句 @Query注解中nativeQuery属性设为true
4、方法名称规则 使用jpa提供的方法名称规则定义方法,不需要配置jpql或sql
findBy(开头) 对象属性 like and between 等等
5、JpaSpecificationExecutor自定义动态查询。可配合if等动态语句使用。

更新和删除语句不仅需要@Query注解,还需要@Modifying注解。并在调用方方法上加上注解@Transactional(rollbackOn = {Exception.class})和@Rollback(value = false),Rollback不加会自动回滚

public interface SnsMomentDao extends JpaRepository<SnsMoment, Integer>,JpaSpecificationExecutor<SnsMoment> {

    @Query(value="from SnsMoment where id=?1")
    SnsMoment myFind(Integer id);

    @Query(value="select * from sns_moment", nativeQuery=true)
    List<SnsMoment> myFindAll(Integer id);

    // 更新操作需要添加Modifying注解 和Transactional Rollback
    @Query(value="update SnsMoment set shareCount=2 where id=?1")
    @Modifying
    Integer update(Integer id);

    List<SnsMoment> findByContentLikeAndStatus(String count, Integer status);
}
    @Test
//    @Transactional(rollbackOn = {Exception.class})
//    @Rollback(value = false)
    public void test(){
//        List<SnsMoment> list = snsMomentDao.findAll();
//        for(SnsMoment snsMoment : list){
//            System.out.println(snsMoment.getId());
//        }
//        snsMomentDao.save(new SnsMoment());
//        System.out.println(snsMomentDao.update(1));
//        System.out.println(snsMomentDao.myFind(1));
        List<SnsMoment> list = snsMomentDao.findByContentLikeAndStatus("%测试%", 1);
        System.out.println(list.size());
        for(SnsMoment snsMoment : list){
            System.out.println(snsMoment.getId()+ "--" +snsMoment.getContent());
        };
        String keyword = "测试";
        Specification<SnsMoment> specification = new Specification<SnsMoment>() {
            @Override
            public Predicate toPredicate(Root<SnsMoment> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Path<Object> status = root.get("status");
                Path<Number> type = root.get("type");
                Path<Object> content = root.get("content");
                Predicate predicate1 = criteriaBuilder.equal(status, 1);
//                return predicate1;
                Predicate predicate2 = criteriaBuilder.lt(type, 1);
                Predicate and = criteriaBuilder.and(predicate1, predicate2);
//                criteriaBuilder.or(predicate1, predicate2);
//                return and;
                if(StringUtils.isNotEmpty(keyword)) {
                    Predicate predicate3 = criteriaBuilder.like(content.as(String.class), "%"+keyword+"%");
                    Predicate and2 = criteriaBuilder.and(predicate3, and);
                    return and2;
                }
                else{
                    return and;
                }
            }
        };
//        Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
//        List<SnsMoment1> all = snsMomentDao.findAll(specification, sort);
//        System.out.println(all.size());
        Pageable pageable = PageRequest.of(0, 2, Sort.by(Sort.Direction.ASC, "id"));
        Page<SnsMoment> all = snsMomentDao.findAll(specification, pageable);
        System.out.println(all.getTotalElements()+"--"+all.getSize()+"__"+all.getContent().size());
        for(SnsMoment snsMoment : all){
            System.out.println(snsMoment.getId()+"--"+snsMoment.getCreateTime());
        }
    }

相关文章

网友评论

      本文标题:jpa

      本文链接:https://www.haomeiwen.com/subject/jdjbhltx.html