前面学习了一个简单的Spring Boot框架的搭建,以及配置文件的基础部分,今天来记录一下最近所学操作数据库的一个工具JPA,这个JPA可以让你基本不需要写SQL语句就可以执行增删改查的操作。当然了,如果涉及到比较复杂的操作的话,也可以使用原生的SQL语句。

引入依赖

首先要使用JPA的话,肯定是需要引入依赖的,既然要使用JPA操作数据库的话,数据库的驱动依赖也是必不可少的。对数据库的操作无非增删改查,为了方便演示,这里还需要引入一个模板引擎来渲染页面,模板引擎有很多种,这里选择freemarker。

<!-- JPA依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- freemarker依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MySQL依赖 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

准备数据

  1. 这里我们是用的是MySQL,先建一个简单的数据表吧。
CREATE DATABASE jpadb;
USE jpadb;
CREATE TABLE superhero
(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20) NOT NULL ,
  sex CHAR(2) NOT NULL ,
  age int NOT NULL ,
  skill VARCHAR(50) NOT NULL
)CHARSET utf8;

然后随便插入几条数据,备用。

  1. 建立对应的实体类
@Entity
@Table(name = "superhero") //这里需要指定我们刚刚建好的数据表,因为JPA会自动帮助键表
public class SuperHero {
    @Id
    @GeneratedValue //自增注解
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    private String skill;
      //省略get和set方法
}

建立Repository接口

新建一个类SuperHeroRepository,使用JPA的关键就是这个Repository接口,使用它可以方便的对实体类进行访问。

public interface SuperHeroRepository extends JpaRepository<SuperHero,Integer> {}

像上面这样就好了?对,目前是这样的!

Service层

哈哈,现在就可以使用Service对数据库进行操作啦!

//Service注解,必须写!不然Controller使用Service的时候运行会报错。
@Service
public class SuperHeroService {
      //@Autowired,自动注入,用过SSM的都知道,这里可以自动注入
    @Autowired
    private SuperHeroRepository superHeroRepository;

    /**
     * 查询所有超级英雄
     * @return List
     */
    public List<SuperHero> findAll(){
        return superHeroRepository.findAll();
    }
}

现在就可以查询superhero表中所有的超级英雄,并且findAll方法返回的数据类型就是List,非常方便!

Controller处理并渲染页面

Service层写好之后,就可以使用Controller来处理并渲染页面了。这里要注入Service类同样可以使用自动注入。

@Controller
public class IndexController {
      //自动注入
      @Autowired
    private SuperHeroService superHeroService;

      //设置请求路径为/heros
    @GetMapping(value = "/heros")
    public String index(Model model){
          //调用service层的findAll方法查询所有数据
        List<SuperHero> superHeroList = superHeroService.findAll();
          //使用Model对象保存数据
        model.addAttribute("superHeroList",superHeroList);
          //返回freemarker模板的名称,所以需要在templates文件夹下建立index.ftl文件
        return "index";
    }
}
<!-- index.ftl -->
<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <table>
            <tr>
                <th>编号</th>
                <th>名字</th>
                <th>性别</th>
                <th>年龄</th>
                <th>技能</th>
            </tr>
              <!-- 这是freemarker的循环语法,可以自行去了解 -->
            <#list superHeroList as superHero>
                <tr>
                    <td>${superHero.id}</td>
                    <td>${superHero.name}</td>
                    <td>${superHero.sex}</td>
                    <td>${superHero.age}</td>
                    <td>${superHero.skill}</td>
                </tr>
            </#list>
        </table>
    </body>
</html>

好啦,现在所有代码就写完啦!但是似乎还忘了什么,对的,application.yaml还没配置。

# 指定访问端口 默认是8080
server:
  port: 8090

spring:
# 配置数据源,主要有classname,url,username,password
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jpadb
    username: root
    password:  123456
# jpa配置
  jpa:
      # 是否在控制台显示sql语句
    show-sql: true
    hibernate:
    # 这个就比较关键了,如果想让它自动建表的话,可以写create和update,但是create每次运行项目的时候,都会重建一次,update则不会,只会更新数据表接口,数据还在。
      ddl-auto: update

好了,一个简单的查询就做好了,访问localhost:8090就可以看到下面的表格啦!