Spring Boot入门篇二: spring-data-jpa + mysql 集成

写在前面

  • 传送门 Spring Boot入门篇一
  • 遇到问题先百度,没有什么百度解决不了的问题,如果没有,就谷歌。
  • 上回我们谈到如果使用 Spring Boot 构建一个简单的 JSP 项目,这里是官方提供的 spring-boot-sample-tomcat-jsp ,不清楚的可以移步到这里。
  • 这回,我们沿用上回搭建好的框架继续往里面添加东西。

本篇目标

  • 集成 mysql 数据库
  • 集成 spring-data-jpa
  • 创建 User 类
  • 创建 UserDao 类
  • 创建 UserService 接口及其实现类
  • 创建 UserController 类
  • 并且,前端通过 ajax 实现一个简单的查询功能

实现步骤

1. 集成 mysql 数据库

这个很简单,只需要在我们的 pom.xml 文件中,增加 mysql 的依赖,代码如下:



  mysql
  mysql-connector-java

然后,配置我们的数据源,哪里配置? 对了,在我们的 application.properties 文件中,不知道的同学可以看下第一篇讲的。下面是我的配置:

# mysql connection config
spring.datasource.url=jdbc\:mysql\://localhost\:3306/archer?useUnicode\=true&characterEncoding\=utf8
spring.datasource.username=admin
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

至此,我们 mysql 的集成已经告一段落了,

2. Spring Data JPA 集成

下面是 spring-data-jpa 的集成。同样,你也需求在 pom.xml 中增加相关依赖:



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

application.properties 中增加 JPA 的相关配置:

# JPA
spring.jpa.open-in-view=true
spring.jpa.hibernate.ddl-auto=update

这里需要说下这两个配置的作用:

  • spring.jpa.open-in-view=true
    • 官方解释:Register OpenEntityManagerInViewInterceptor. Binds a JPA EntityManager to the thread for the entire processing of the request. 翻译一下就是说:注册 OpenEntityManagerInViewInterceptor 拦截器。将JPA EntityManager 绑定到整个请求处理的线程。
  • spring.jpa.hibernate.ddl-auto=update
    • 当我们创建好实体类,启动项目,这个配置会帮我们自动创建表。

3. 创建 User 类

完整的代码如下:

package com.example.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "user")
public class User implements Serializable {
    private static final long serialVersionUID = -2248190721476487645L;

    @Id
    @SequenceGenerator(name = "user_generator", sequenceName = "user_generator", initialValue = 23)
    @GeneratedValue(generator = "user_generator")
    @Column(name = "id")
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

4. 创建 UserDao 类

完成的代码如下:

package com.example.dao;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;

import com.example.domain.User;

public interface UserDao extends PagingAndSortingRepository {

    Page findAll(Pageable pageable);
    
    @Query("from User as u")
    List findUsers();
    
    User findByName(String name);
}

5. 创建 UserService 接口及其实现类

以下是 UserService 接口的完整代码:

package com.example.service;

import java.util.List;

import com.example.domain.User;

public interface UserService {
    
    List findUser();

}

我这里只定义了一个查询接口,主要是为了演示。下面是它的实现类的完整代码,即 UserServiceImpl 类:

package com.example.service;

import java.util.List;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.example.dao.UserDao;
import com.example.domain.User;

@Component("userService")
@Transactional 
public class UserServiceImpl implements UserService {
    
    private final UserDao userDao;
    
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public List findUser() {
        return this.userDao.findUsers();
    }

}

6. 创建 UserController 类

完整的代码如下:

package com.example.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.domain.User;
import com.example.service.UserService;

@Controller
public class UserController {

    @Autowired
    private UserService userService;
    
    @RequestMapping("/user/list")
    @ResponseBody
    @Transactional(readOnly = true)
    public List getUsers() {
        return userService.findUser();
    }
}

所有的后台代码都已经编写完成,下面我们来测试一下。

7. 使用 Ajax 测试后端 Restful API 接口

  • 首先,我们需要在 index.jsp 中引入 jQuery 工具库和我们自定义的 js 文件:

  
  

  • 其次,我们需要在 main.js 中增加如下代码:
;(function($) {
  // 声明严格模式
  'use strict';
  
  // DOM 加载完成执行
  $(function () {
    // 异步加载数据
    $.ajax({
      url: './user/list',
      type: 'POST',
      dataType: 'JSON',
      success: function (data) {
        console.log(data); // [{id:1, name:"zs"},{id:2, name:"李思"}]
      }
    });
  });

})(jQuery)

当我们访问 localhost:8080F12 启用 chrome 浏览器控制台可以看到:

image.png

好了,感谢你的阅读,Enjoy it~

相关资源

  • application.xml 官方配置清单
  • spring-boot-sample-data-jpa 官方示例

你可能感兴趣的:(Spring Boot入门篇二: spring-data-jpa + mysql 集成)