请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 394|回复: 0

Spring Boot2.0连载(42)-- CrudRepository接口访问数据

[复制链接]
发表于 2018-5-31 21:23:23 | 显示全部楼层 |阅读模式
更多Spring Boot2.0的知识敬请期待疯狂软件著作《Spring Boot企业应用实战》上市



创建一个新的Maven项目,命名为crudrepositorytest。按照Maven项目的规范,在src/main/下新建一个名为resources的Folder。
(1)    修改pom.xml文件。
在pom.xml文件中增加web开发的启动器配置如下:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
复制代码


然后添加数据库驱动依赖配置:
  1. <dependency>
  2.     <groupId>mysql</groupId>
  3.     <artifactId>mysql-connector-java</artifactId>
  4. </dependency>
复制代码


最后需要加spring-boot-starter-data-jpa,它是Spring Boot项目访问数据库的核心依赖配置,加入此配置后,系统会自动导入Spring Data相关的核心数据访问接口包,以及Hibernate框架相关的依赖包,该配置如下:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
复制代码


修改后的完整pom.xml文件如下:
程序清单:codes/04/crudrepositorytest/pom.xml
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <groupId>org.fkit</groupId>
  5.     <artifactId>crudrepositorytest</artifactId>
  6.     <version>0.0.1-SNAPSHOT</version>
  7.     <packaging>jar</packaging>
  8.     <name>crudrepositorytest</name>
  9.     <url>http://maven.apache.org</url>
  10.     <parent>
  11.         <groupId>org.springframework.boot</groupId>
  12.         <artifactId>spring-boot-starter-parent</artifactId>
  13.         <version>2.0.0.RELEASE</version>
  14.     </parent>

  15.     <properties>
  16.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  18.         <java.version>1.8</java.version>
  19.     </properties>
  20.     <dependencies>
  21.         <!--  添加spring-boot-starter-web依赖 -->
  22.         <dependency>
  23.             <groupId>org.springframework.boot</groupId>
  24.             <artifactId>spring-boot-starter-web</artifactId>
  25.         </dependency>

  26.        <!-- 添加spring-boot-starter-thymeleaf模块依赖 -->
  27. <dependency>
  28.            <groupId>org.springframework.boot</groupId>
  29.            <artifactId>spring-boot-starter-thymeleaf</artifactId>
  30.        </dependency>

  31.         <!-- 添加MySQL依赖 -->
  32.         <dependency>
  33.             <groupId>mysql</groupId>
  34.             <artifactId>mysql-connector-java</artifactId>
  35.         </dependency>

  36.         <!-- 添加Spring Data JPA依赖 -->
  37.         <dependency>
  38.             <groupId>org.springframework.boot</groupId>
  39.             <artifactId>spring-boot-starter-data-jpa</artifactId>
  40.         </dependency>
  41.     </dependencies>
  42. </project>

  43. </project>
复制代码


(2)    配置基本属性。
在src/main/resources包下新建一个全局配置文件,命名为application.properties,在该配置文件中配置数据源和jpa相关的属性:
程序清单:codes/04/crudrepositorytest/src/main/resources/application.properties
  1. ########################################################
  2. ### 数据源信息配置
  3. ########################################################
  4. # 数据库地址
  5. spring.datasource.url = jdbc:mysql://localhost:3306/springdatajpa
  6. # 用户名
  7. spring.datasource.username = root
  8. # 密码
  9. spring.datasource.password =
  10. # 数据库驱动
  11. spring.datasource.driverClassName = com.mysql.jdbc.Driver
  12. # 指定连接池中最大的活跃连接数.
  13. spring.datasource.max-active=20
  14. # 指定连接池最大的空闲连接数量.
  15. spring.datasource.max-idle=8
  16. # 指定必须保持连接的最小值
  17. spring.datasource.min-idle=8
  18. # 指定启动连接池时,初始建立的连接数量
  19. spring.datasource.initial-size=10


  20. ########################################################
  21. ### JPA持久化配置
  22. ########################################################
  23. # 指定数据库的类型
  24. spring.jpa.database = MySQL
  25. # 指定是否需要在日志中显示sql语句
  26. spring.jpa.show-sql = true
  27. # 指定自动创建|更新|验证数据库表结构等配置,配置成update
  28. # 表示如果数据库中存在持久化类对应的表就不创建,不存在就创建对应的表
  29. spring.jpa.hibernate.ddl-auto = update
  30. # Naming strategy
  31. # 指定命名策略
  32. spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
  33. # 指定数据库方言
  34. spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
复制代码


(3)    创建持久化类。
在org.fkit.crudrepositorytest包下新建四个包,依次是bean(放置持久化类的)、controller(控制器)、repository(定义数据访问接口的包)、service(业务逻辑处理类),在bean包创建一个持久化了类User.java。
程序清单:codes/04/crudrepositorytest/src/main/java/org/fkit/crudrepositorytest/bean/User.java
  1. import javax.persistence.Entity;
  2. import javax.persistence.GeneratedValue;
  3. import javax.persistence.GenerationType;
  4. import javax.persistence.Id;
  5. import java.io.Serializable;

  6. @Entity
  7. // 用于标记持久化类,Spring Boot项目加载后会自动根据持久化类建表
  8. @Table(name="tb_user")
  9. public class User  implements Serializable{

  10.     /**
  11.      * 使用@Id指定主键. 使用代码@GeneratedValue(strategy=GenerationType.IDENTITY )
  12.      * 指定主键的生成策略,mysql默认的是自增长。
  13.      *
  14.      */
  15.     @Id
  16.     @GeneratedValue(strategy = GenerationType.IDENTITY )
  17.     private int id;// 主键.

  18.     private String username;// 姓名. username

  19.     private String loginName;

  20.     private char sex;// 性别

  21.     private int age; // 年龄

  22.     // 省略构造器和set/get方法
  23. }
复制代码


(4)    定义数据访问层接口。
在org.fkit.crudrepositorytest.repository包下新建一个接口命名为UserRepository,让该接口继承CrudRepository接口,以持久化对象User作为CrudRepository的第一个类型参数,表示当前所操作的持久化对象类型,Integer作为CrudRepository的第二个类型参数,用于指定ID类型,完整代码如下:
程序清单:codes/04/crudrepositorytest/src/main/java/org/fkit/crudrepositorytest/repository/UserRepository.java
  1. import org.fkit.crudrepositorytest.bean.User;
  2. import org.springframework.data.repository.CrudRepository;

  3. public interface UserRepository extends CrudRepository<User, Integer>{

  4. }
复制代码


在Spring Boot项目中数据访问层无须提供实现,直接继承数据访问接口即可。
(5)    定义业务层类。
程序清单:codes/04/crudrepositorytest/src/main/java/org/fkit/crudrepositorytest/service/UserService.java
  1. import javax.annotation.Resource;
  2. import javax.transaction.Transactional;
  3. import org.fkit.crudrepositorytest.bean.User;
  4. import org.fkit.crudrepositorytest.repository.UserRepository;
  5. import org.springframework.stereotype.Service;
  6. @Service
  7. public class UserService {

  8.     // 注入UserRepository
  9.     @Resource
  10.     private UserRepository userRepository;

  11.     /**
  12.      * save,update ,delete 方法需要绑定事务. 使用@Transactional进行事务的绑定.
  13.      *
  14.      * 保存对象
  15.      * @param User
  16.      * @return 包含自动生成的id的User对象        
  17.      */
  18.     @Transactional
  19.     public User save(User User) {
  20.         return userRepository.save(User);
  21.     }

  22.     /**
  23.      * 根据id删除对象
  24.      *
  25.      * @param id
  26.      */
  27.     @Transactional
  28.     public void delete(int id) {
  29.         userRepository.deleteById (id);
  30.     }

  31.     /**
  32.      * 查询所有数据
  33.      *
  34.      * @return 返回所有User对象
  35.      */
  36.     public Iterable<User> getAll() {
  37.         return userRepository.findAll();
  38.     }
  39.    
  40.     /**
  41.      * 根据id查询数据
  42.      *
  43.      * @return  返回id对应的User对象
  44.      */
  45.     public User getById(Integer id) {
  46.         // 根据id查询出对应的持久化对象
  47. Optional<User> op = userRepository.findById(id);
  48. return op.get();
  49.     }

  50.     /**
  51.      * 修改用户对象数据,持久化对象修改会自动更新到数据库
  52.      *
  53.      * @param user
  54.      */
  55.     @Transactional
  56.     public void update(User user) {
  57.         // 直接调用持久化对象的set方法修改对象的数据
  58.         user.setUsername("孙悟空");
  59.         user.setLoginName("swk");
  60.     }

  61. }
复制代码


在业务层中需要注入数据访问层对象,在上述代码中我们是通过@Resources注解将UserRepository接口对应的实现类注入进来的,从这里可以看出,只要数据访问层接口实现了CrudReposity,Spring Boot项目会自动扫描该类并为该类创建实现类对象。@Transactional注解用于申明方法的事物特性。
(6)    定义控制器类
在org.fkit.crudrepositorytest.controller包先新建一个控制器类命名为UserController,其代码如下:
程序清单:codes/04/crudrepositorytest/src/main/java/org/fkit/crudrepositorytest/controller/UserController.java
  1. import javax.annotation.Resource;
  2. import org.fkit.crudrepositorytest.bean.User;
  3. import org.fkit.crudrepositorytest.service.UserService;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;

  6. @RestController
  7. @RequestMapping("/user")
  8. public class UserController {

  9.     // 注入UserService
  10.     @Resource
  11.     private UserService userService;

  12.     @RequestMapping("/save")
  13.     public String save() {
  14.         User user = new User();
  15.         user.setLoginName("dlei");
  16.         user.setUsername("徐磊");
  17.         user.setSex('男');
  18.         user.setAge(3);
  19.         userService.save(user);
  20.         return "保存数据成功!";
  21.     }

  22.    
  23. @RequestMapping("/update")
  24. public String update() {
  25.     // 修改的对象必须是持久化对象,所以先从数据库查询出id为1的对象进行修改
  26.         User user = userService.getById(1);
  27.         userService.update(user);
  28.         return "修改成功!";
  29. }

  30.     @RequestMapping("/delete")
  31.     public String delete() {
  32.         userService.delete(1);
  33.         return "删除数据成功!";
  34.     }

  35.     @RequestMapping("/getAll")
  36.     public Iterable<User> getAll() {
  37.      // 查询所有的用户数据
  38.         return userService.getAll();
  39.     }
  40. }
复制代码


(7)测试应用
启动MySQL数据库,在数据库中创建名称为springdatajpa的数据库,执行脚本如下:
CREATE DATABASE springdatajpa;
然后在org.fkit.crudrepositorytest包下新建App.java启动类,App.java和之前的项目一致,此处不再赘述。右键该类运行main方法。Spring Boot项目启动后,JPA会在数据库自动创建持久化类对应的tb_user表。需要注意的是,按照JPA的规范,实体类User的属性loginName映射到数据库的时候,自动生成的数据库列名是login_name。
在浏览器输入URL来测试应用。
  1. http://127.0.0.1:8080/user/save
复制代码


请求会提交到UserController类的save方法进行处理,如果该方法执行保存用户成功即可返回字符串“保存用户成功!”,读者可自行查看数据库的表信息。

测试修改用户,在浏览器中输入如下地址:
  1. http://127.0.0.1:8080/user/update
复制代码


请求会提交到UserController类的update方法进行处理,如果该方法执行修改用户成功即可返回字符串“修改数据成功”,读者可自行查看数据库的表信息。

测试删除用户数据,在浏览器中输入:
  1. http://127.0.0.1:8080/user/delete
复制代码


请求会提交到UserController类的delete方法进行处理,读者可自行查看数据库的表信息。




您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满
微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2019-1-17 16:36 , Processed in 0.280468 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表