前言
本章将会基于上一章的应用进行改造。增加数据库对于数据库的操作。
使用JPA连接数据库
1. 增加数据源配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2.创建表
在demo库下增加一张名为t_book的表,其中author和publisher先采用字符串来存储。
create table t_book
(
id int auto_increment
primary key,
title varchar(500) default '' not null comment '名称',
subTitle varchar(500) null comment '副标题',
price float null comment '售价',
author varchar(500) null comment '作者',
book_desc varchar(3000) null comment '描述',
publisher varchar(200) null comment '出版社'
)
comment '书籍';
t_book表有3中字段命两种命名规则:分别是subTitle驼峰法和book_desc下划线分割的方式。
3.创建实体
创建Book实体类。所在包com.ls.simple.dto
。
@Entity(name = "t_book")
public class Book {
@Id
private Long id;
@Column
private String title;
@Column
private String subTitle;
@Column
private Float price;
@Column
private String author;
@Column
private String bookDesc;
@Column
private String publisher;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSubTitle() {
return subTitle;
}
public void setSubTitle(String subTitle) {
this.subTitle = subTitle;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getBookDesc() { return bookDesc; }
public void setBookDesc(String bookDesc) { this.bookDesc = bookDesc; }
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
}
@Entity
注解表面Book为一个实体,name表示映射的表名为t_book
,如果表名与实体名相同可以忽略name。
@Id
表明了逐渐
@Column
表明字段名。此处所有的字段都先不为@Column
设置属性值。
4.创建Repository
创建BookRepository接口,所在包com.ls.simple.repository
public interface BookRepository extends JpaRepository<Book,Long> {
}
接口并没有任何实现。
5.创建service
创建接口BookService,所在包com.ls.simple.service
public interface BookService {
List<Book> queryAllBook();
Book addBook(Book book);
}
创建实现类BookServiceImpl,所在包com.ls.simple.service.impl
@Service
public class BookServiceImpl implements BookService {
@Resource
private BookRepository bookRepository;
@Override
public List<Book> queryAllBook() {
return bookRepository.findAll();
}
@Override
public Book addBook(Book book) {
Assert.notNull(book,"请求参数为null");
Assert.hasLength(book.getAuthor(),"作者不能为空");
Assert.hasLength(book.getTitle(),"书名不能为空");
Assert.hasLength(book.getPublisher(),"发行商不能为空");
return bookRepository.save(book);
}
}
6.调整controller
调整IndexController,注入了BookService服务,增加了getBookAll和addBook方法。
@RestController
public class IndexController {
@Autowired
private BookService bookService;
@RequestMapping("/")
public String index(){
return "Hello World";
}
@RequestMapping("/book/getAll")
public List<Book> getBookAll(){
return bookService.queryAllBook();
}
@RequestMapping("/book/addBook")
@ResponseBody
public Map<String,Object> addBook(Book book){
Map<String,Object> resultMap = new HashMap<>();
try{
book = bookService.addBook(book);
resultMap.put("success",true);
resultMap.put("msg","保存成功");
resultMap.put("body",book);
} catch (Exception e){
e.printStackTrace();
resultMap.put("success",false);
resultMap.put("msg",e.getLocalizedMessage());
}
return resultMap;
}
}
访问http://localhost:8080/book/getAll会发现有报错如下:
java.sql.SQLSyntaxErrorException: Unknown column 'book0_.sub_title' in 'field list'
虽然看起来实体类中subTitle与t_book表中的字段命名一致,但是jpa在解析实体类字段时,默认会把驼峰命名的字段转为_分割。所以就会提示在t_book中找不到sub_title字段。
更改实体类:
@Column(name = "subtitle")
private String subTitle;
重新启动应用再尝试。
7.尝试条件查询
BookRepository增加“根据作者查询相关书籍“的接口
List<Book> findByAuthor(String author);
BookService与BookServiceImpl也增加相应的实现代码
@Override
public List<Book> queryBookByAuthor(String author) {
Assert.hasLength(author,"作者不能为空");
return bookRepository.findByAuthor(author);
}
增加相应的controller接口,然后尝试访问。
结束语
本章主要实现接入数据库。
如果对您有帮助,请给个赞。
下一章将会接入redis