博客总结

一.毫无疑问,这种项目除却逻辑方面的内容,最重要的技术方面的就是增删改查这一块的

1.创建一个接口继承JpaRepository<要操作的类,这个类的主键>

2.就是增删改查的操作,不用自己在这个接口中实现就可以用的方法有save()增,delete(),save()改,findall(),getone(id)

3.需要自己在写一个方法来用的,比如findByUsernameAndPassword(String user,String pwd); 还有like,Betwwen ,or这些

4自定义查询。还是在JpaRepository中进行的@Query修饰自定义的语句,例子:

@Query("update Blog b set b.views = b.views+1 where b.id = ?1")
int updateViews(Long id);

 

 

 

二.复杂查询

实现复杂查询只需要让继承JPARepository的那个接口再继承JPASpecificationExcutor<Blog>接口就行了

这样我们在进行查询的时候就可以使用了:比如

...repository.findall(        new Specification<Blog>(

public Predicate toPredicate(Root<Task> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

//cb用来进行进行搞执行条件的

//query是用来放条件的集合的?

//root是我们操作的对象

return null;

}

)           ,pageable  )

比如这些傻逼代码:

return blogRepository.findAll(new Specification<Blog>() {
        @Override
        //三个参数 第一个是要对哪个对象进行操作,第二个是查询的条件的容器,第三个是设置具体某一个条件的表达式
        public Predicate toPredicate(Root<Blog> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            List<Predicate> predicates = new ArrayList<>();
            if (!"".equals(blog.getTitle()) && blog.getTitle() != null) {
                predicates.add(cb.like(root.<String>get("title"), "%"+blog.getTitle()+"%"));
            }
            if (blog.getTypeId()!= null) {
                predicates.add(cb.equal(root.<Type>get("type").get("id"), blog.getTypeId()));
            }
            if (blog.isRecommend()) {
                predicates.add(cb.equal(root.<Boolean>get("recommend"), blog.isRecommend()));
            }
            cq.where(predicates.toArray(new Predicate[predicates.size()]));
            return null;
        }
    },pageable);
}

接下来就是我对标签的操作了(博客管理,分类 管理应该跟这个一样)

1.删除操作的是时候如果这个分类里卖弄有东西的话应该是删除不了的,因为外键相连。

在pojo中@GeneratedValue 放在id上面,AUTO主键由程序控制, 是默认选项 ,不设置就是这个
 
-IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
 
-SEQUENCE 通过数据库的序列产生主键, MYSQL  不支持
 
-Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
默认SpringBoot的@GeneratedValue 是不需要加参数的,但是如果数据库控制主键自增(auto_increment), 不加参数就会报错

 

使用Jpa进行更新的操作

从方法的参数里面传过来一个tag

Tag tag1=tagRespository.getOne(id);

BeanUtils.copyProperies(tag,tag2);//把tag保存进tag2

BindingResult:

Tag tag1=tagRepository.findByName(tag.getName());
if(tag1!=null)
{
    bindingResult.rejectValue("name","nameError","不能重复啊傻孩子");
}




if (bindingResult.hasErrors()) {
    return "admin/tags-input";
}

有 这个操作再有重复的数据的时候就会输出不能重复啊傻孩子,但是要与@Valid Tag tag,BindingResult bindingresult合用。

新操作:牛逼吧
@Query("select t from Tag t")
List<Tag> findTop(Pageable pageable);
Sort sort = new Sort(Sort.Direction.DESC, "blogs.size");
Pageable pageable = new PageRequest(0, size, sort);
return tagRepository.findTop(pageable);

 

 

@OneToMany(mappedBy = "author",cascade=CascadeType.ALL,fetch=FetchType.LAZY)

 //级联保存、更新、删除、刷新;延迟加载。当删除用户,会级联删除该用户的所有文章

 //拥有mappedBy注解的实体类为关系被维护端(就是只有一个,他是大哥)

 //mappedBy="author"中的author是Article中的author属性

   private List<Article> articleList;//文章列表

 

对于cascade:

  • CascadeType.REMOVE
    Cascade remove operation,级联删除操作。
    删除当前实体时,与它有映射关系的实体也会跟着被删除。
  • CascadeType.MERGE
    Cascade merge operation,级联更新(合并)操作。
    当Student中的数据改变,会相应地更新Course中的数据。
  • CascadeType.DETACH
    Cascade detach operation,级联脱管/游离操作。
    如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
  • CascadeType.REFRESH
    Cascade refresh operation,级联刷新操作。
    假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存。(来自良心会痛的评论)
  • CascadeType.ALL
    Cascade all operations,清晰明确,拥有以上所有级联操作权限。

懒加载: FatchType.LAZY   :在加载一个实体的时候,不会马上从数据库中加载,即从数据库中加载到内存。

急加载:FatceType.EAGER :在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询。

@ManytoMany   太牛逼了,会生成一个中间表,他大爷的

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值