第一部分:讲一下什么是SpringDataJpa
1:SpringData是一个用于简化数据库访问,支持云服务的开源框架。
2:SpringData是数据库开源框架,包含对关系数据库,非关系数据库,云数据服务访问支持等。
3:JPA的全称是Java Persistence API,Persistence 是持久化的意思。所以,中文全称是【JAVA对象持久化的 API】。简单来说,可以理解为是一种JAVA的标准规范,这个规范为JAVA对象的持久化制定了一些标准的接口。要注意的是,JPA只是一个接口规范,而不是实现。具体实现由各供应商来完成,例如Hibernate很好地实现了JPA接口。JPA是Hibernate的一个抽象,提供 一些编程的API接口,但具体实现则由ORM厂商提供实现。
总而言之SpringData封装了Hibernate后变成了SringDataJpa,这样你就可以使用SpringData的那一套操作数据库的方法来读取数据,但是实际上后台是Hibernate来去替你完成相关操作的,你只是接触到了SpringDatajpa封装后形成的那些规则语法接口等等。
第二部分:整和SpringDataJpa到你的项目中
1:先再pom文件中加上它必须的依赖
<!-- SpringDataJpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
前面两个不用说,说下lombok这个小工具
- 一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具。
- @Data
该注解相当于同时加上以下注解@Setter @Getter,@ToString,@EqualsAndHashCode,作用于类中
这样你就可以只用写出类中的属性就好了,其他的这个注解都帮你实现了。
2:application,yml中写入配置文件:
spring:
application:
name: ziwang-upload //这个是我为这个为服务取得名字不用管,你们配置就从下面的开始就好了
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://47.101.39.237/ziwang_dev?characterEncoding=utf-8 //加上这个utf-8可以避免数据库乱码哦
username: root
password: 嘿嘿,密码写上你们自己的就好啦
3:创建映射实体类
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
@Entity
@Table(name="tb_type")//这个代表这个类是和数据库那个表对应的实体类必须要有
@Data//这就上面说的lombok这个插件的功能啦你看我下面get,Set 什么都没写
public class Type implements Serializable {
@Id //这个数据表里面的主键也要有
private Integer id;//
@Column(name = "table_1_id")//如果你的属性名和数据表里面的字段名一样的话就不用这个注解,
private Integer table1;//字段名再dao层作为查找函数的时候不可以带—等符号,会报错,所以这个属性名和表里的字段名不一致,就需要@Column这个注解来说明这个属性对应的是表里的哪一个字段。
private String table_1_name;//
@Column(name = "table_2_id")
private Integer table2;//
private String table_2_name;//
}
这个项目里面有两个实体,但都是一样的方法
@Entity
@Table(name="tb_resource")
@Data
public class Resource implements Serializable{
@Id
private String id;//
private String name;//
private String title;//文件名
private String type;//资源类型
private Integer category;//资源分类一级id
private String description;//资源描述
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//注意下这里,当我们以new Date()以当前时间作为这个日期的时候
private java.util.Date uploaddate;//取出来的日期不是正常的格式,加上这个注解后就正常了,还有一种解决方法是存入的时候就存正确的格式,不用new data这个方法存
private String state;//状态
private String ishot;//是否热门,
private String ispublic;//是否公开
private Integer downloads;//下载量
private String tags;//标签
private String cost;//所需积分
private String uid;
4:contorller,这里我只写放了保存方法方便你们理解
@RestController
@CrossOrigin
@RequestMapping("/upload")
public class UploadController {
@Autowired //这个注解相当于Sping的aop就是自动new类。已经生成了uploadService这个对象。
private UploadService uploadService;
//前端传来一个Resource类,和一些其他信息,再控制层调用服务层的方法存入数据库
@PostMapping("/filemsg/{token}")
@ResponseBody
public void getFileMsg(Resource resource,Integer category2,@PathVariable String token){
uploadService.fileMsg(resource,category2,token);
}
}
5:service层
@Service(value = "UploadService")
public class UploadService {
@Autowired
private IdWorker idWorker;
@Autowired
private ResourceRepository repository;
@Autowired
private UserClient userClient;
@Autowired
private ResourceClient resourceClient;
@Autowired
private TypeRepository typeRepository;
//这个是控制层调用的方法
public void fileMsg(Resource resource, Integer category2, String token){
resource.setId(idWorker.nextId() + "");//设置主键
resource.setUploaddate(new Date());//
Integer category1 = resource.getCategory();
Type type = typeRepository.findTypeByTable1AndTable2(category1, category2);
Integer id = type.getId();
resource.setCategory(id);
resource.setDownloads(0);
LinkedHashMap<String,Object> user = (LinkedHashMap<String, Object>) userClient.getUserInfo(token).getData();
resource.setUid((String) user.get("id"));
//中间这部分代码你可以不用管,这是这个项目的逻辑,如果你传过来的这个类是完整的,就是你想要保存都有,就直接下面这个方法就可以了
//repository.sava(resource);//这样就保存了,下面的我是调用另一个为服务进行保存的
Result result = resourceClient.save(resource);
System.out.println("文件信息保存数据库成功");
System.out.println(result);
}
}
6:dao,这里只要声明这个ResourceRepository继承JpaRepository就可以了<Resource, String>第一个参数是类,第二个是这个类里主键的数据类型
package com.ziwang.upload.dao;
import com.ziwang.upload.pojo.Resource;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ResourceRepository extends JpaRepository<Resource, String> {
Resource findResourceByName(String Name);//可以不用写这些方法,如果你只用了save这一个方法
Resource findResourceById(String Id);
}
ok,结束啦