Spring Boot 揭祕與實戰(二) 資料儲存篇 - JPA

樑桂釗發表於2017-01-03

本文講解 Spring Boot 基礎下,如何整合 JPA 框架,編寫資料訪問。

部落格地址:blog.720ui.com/

環境依賴

修改 POM 檔案,新增 spring-boot-starter-data-jpa 依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>複製程式碼

新增 mysql 依賴。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.35</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.14</version>
</dependency>複製程式碼

資料來源

使用 Spring Boot 預設配置, 在 src/main/resources/application.properties 中配置資料來源資訊。

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_db
spring.datasource.username=root
spring.datasource.password=root複製程式碼

通過 Java Config 方式配置。

@Configuration
@EnableJpaRepositories("com.lianggzone.springboot.action.data.jpa")
@EntityScan("com.lianggzone.springboot.action.data.jpa.entity")   
public class JPAConfig {}複製程式碼

指令碼初始化

先初始化需要用到的SQL指令碼。

CREATE DATABASE /*!32312 IF NOT EXISTS*/`springboot_db` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `springboot_db`;

DROP TABLE IF EXISTS `t_author`;

CREATE TABLE `t_author` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '使用者ID',
  `real_name` varchar(32) NOT NULL COMMENT '使用者名稱稱',
  `nick_name` varchar(32) NOT NULL COMMENT '使用者匿名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;複製程式碼

JPA 整合方案一 通過繼承 JpaRepository 介面

實體物件

建立一個 Author 實體,真實的表名是 t_author,包含 id(自增主鍵)、 realName、 nickname 欄位。

@Entity
@Table(name = "t_author")
public class Author{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;

    @Column(name="real_name")
    private String realName;

    @Column(name="nick_name")
    private String nickName;

    // SET和GET方法
}複製程式碼

DAO相關

資料訪問層,通過編寫一個繼承自 JpaRepository 的介面就能完成資料訪問。值得注意的是,這個的 from 物件名,而不是具體的表名。

public interface AuthorRepository extends JpaRepository<Author, Long> {

    List<Author> findAll();

    @Query("from Author where id = :id")
    Author findAuthor(@Param("id") Long id);
}複製程式碼

Service相關

簡單的呼叫 DAO 相關方法。

@Service("jpa.authorService")
public class AuthorService {
    @Autowired
    private AuthorRepository authorRepository;   
    public List<Author> findAll() {
        return this.authorRepository.findAll();
    }  
    public Author findAuthor(Long id){
        return this.authorRepository.findAuthor(id);
    }
}複製程式碼

Controller相關

為了展現效果,我們先定義一組簡單的 RESTful API 介面進行測試。

@RestController("jpa.authorController")
@RequestMapping(value = "/data/jpa/author")
public class AuthorController {

    @Autowired
    private AuthorService authorService;

    /**
     * 查詢使用者列表
     */
    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Object> getAuthorList(HttpServletRequest request) {
        List<Author> authorList = this.authorService.findAll();
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("total", authorList.size());
        param.put("rows", authorList);
        return param;
    }

    /**
     * 查詢使用者資訊
     */
    @RequestMapping(value = "/{userId:\\d+}", method = RequestMethod.GET)
    public Author getAuthor(@PathVariable Long userId, HttpServletRequest request) {
        Author author = this.authorService.findAuthor(userId);
        if (author == null) {
            throw new RuntimeException("查詢錯誤");
        }
        return author;
    }
}複製程式碼

JPA 整合方案二 通過呼叫 EntityManager 類方法

實體物件

@Entity
@Table(name = "t_author")
public class Author{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;

    @Column(name="real_name")
    private String realName;

    @Column(name="nick_name")
    private String nickName;

    // SET和GET方法
}複製程式碼

DAO相關

資料訪問層,通過編寫一個呼叫EntityManager 類方法。值得注意的是,這個的 from 物件名,而不是具體的表名。

public interface AuthorDao {
    List<Author> findAll();    
    Author findAuthor(Long id);
}

@Repository
public class AuthorDaoImpl implements AuthorDao {
    @PersistenceContext
    private EntityManager entityManager;
    @Override
    public List<Author> findAll() {
        return this.entityManager
                .createQuery("select t from Author t", Author.class)
                .getResultList();
    }    
    @Override
    public Author findAuthor(Long id){
        return this.entityManager
                .createQuery("select t from Author t where id = ?", Author.class)
                .setParameter(1, id)
                .getSingleResult();
    }

}複製程式碼

Service相關

簡單的呼叫 DAO 相關方法。

@Service("jpa.authorService2")
public class AuthorService2 {    
    @Autowired
    private AuthorDao authorDao;   
    public List<Author> findAll() {
        return this.authorDao.findAll();
    }    
    public Author findAuthor(Long id){
        return this.authorDao.findAuthor(id);
    }
}複製程式碼

Controller相關

為了展現效果,我們先定義一組簡單的 RESTful API 介面進行測試。

@RestController("jpa.authorController2")
@RequestMapping(value = "/data/jpa/author2")
public class AuthorController2 {

    @Autowired
    private AuthorService2 authorService;

    /**
     * 查詢使用者列表
     */
    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Object> getAuthorList(HttpServletRequest request) {
        List<Author> authorList = this.authorService.findAll();
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("total", authorList.size());
        param.put("rows", authorList);
        return param;
    }

    /**
     * 查詢使用者資訊
     */
    @RequestMapping(value = "/{userId:\\d+}", method = RequestMethod.GET)
    public Author getAuthor(@PathVariable Long userId, HttpServletRequest request) {
        Author author = this.authorService.findAuthor(userId);
        if (author == null) {
            throw new RuntimeException("查詢錯誤");
        }
        return author;
    }
}複製程式碼

原始碼

相關示例完整程式碼: springboot-action

(完)

更多精彩文章,盡在「服務端思維」微信公眾號!

Spring Boot 揭祕與實戰(二) 資料儲存篇 - JPA

相關文章