准备工作
所需依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.21</version>
</dependency>
application.properties 配置文件如下:
# 连接数据库的基本配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=Test@123456
spring.datasource.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/example?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
# JPA的一般配置
# 打印 SQL 语句
spring.jpa.show-sql=true
# 指定数据库平台
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
# 每次使用时,如果表已经存在,使用更新模式,而不是重新创建一个表
spring.jpa.hibernate.ddl-auto=update
# 指定MySQL的方言版本
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
示例
实体类
新建 bean 包,在 bean 下,新建实体类 Book
:
@Data
@Entity(name = "t_book")
public class Book {
@Id
// IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式,mysql 支持这种方式
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String author;
}
注解 @Data,来自依赖 lombok,作用是自动生成 getting/setting 方法和 tostring 方法。
注解 @Entity(name = "t_book")表示这是个实体类,并自动在数据库中生成名为 t_book 的表。
注解 @Id 表示 该表的主键是id。
注解 @GeneratedValue(strategy = GenerationType.IDENTITY),表示主键由数据生成,采用数据库自增长。
关于 @GeneratedValue 的详细用法,参考文章:@GeneratedValue 注解详解
数据访问层(Dao层)
新建 dao 包,在 dao 下,新建接口 BookDao:
/**
* 接口 BookDao 继承接口 JpaRepository
* JpaRepository有两个参数:一个是实体类的名称,一个是主键的数据类型
*/
public interface BookDao extends JpaRepository<Book,Integer> {
}
运行启动类,即可在数据库创建出对应的表。
测试
接口 JpaRepository 的源码如下:
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
如上,它自带了增删改查的方法。
在测试类中,写一个增加数据的方法:
@SpringBootTest
class JpaApplicationTests {
@Autowired
BookDao bookDao;
@Test
void contextLoads() {
Book book = new Book();
book.setName("三国演义");
book.setAuthor("罗贯中");
bookDao.save(book);
}
}
类似的,更新的方法如下:
@Test
public void update(){
Book book = new Book();
book.setAuthor("luoguanzhong");
book.setName("sanguoyanyi");
book.setId(1);
bookDao.saveAndFlush(book);
}
删除的方法如下:
@Test
public void delete(){
bookDao.deleteById(2);
}
查询方法如下:
@Test
public void find1(){
// 按照 id 查询
Optional<Book> byId = bookDao.findById(2);
System.out.println(byId.get());
// 查询所有
List<Book> all = bookDao.findAll();
System.out.println(all);
}
每天学习一点点,每天进步一点点。