1.概述Spring Data
- 关于Spring Data
SpringCloud Data框架的目标是为数据的访问提供一个通过用的模型。对于程序员来说,不管访问数据库使用的是哪种技术,访问的是哪种数据库,使用了SpringData后,都可以用同样的方式,同样的代码风格来实现对它们的访问,这么数据库包括关系型数据库,非关系数据库。Spring Data 是以这些数据库访问技术进行封装,提供类似适配器功能,让我可以更加简单地访问数据库。
- Spring Data功能
- 提供数据与对象映射的抽象层,同一个对象可以映射为不同数据库的数据。
- 根据数据储存接口的方法名,自动实现数据查询。
- 为各个领域模型提供最基本的实现,例如像普通的增删改查功能。
- 可在原有的逻辑上,实现自定义的数据库操作逻辑
- Spring Data模块
Spring Data JPA :该模块提供了基本的数据操作功能,可减少数据访问层的开发工作量。
Spring Data MongoDB:使用该模块可轻松操作MongoDB
Spring Data Redis:使用该模块可操作Redis数据库。
2.利用SpringData JPA ,hibernate访问MySQL
- 简单demo
配置文件 yml:
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/springdata
username: root
password: 123456
type: org.apache.commons.dbcp2.BasicDataSource
tomcat:
max-idle: 10 # 设置最大等待连接数量,设0为没有限制
max-active: 50 # 最大连接活动数
max-wait: 10000 # 最大等待秒数 单位ms 超过时间会报错误信息
initial-size: 5 # 数据库连接池初始化连接数
实体类(hibernate方式):
@Entity
@Table(name = "person")
public class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer pid;
private String name;
private Integer age;
private String message;
省略get和set方法
}
实现JpaRepository<Person,Integer>接口
public interface PersonRepository extends JpaRepository<Person,Integer> {
}
服务层:
@Service
public class PersonService {
@Autowired
private PersonRepository personRepository;
public List<Person> getPersons(){
List<Person> personList=personRepository.findAll();
return personList;
}
public Person save(String name){
Person p=new Person();
p.setName(name);
p.setAge(21);
p.setMessage("message");
Person person=personRepository.save(p);
return person;
}
}
控制器:
@RestController
public class PersonController {
@Autowired
private PersonService personService;
@RequestMapping(value = "/getAll",method = RequestMethod.GET
)
public List<Person> getPersons(){
List<Person> personList=personService.getPersons();
return personList;
}
@RequestMapping("/addOne/{name}")
public Person save(@PathVariable("name") String name){
Person person=personService.save(name);
return person;
}
}
- 通过方法名查询
前面的Spring帮我们生成的代理类,虽然可以完成很多工作,但在实际应用开发时,不可避免要实现自己的逻辑存储逻辑。
public interface PersonRepository extends JpaRepository<Person,Integer>,PersonRepositoryCustom {
// from person where name = ?
List <Person> name(String name);
// from person where name = ? and age =?
List <Person> findByNameAndAge(String name,Integer age);
}
- 自定义数据存储逻辑
//如果说以上的方法名也无法满足查询要求,可以编写原生的sql语句 @Query(value = "select name from person where pid=?1",nativeQuery = true) public String findNameById(Integer pid) ; //非原生 @Query(value = "select p.name from Person where p.age=?1",nativeQuery = true) public String findNameByAge(Integer age) ;
3.Spring Data JPA 访问Redis
- 添加依赖
<!--引入Spring Data Redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.5.RELEASE</version> </dependency>
- 创建实体类
@RedisHash("PersonRedis") public class PersonRedis implements Serializable { @Id private Integer pid; @Indexed //为该字段建立索引 private String name; private Integer age;
省略了set,get方法
}
- 定义接口
public interface PersonRepositoryRedis extends CrudRepository<PersonRedis,String> { //数据访问接口继承了CrudRepository,同样不需要任何的实现。 //方法名的查询支持 And Or Is,Equals Top First等 List<PersonRedis> findByName(String name); }
- 服务层访问
@Service public class PersonRedisService { @Autowired private PersonRepositoryRedis repositoryRedis; public List<PersonRedis> getPersons(){ Iterable<PersonRedis> persons=repositoryRedis.findAll(); List<PersonRedis> datas=new ArrayList<PersonRedis>(); for (Iterator<PersonRedis> it=persons.iterator();it.hasNext();){ PersonRedis person=it.next(); datas.add(person); } return datas; } public PersonRedis save(){ PersonRedis personRedis=new PersonRedis(); personRedis.setPid(1); personRedis.setName("redis"); personRedis.setAge(21); return personRedis; } }
- 控制器调用
//查询Redis缓存数据库 @RequestMapping("/saveOne") public PersonRedis save(){ PersonRedis personRedis= personRedisService.save(); return personRedis; }
//此外还可以自定义Redis数据存储逻辑