spring-data-jdbc
一.简介
spring旗下产品,简化spring-data-jpa功能与配置,底层实现为spring-jdbc
优点:
- 能够在spring boot开箱即用
- 通过函数名即可默认实现查询语句
- 内置分页查询默认实现
- 避免了spring-jdbc在service层直接写sql语句的问题
例如
List<User> findByUserNameAndUserSex(String userName, Integer userSex);
通过添加该函数即可直接调用,达到批量查询的效果,等同于以下Sql语句:
select * from user where user_name = ? and user_sex = ?
二.配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
spring-boot-starter-data-jdbc:spring-data-jdbc核心依赖
lombok:通过注解消除模板代码,需要IDE安装lombok插件
三.使用
1.PO类
@Data @AllArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(value = {"id"}) @Table("user") public class User implements Serializable { @Id Long Id; String userName; String userSex; String addressId; }
@Data @AllArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(value = {"id"}) @Table("address") public class Address implements Serializable { @Id Long Id; String addressName; }
@Data:lombok注解,提供get、set、toString等函数
@AllArgsConstructor:lombok注解,提供全参构造函数
@JsonInclude(JsonInclude.Include.NON_NULL):序列化时排除null属性
@JsonIgnoreProperties(value = {“id”}):序列化时排除主键属性
Id
@Table(“user”):映射DB的表名
@Id:主键,只能存在一个
2.Repository类
public interface UserRepository extends PagingAndSortingRepository<User, Long> { }
3.SeviceImpl类中通过@Autowire注入
@Autowire UserRepository userRepository
userRepository由于继承了PagingAndSortingRepository,PagingAndSortingRepository继承了CrudRepository可以使用以下默认实现方法:
PagingAndSortingRepository源码:
public interface CrudRepository<T, ID> extends Repository<T, ID> { <S extends T> S save(S var1); <S extends T> Iterable<S> saveAll(Iterable<S> var1); Optional<T> findById(ID var1); boolean existsById(ID var1); Iterable<T> findAll(); Iterable<T> findAllById(Iterable<ID> var1); long count(); void deleteById(ID var1); void delete(T var1); void deleteAll(Iterable<? extends T> var1); void deleteAll(); }
method | Purpose |
---|---|
save | 按T的主键更新,如参数T的主键为空则插入 |
saveAll | 保存多个T |
findById | 通过主键进行查找,返回T |
existsById | 通过主键进行查找,判断是否存在 |
findAll | 查询全部记录 |
findAllById | 通过主键List进行查找,返回Iterable |
count | 查询全部记录条目数 |
deleteById | 过主键进行删除 |
delete | 过T的主键进行删除 |
deleteAll | 通过主键List进行批量删除 |
deleteAll | 删除全部记录 |
CrudRepository源码:
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort var1); Page<T> findAll(Pageable var1); }
method | Purpose |
---|---|
findAll | 通过传入Sort.by(“列名”),按指定列进行排序返回Iterable,具体参考Sort类 |
findAll | 通过传入PageRequest.of(0, 10, Sort.by(“列名”)),返回第1页10条分页数据 |
4.插入
①通过userRepository.save(T),T的主键保持为null进行插入
②通过在UserRepository接口中加入method,@Query中写入sql语句
@Modifying @Query("insert into user(user_name) values(:userName)") int insert(@Param("userName") String userName);
使用UserRepository.insert(userName插入
5.更新
①通过userRepository.save(T)按主键更新
②通过在UserRepository接口中加入method,@Query中写入sql语句
@Modifying @Query("update user set user_sex = '男' where user_name = :userName") int updateByUserName(@Param("userName") String userName);
使用UserRepository.updateByUserName(userName)更新
6.删除
①通过userRepository.delete(T)按主键删除
②通过在UserRepository接口中加入method,@Query中写入sql语句
@Modifying @Query("delete from user where user_name = :userName") int deleteByUserName(@Param("userName") String userName);
使用UserRepository.deleteByUserName(userName)删除
7.查询
①通过@Query自定义查询,查询不需要@Modifying注解,示范略
②通过语法规则,不需要@Query手动写查询,语法见下图
8.联表查询
通过@Query自定义查询,返回的实体类需要包含查询的所有属性
需注意insert、update、delete必须要有@Modifying注解