SpringBoot整合SpringDataJpa
1、配置依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.my.spring.data.test</groupId>
<artifactId>SpringDataJpaTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- SpringBoot JPA起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
</project>
2、配置文件application.yml
server:
port: 8888
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/my_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 666666
jpa:
database: MYSQL
show-sql: true
generate-ddl: true
hibernate:
ddl-auto: update
3、SpringBoot启动类
@SpringBootApplication
public class JpaTestApp {
public static void main(String[] args) {
SpringApplication.run(JpaTestApp.class, args);
}
}
4、实体类
@Entity
@Table(name = "jpa_test")
public class JpaTest{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "age")
private Integer age;
@Column(name = "address")
private String address;
@Column(name = "descripe")
private String descripe;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDescripe() {
return descripe;
}
public void setDescripe(String descripe) {
this.descripe = descripe;
}
@Override
public String toString() {
return "JpaTest [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + ", descripe="
+ descripe + "]";
}
}
5、dao接口
public interface JpaTestDao extends JpaRepository<JpaTest, Integer>,JpaSpecificationExecutor<JpaTest>{
}
6、test测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataJpaTest {
@Autowired
private JpaTestDao jpaDao;
@org.junit.Test
public void jpTest() {
List<JpaTest> japList = jpaDao.findAll();
for (JpaTest jpaTest : japList) {
System.out.println(jpaTest.toString());
}
}
}
7、@Modifying注解
1、在@Query注解中编写JPQL实现DELETE和UPDATE操作的时候必须加上@modifying注解,以通知Spring Data 这是一个DELETE或UPDATE操作。
2、UPDATE或者DELETE操作需要使用事务,此时需要 定义Service层,在Service层的方法上添加事务操作。
3、注意JPQL不支持INSERT操作。
匹配器----ExampleMatcher用法
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataJpaTest {
@Autowired
private JpaTestDao jpaDao;
@org.junit.Test
public void jpTest() {
JpaTest jpaTest = new JpaTest();
jpaTest.setAddress("a");
jpaTest.setName("b");
/**
* 设置匹配条件
* GenericPropertyMatchers配置查询方式
*/
ExampleMatcher matcher = ExampleMatcher.matching()
.withMatcher("name",GenericPropertyMatchers.contains())
.withMatcher("address", GenericPropertyMatchers.contains());
Example<JpaTest> example = Example.of(jpaTest,matcher);
int page = 0;
int size = 10;
Sort sort = new Sort(Sort.Direction.DESC,"age");
Pageable pageable = PageRequest.of(page, size,sort);
Page<JpaTest> pageList = jpaDao.findAll(example, pageable);
for(JpaTest jpaTestItem:pageList.getContent()) {
System.out.println(jpaTestItem.toString());
}
}
}
SpringDataJpa接收参数
参数为对象的情况:
@Modifying
@Query(value = "UPDATE LabelInfo lb SET lb.name = :#{#labelInfo.name},lb.content = :#{#labelInfo.content},lb.catalogueId = :#{#labelInfo.catalogueId},lb.updateTime = :#{#labelInfo.updateTime},lb.labelDesc = :#{#labelInfo.labelDesc} WHERE lb.labelId = :#{#labelInfo.labelId}")
public int updateById(@Param("labelInfo") LabelInfo labelInfo);
SpringDataJpa —一对多:发生java.lang.StackOverflowError: null
出现异常的原因: 如果查询一个User实体,并打印,打印调用的是toString() 方法,toString()方法里面又有关联Dept对象。 所以导致User和Dept两个对象互相调用并打印,形成一个递归调用,最后堆栈溢出。
解决方法: 两个实体关联对象不写入toString中,使用lombok注解:
@ToString(exclude={"关联对象名"})
249

被折叠的 条评论
为什么被折叠?



