本文講解 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
(完)
更多精彩文章,盡在「服務端思維」微信公眾號!