springdata
是Springboot 底层默认进行数据访问的技术,用来简化数据访问(有许多的用来简化数据访问的部分;例如:简化Redis)springboot的目标—统一数据访问–为开发者提供统一的API来对数据层进行操作
为了实现提供统一的API
- 提供了统一的接口(完成访问数据库的基本功能)
- 提供了数据访问的模板类xxxTemplate
例如:MongolianTemplate RedisTemplate;
使用springData访问数据的模式
进行数据访问面向SpringData 编程;使用好springdata 提供的Repository ,Templates(模板类),ObjectMapping(对象映射)
操作关系型数据库--使用springData JPA 模块
SpringData JPA
JPA :
是javaEE 持久层的API ,是JAVAEE 提供的一种规范
;这个规范的实现有--Hibernate,Toplink,OpenJAP
;springData JAP 是将实现再次封装【springdata JPA 的底层默认使用的是:Hibernate
】;了解SpringDataJPA的底层,我们在使用的时候依然是面向SpringData 使用它提供的Repository,Template,ObjectMapping 完成数据访问。
JPA 实际上也是完成苏剧访问的一种框架(genMybatis 是一样的)只是它是属于Springboot 自己的
使用SpringDate 完成数据访问
- 创建项目,导入依赖,选择场景启动器
【在整合Mybatis 的时候我们也选择了JDBC的场景启动器,是为了自动的生成数据连接,但是其实在Mybatis 的依赖树中是自动导入了JDBCstart 同样的JPA的依赖树中也自动添加了JDBC所以自其实选不选都一样】
- 配置数据源,可以自己配置一个数据源(例如:druid),也可以使用springboot 自带的
- 编写配置文件application.yml(数据源基本配置)
spring:
datasource:
username: root
password: 12345
url: jdbc:mysql://localhost:3306/jpa?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
- JPA :ORM(Object Relational Mapping/对象关系映射)
- 编写实体类(bean) 和数据表进行映射,并配置好映射关系
使用JPA 注解,配置映射关系
@Entity 告诉JPA 这是一个实体类,是和数据表映射的类不是普通的bean
@Table(name = "tbl_user") //配置是和那个表进行映射;如果省略表名就是类名首字母小写
public class User {
@Id 表明这是一个主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //者是一个自增的主键
private Integer id;
@Column(name = "lats_name",length = 50)//这是和数据库表对应的一个列,设置列明和列的属性(50个字符长度)
private String lastName;
@Column 不进行设置,默认列名为属性名
private String email;
- 要操作这个表,编写
Dao接口
来操作对应的数据表(Repository)继承jpaRepository
继承JpaRepository 完成对数据库的操作
public interface UserRepository extends JpaRepository<User,Integer>{
//具备了操作数据库的方法
}
- 使用JPA 因为是ORM所以会根据绑定vde实体类帮我们自动创建数据表,但是要进行一定的配置
jpa:
hibernate:
# 数据表创建的方式:数据表存在就进行数据更新,不存在数据表就进行创建
ddl-auto: update
# 控制台显示Sql
show-sql: true
# jpa 使用底层的Hibeinate 帮我们完成数据库中数据表的创建- 进行基本的配置
# 与jpa 有关的配置都在jpaProperties 这个类中;所有的配置都是spring 开头
- 编写Controller 进行测试
注意如果你是用的是SpringBoot2.0 以上的版本并且在数据访问的时候使用了getOne 查询数据是没有问题但是在返回JSON数据的时候就会出现问题:要在实体类上面加上注解:
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
;
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/user/{id}")
public User GetUser(@PathVariable("id") Integer id){
User user = userRepository.getOne(id);
return user;
}
@GetMapping("/user")
public User InsertUser(User user){
userRepository.save(user);
return user;
}
}