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既可