SpringBoot项目实战(二):数据库

前言

本章将会基于上一章的应用进行改造。增加数据库对于数据库的操作。

使用JPA连接数据库

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

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

上一章: SpringBoot项目实战(一):HelloWorld

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值