您的位置:首页 > 编程语言 > Java开发

Spring Boot 揭秘与实战(二) 数据存储篇 - JPA整合

2017-07-26 10:45 991 查看
文章目录

1. 环境依赖

2. 数据源

3. 脚本初始化

4. JPA 整合方案一 通过继承 JpaRepository 接口
4.1. 实体对象

4.2. DAO相关

4.3. Service相关

4.4. Controller相关

5. JPA 整合方案二 通过调用 EntityManager 类方法6. 源代码
5.1. 实体对象

5.2. DAO相关

5.3. Service相关

5.4. Controller相关

本文讲解 Spring Boot 基础下,如何整合 JPA 框架,编写数据访问。

环境依赖

修改 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


(完)

如果觉得我的文章对你有帮助,请随意打赏。



版权声明:本文由 梁桂钊 发表于 梁桂钊的博客

转载声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证),非商业转载请注明作者及出处,商业转载请联系作者本人。

文章标题:Spring Boot 揭秘与实战(二) 数据存储篇 - JPA整合

文章链接:http://blog.720ui.com/2017/springboot_02_data_jpa/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: