é¦å å建ä¸ä¸ªspringboot项ç®ï¼é»è®¤å å ¥webä¾èµï¼ä¹å使ç¨Spring Date JPAåMySqlä¾èµ
使ç¨spring date jpa éè¦æ·»å 以ä¸ä¾èµï¼
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
æ¥ä¸æ¥å°é»è®¤çapplication.propertiesæä»¶åç¼æ¹ä¸º.ymlæè æ¯.yamlæä»¶ï¼ä½¿ç¨æ´æ¹ä¾¿ï¼è¿è¡é ç½®æ°æ®æºè¿æ¥
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: ****
jpa:
show-sql: true
åå»ºæ°æ®è¡¨"students",å¹¶ä¸æå ¥ä¸æ¡è®°å½
CREATE TABLE `students` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
ç¼åå®ä½ç±»Studentsç±»,è¿éIDEAæè eclipseè¦è£ lombackæä»¶ï¼å¦åè¦åsetter-getteræ¹æ³ï¼å 为lombackä¼å¨å®ä½ç±»è¿è¡ç¼è¯çæ¶åæ ¹æ®å±æ§å段å ä¸setter-getteræ¹æ³
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Students implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column
private Integer age;
@Column
private String address;
}
 ç¼ådaoå±ãJpaRepositoryæ¯springdataæä¾ççæ°æ®åºè®¿é®å±çå·¥å ·ç±»ï¼å¯ä»¥å¤§å¤§ç®å代ç çç¼åãJpaRepositoryæä¾äºä»¥ä¸æ¹æ³ï¼å¯ä»¥æ»¡è¶³å¤§é¨åçéæ±ï¼

import com.example.pojo.Students;
import org.springframework.data.jpa.repository.JpaRepository;
public interface StuRepository extends JpaRepository<Students, Long> {
}
使ç¨JpaRepositoryé»è®¤æ¹æ³
serviceå±å¨è¿éç®åäºï¼ç´æ¥åControllerå±ä»£ç
import com.example.dao.StuRepository;
import com.example.pojo.Students;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController
@Slf4j
public class StuController {
@Autowired
private StuRepository stuRepository;
@GetMapping("/findAll")
public List<Stu> findAll() {
List<Stu> stus = stuRepository.findAll();
return stus;
}
/**
* å建
*
* @return
*/
@GetMapping("/createOne")
public List<Stu> createOne() {
Stu stu = Stu.builder().name("æå").age(12).address("西æ¹").build();
Stu save = stuRepository.save(stu);
log.info(save.toString());
List<Stu> stus = Arrays.asList(Students.builder().name("æå").age(12).address("西æ¹").build(),
Studengts.builder().name("çäº").age(12).address("å京路").build());
List<Stu> stus1 = stuRepository.saveAll(stus);
return stus1;
}
@GetMapping("/deleteById")
public void deleteById() {
stuRepository.existsById(1L);//夿æ¯å¦åå¨
stuRepository.deleteById(1L);//å é¤
}
/**
* æ ¹æ®æ¡ä»¶æ¥è¯¢
*
* @return
*/
@GetMapping("/findByExample")
public List<Stu> findByExample() {
Students stu = Students.builder().age(12).build();
Example<Stu> example = Example.of(stu);
List<Stu> all = stuRepository.findAll(example);
return all;
}
/**
* å®ç°å页æ¥è¯¢
*
* @return
*/
@GetMapping("/findWithPage")
public Page<Stu> findWithPage() {
Students stu = Students.builder().age(12).build();
Example<Stu> example = Example.of(stu);
Page<Stu> all = stuRepository.findAll(example, PageRequest.of(1, 5, Sort.by("name")));
return all;
}
}
å¯å¨æå¡ï¼è¿éé»è®¤æ¯éç¨Hibernateæ¡æ¶ï¼è¿è¡æä¹ å
Â
è³äºJpaRepositoryæ´å 详ç»çæç¨ä¹å¯ä»¥å¨ç½ä¸è¿è¡æ¥è¯¢ï¼è¿éææ»ç»çå ç§æ¹å¼
使ç¨èªå®ä¹çæ¹æ³
èªå®ä¹çç®åæ¥è¯¢å°±æ¯æ ¹æ®æ¹æ³åæ¥èªå¨çæSQLï¼ä¸»è¦çè¯æ³æ¯findXXBy,readAXXBy,queryXXBy,countXXBy, getXXByåé¢è·å±æ§åç§°ã
æç §Spring Dataçè§èï¼æ¥è¯¢æ¹æ³ä»¥find | read | get å¼å¤´ï¼æ¶åæ¥è¯¢æ¡ä»¶æ¶ï¼æ¡ä»¶ç屿§ç¨æ¡ä»¶å ³é®åè¿æ¥ï¼
è¦æ³¨æçæ¯ï¼æ¡ä»¶å±æ§ä»¥é¦åæ¯å¤§åã
ä¾å¦ï¼StuRepository䏿·»å ä¸ä¸ªæ¹æ³
public interface StuRepository extends JpaRepository<Students, Long> {
/**
* æ ¹æ®ååèªå®ä¹æ¹æ³
* @param name
* @param age
* @return
*/
List<Stu> findByNameAndAge(String name, int age);
}
 ç¼åä¸ä¸ªControlleræ¹æ³ï¼
/**
* 使ç¨èªå®ä¹çæ¥è¯¢æ¹æ³
* @return
*/
@GetMapping("/findByNameAndAge")
public List<Students> findByNameAndAge() {
List<Students> stus = stuRepository.findByNameAndAge("æå", 12);
return stus;
}
使ç¨@Queryæ¥æå®æ¬å°æ¥è¯¢
ææ¶åå¯è½éè¦èªå·±ç¼åSQLï¼é£ä¹å¯ä»¥ä½¿ç¨@Queryæ¥ç¼åèªå·±çSQLè¯å¥
public interface StuRepository extends JpaRepository<Students, Long> {
@Query(value="select * from students where name like %?%" ,nativeQuery=true)
List<Stu> findLikeName(String name);
}
äºç©
springæä¾äºå£°æå¼çäºå¡ç®¡çâ
â@Transactionalâ
âã使ç¨èµ·æ¥é常æ¹ä¾¿ãè¿éåªå±ç¤ºå¦ä½ä½¿ç¨ï¼å ·ä½åçåç»å讲ã
ç±äºspringçäºå¡ç®¡çæ¯éè¿AOP卿代çå®ç°çï¼æä»¥è°ç¨æ¹ä¸äºå¡æ¹æ³ä¸å¾å¨åä¸ä¸ªæ¹æ³å ã
 ç¼åä¸ä¸ªStuServiceÂ
@Component
@Slf4j
public class StuService {
@Autowired
private StuRepository stuRepository;
@Transactional(rollbackFor = Exception.class)
public void createStu() {
Students stu = Stu.builder().age(100).address("1111").name("卿æ").build();
Students save = stuRepository.save(stu);
log.info(save.toString());
int a = 1/0;
Students = Stu.builder().age(200).address("2222").name("卿æ2").build();
Stu save1 = stuRepository.save(stu);
log.info(save1.toString());
}
}
å¨controller䏿µè¯
/**
*äºå¡æµè¯
* @return
*/
@GetMapping("/testTransactional")
public void testTransactional() {
stuService.createStu();
}
注æï¼è¿érollbackForæå¥½åä¸ï¼å¦åå¯è½ä¼åå¨ä¸äºè¿è¡æ¶å¼å¸¸ä¸æ´»ä¸å°å¦ãéå°çå¼å¸¸
å¨è¿éå¯è½ä¼éå° time zoneæ¶åºå¼å¸¸
è§£å³åæ³ï¼
使ç¨rootç¨æ·ç»å½mysqlï¼æ§è¡å½ä»¤â
âshow variables like '%time_zone%';â
â
åç°æ¶åºæ¯ç³»ç»é»è®¤çï¼èé»è®¤æ¯ç¾å½æ¶åºï¼èæä»¬ä¸å½è¦æ¯ä»ä»¬è¿8å°æ¶ãæä»¥éè¦å¯¹å ¶è¿è¡ä¿®æ¹ï¼
â
âset global time_znotallow='+8:00';â
â
æ§è¡å®æä¹åï¼å次æ¥è¯¢