SpringBoot之jpa支持

1:导入pom.xml依赖(也可在建项目过程中勾选)

        
            org.springframework.boot
            spring-boot-starter-data-jpa
        

2:application.yml添加配置

spring:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

3:jpa自动简表的代码(通过实体类可自动在数据库简表)

@Entity
//数据库表名
@Table(name = "t_springboot_book")
public class Book {
    @Id
    @GeneratedValue//自动序列化
    private Integer bid;
    @Column(length = 100)
    private String bname;
    @Column
    private float price;

 

4:jpa增删改

dao层

package com.zking.springboot05.dao;

import com.zking.springboot05.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

/** 只要继承JpaRepository,通常所用的增删查改方法都有
    Jparepository中第一个参数  指操作的实体类
    Jparepository中第二个参数  指实体类对应表的的主键


  要使用高级查询必须继承JpaSpecificationExecutor
*/

public interface BookDao extends JpaRepository, JpaSpecificationExecutor {
    

}

service 的实现层

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    @Override
    public Book save(Book book) {
        return bookDao.save(book);
    }

    @Override
    public void deleteById(Integer bid) {
       bookDao.deleteById(bid);

    }

//查看所有
    @Override
    public List list(Book book) {

        return bookDao.findAll(new Specification() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Predicate predicate=criteriaBuilder.conjunction();
                if(book!=null && !"".equals(book.getBname())&&book.getBname()!=null){
                    predicate.getExpressions().add(criteriaBuilder.like(root.get("bname"),"%"+book.getBname()+"%") );
                }
                return predicate;
            }
        });
    }

    //查单个      springboot 1.5到2.0的跨越
    @Override
    public Book getOne(Integer bid) {
        return bookDao.findById(bid).get();
    }
}

 

controller层

@RestController
public class BookController {
    @Autowired
    private BookService bookService;

    @RequestMapping("/book/list")
    public List list(Book book){

        return bookService.list(book);
    }

    @RequestMapping("/book/add")
    public Book add(Book book){
        return bookService.save(book);
    }
//jpa中增加和修改都用save()方法
    @RequestMapping("/book/edit")
    public Book edit(Book book){

        return bookService.save(book);
    }

   @RequestMapping("/book/del")
    public String del(Book book){
        bookService.deleteById(book.getBid());
        return "success";
    }

    @RequestMapping("/book/getOne")
    public Book getOne(Book book){
        return bookService.getOne(book.getBid());
    }

}

 

5:所遇到的bug

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry xxxx for key 'PRIMARY'

违反主键约束,插入的自动增长值与数据库中的值相同,当插入的次数大于数据库中的数据就不会报错,目前不知道什么原因

6:springboot1.5  和2.0的区别

a:升级后,拦截器WebMvcConfigurerAdapter提示过时

升级后的springBoot,使用了java8的特性 default 方法,所以直接实现 WebMvcConfigurer 这个接口即可。


public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter

public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer

 

b: 根据用户id查看信息的方法

由userDao.findOne(bid) 转变为 userDao.findById(bid).get()


@Override
public Result getUserInfo(Long id) {
    /*
     *
     * 版本更新说明:
     * Spring Data JPA 1.xx:
     * 根据ID查询使用的是:T findOne(ID var)
     * 需要对返回值进行null判断,以判断是否能根据ID查询到对应的对象
     * Spring Data JPA 2.xx:
     * 根据ID查询使用的方法是:Optional findById(ID id)-->T t = Optional.get();
     * Optional是非null的,但是如果查不到的话,它的get方法会报错,no value present;
     * 所以在进行get之前,需要使用Optional.isPresent()方法进行判断
     *
     */
    Optional userById = userDao.findById(id);
    if (userById.isPresent()) {
        return Result.ok().put("user", userById.get());
    } else {
        return Result.error(615, "无效的查询请求");
    }
}
 

C:配置文件的报错

问题:
配置文件中项目名称配置报错:server.context-path: /spring
原因:
大量的Servlet专属的server.* properties被移到了server.servlet下

由此可以看出一些端倪,那就是server不再是只有servlet了,还有其他的要加入。

解决方案:
server.context-path: /spring改成server.servlet.context-path: /spring既可

你可能感兴趣的:(SpringBoot之jpa支持)