ef 查询结果转换成实体类输出_【Spring Data 系列学习】Spring Data JPA 基础查询

【Spring Data 系列学习】Spring Data JPA 基础查询

前面的章节简单讲解了 了解 Spring Data JPA 、 Jpa 和 Hibernate ,本章节开始通过案例上手 Spring boot Jpa 。

spring data

Spring Data 库的核心接口是 Repository。首先需要定义实体类的接口,接口必须继承 repository 并且输入实体类型和 ID 类型,如果需要用到 CRUD 方法,可以使用 CrudRepository 来替代 Repository 。除了 CrudRepository 还有 PagingAndSortingRepository JpaRepository 等。

我们用工具 IntelliJ IDEA,打开类 Repository.class,默认快捷键 CTRL+H ,如图显示:

2674ff5c-362f-eb11-8da9-e4434bdf6706.png

从上图我们可以看出继承关系,点击 JpaRepository 打开Navigate→File Structure,或者点击最左边的 Structure,可以查看此类的结构以及有哪些方法和继承类。

2874ff5c-362f-eb11-8da9-e4434bdf6706.png
  • CrudRepository :基本的 CRUD 方法。
  • PagingAndSortingRepository :继承 CrudRepository,并增加分页功能。
  • JpaRepository :继承 PagingAndSortingRepository QueryByExampleExecutor

快速上手

创建一个 Spring boot 项目,创建项⽬在 Chapter1项⽬ pom.xml 加入需要使⽤的依赖,如下所示:

<!--   引入  jpa-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

配置文件application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

# 打印 sql 语句
spring.jpa.show-sql= true
# 自动创建表
spring.jpa.properties.hibernate.hbm2ddl.auto=create
# 默认创建的mysql表为  MyISAM 引擎修改为InnoDB问题
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
spring.jpa.properties.hibernate.hbm2ddl.auto 参数说明:
- create:每次运行会先删除对应的表,通过实体类重新生成表。请勿再生产环境。
- create-drop:sessionFactory 关闭时会清空表中的数据。
- update:运行时如果没有表会自动创建表,只会更新表内数据不会请空数据。(推荐使用)
- validate:运行时验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

实体类映射数据库表

user 实体类

@Entity
public class User implements Serializable {

    private static final long serialVersionUID = -390763540622907853L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Integer age;

    // 省略构造器 set/get        

}

@Entity 定义对象将会成为被JPA管理的实体,将映射到指定的数据库表。

@Id 定义属性为数据库的主键,一个实体里面必须有一个。

@GeneratedValue(strategy = GenerationType.IDENTITY) 自增长 ID 策略

继承 CrudRepository

public interface UserCrudRepository extends CrudRepository<User, Long> {
}
CrudRepository
实体类,主键>

CURD 测试类

路径:src/test/java/com/mtcarpenter/repository/UserCrudRepositoryTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserCrudRepositoryTest {

    /**
     * ⽇志对象
     */
    private Logger logger = LoggerFactory.getLogger(UserCrudRepositoryTest.class);

    @Autowired
    private UserCrudRepository userCrudRepository;

    @Test
    public void save() {
        logger.info("新增数据 result = {}", userCrudRepository.save(new User("小米", 9)));
        logger.info("新增数据 result = {}", userCrudRepository.save(new User("张三", 16)));
        logger.info("新增数据 result = {}", userCrudRepository.save(new User("三哥", 12)));
        logger.info("新增数据 result = {}", userCrudRepository.save(new User("米二", 8)));
    }

    @Test
    public void edit() {
        logger.info("编辑用户 result = {}", userCrudRepository.save(new User(3L, "三三", 16)));
    }

    @Test
    public void delete() {
        userCrudRepository.deleteById(3L);
    }

    @Test
    public void findById() {
        logger.info("通过 id 查询 result = {}",userCrudRepository.findById(1L));
    }


    @Test
    public void findAll(){
        logger.info("查询所有记录   result = {}",userCrudRepository.findAll());
    }


}

输出日志:

Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.809  INFO 48452 --- [           main] c.m.c.repository.UserCrudRepositoryTest  : 新增数据 result = User{id=1, name='小米', age=9}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.828  INFO 48452 --- [           main] c.m.c.repository.UserCrudRepositoryTest  : 新增数据 result = User{id=2, name='张三', age=16}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.848  INFO 48452 --- [           main] c.m.c.repository.UserCrudRepositoryTest  : 新增数据 result = User{id=3, name='三哥', age=12}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.861  INFO 48452 --- [           main] c.m.c.repository.UserCrudRepositoryTest  : 新增数据 result = User{id=4, name='米二', age=8}

spring.jpa.show-sql= true 开启之后会在控制台输出 SQL 语句,在日常测试环境也能提高一定的开发效率。

示例代码-github

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Data JPA 中,我们可以通过定义 Repository 接口中的方法,使用方法名来自动生查询语句。但是有时候,我们需要自定义查询结果,比如说只需要查询结果中的部分字段,或者对查询结果进行聚合操作等。这时,我们可以使用 Spring Data JPA 提供的投影(Projection)功能来自定义查询结果。 投影是指将实体类中的一部分属性或关联属性映射一个接口或类,从而返回一个自定义的结果集。Spring Data JPA 支持三种投影方式: 1. 接口投影:定义一个接口,接口中声明需要的属性,Spring Data JPA 将根据接口定义的属性生查询结果。 2. 类投影:定义一个类,类中声明需要的属性,Spring Data JPA 将根据类定义的属性生查询结果。 3. 动态投影:可以根据查询条件动态地返回不同的投影结果,比如说根据用户的角色返回不同的查询结果。 下面是一个简单的例子,演示如何使用接口投影来自定义查询结果: 定义一个接口投影: ```java public interface UserProjection { String getUsername(); String getEmail(); } ``` 在 UserRepository 中使用接口投影: ```java public interface UserRepository extends JpaRepository<User, Long> { List<UserProjection> findByUsername(String username); } ``` 通过上面的代码,我们可以在 UserRepository 中定义一个方法 findByUsername,该方法会返回一个 List<UserProjection> 类型的结果集,该结果集中只包含 username 和 email 两个字段。 当我们调用 findByUsername 方法时,Spring Data JPA 将根据方法名自动生查询语句,并根据 UserProjection 接口中定义的属性生查询结果。 当然,除了接口投影,还有其他的投影方式,你可以根据自己的需求选择适合的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值