SpringBoot整合
1.依赖
<!--导入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>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
2.配置文件
#Mysql数据源配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/(数据库名字)?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=admin
#JPA相关配置(默认的orm框架是hibernate)
#项目启动生成数据库
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
3.创建实体类
- 如果不存在该实体类的表 因为在配置文件开启了自动生成对应的表 所以就会自动该实体类的表
@Data
//告诉jpa这是一个实体类,需要把它跟数据库中的表做映射
@Entity
//使用注解建立实体类和数据表之间的对应关系
@Table(name = "article")//@Table建立了实体类和数据表的关系 name指向表名
public class Article {
@Id//标识这是主键字段
//指定主键生成策略,GenerationType.IDENTITY就是对应到mysql中的数据自增策略
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer aid;
//使用@Column映射类的属性和数据表的字段关系 name指定表中的字段名
//当类的属性名和数据表的字段名一致时,此注解可省略
@Column(name = "author")
private String author;
private Date createTime;
private String title;
}
4.创建dao层
/**
* 自定义接口需要继承
* JpaRepository<实体类的类型,实体类中的主键的类型>:基本的 增删改查、分页、排序操作
* JpaSpecificationExecutor<实体类的类型>:动态sql
*/
public interface ArticleDao extends JpaRepository<Article, Integer>, JpaSpecificationExecutor<Article> {
}
基本使用
- 增删改查
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataJpaTest {
@Autowired
private ArticleDao articleDao;
/**
* 保存
*/
@Test
public void testSave() {
Article article = new Article();
article.setTitle("t_1");
article.setAuthor("a_1");
article.setCreateTime(new Date());
articleDao.save(article);
}
/**
* 删除
*/
@Test
public void testDelete() {
articleDao.deleteById(2);
}
/**
* 修改
*/
@Test
public void testUpdate() {
Article article = new Article();
article.setAuthor("a_1");
article.setAid(1);
//Spingdata Jpa的保存和修改使用的都是save方法
//关键来看传入的实体是否有主键
//---如果有主键,代表要修改
//---如果没有主键,代表要保存
articleDao.save(article);
}
/**
* 查询主键
*/
@Test
public void testFindByAid() {
Optional<Article> optional = articleDao.findById(1);
System.out.println(optional.get());
}
/**
* 查询所有
*/
@Test
public void testFindAll() {
List<Article> articles = articleDao.findAll();
for (Article article : articles) {
System.out.println(article);
}
}
}
- 批量操作
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataJpaCUDTest {
@Autowired
private ArticleDao articleDao;
/**
* 保存
*/
@Test
public void testSave() {
Article article = new Article();
article.setTitle("t_1");
article.setAuthor("a_1");
article.setCreateTime(new Date());
//保存一个实体
articleDao.save(article);
//保存一个实体,并且立即刷新缓存
//articleDao.saveAndFlush(article);
}
/**
* 保存多个
*/
@Test
public void testSaveAll() {
Article article1 = new Article();
article1.setTitle("t_1");
article1.setAuthor("a_1");
article1.setCreateTime(new Date());
Article article2 = new Article();
article2.setTitle("t_2");
article2.setAuthor("t_2");
article2.setCreateTime(new Date());
Article article3 = new Article();
article3.setTitle("t_3");
article3.setAuthor("a_3");
article3.setCreateTime(new Date());
List list = new ArrayList();
list.add(article1);
list.add(article2);
list.add(article3);
//保存多个实体
articleDao.saveAll(list);
}
/**
* 删除
*/
@Test
public void testDeleteOne(){
//1 根据主键删除
//articleDao.deleteById(13);
//2 根据实体删除,但是这个实体必须要有主键
Article article = new Article();
article.setAid(13);
articleDao.delete(article);
}
/**
* 删除多个
*/
@Test
public void testDeleteAll(){
//1 删除所有 先查询--再一条条的删除
//articleDao.deleteAll();
//2 删除所有 一下子删除所有记录
//articleDao.deleteAllInBatch();
Article article1 = new Article();
article1.setAid(24);
Article article2 = new Article();
article2.setAid(22);
List list = new ArrayList();
list.add(article1);
list.add(article2);
//3 批量删除指定数据 一条语句搞定
//articleDao.deleteInBatch(list);
//4 先一条条的查,然后再一条条的删除
articleDao.deleteAll(list);
}
}
- 注意
- 批量删除的时候注释的四个不同位置有不同效果