【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 ,如图显示:
文章图片
从上图我们可以看出继承关系,点击 JpaRepository
打开Navigate→File Structure,或者点击最左边的 Structure,可以查看此类的结构以及有哪些方法和继承类。
文章图片
CrudRepository
:基本的 CRUD 方法。PagingAndSortingRepository
:继承CrudRepository
,并增加分页功能。JpaRepository
:继承PagingAndSortingRepository
和QueryByExampleExecutor
。
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
配置文件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 {
}
CrudRepositoryCURD 测试类
路径: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.809INFO 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.828INFO 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.848INFO 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.861INFO 48452 --- [main] c.m.c.repository.UserCrudRepositoryTest: 新增数据 result = User{id=4, name='米二', age=8}
spring.jpa.show-sql= true
开启之后会在控制台输出 SQL 语句,在日常测试环境也能提高一定的开发效率。示例代码-github
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)