依赖:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java'
配置:
spring:
datasource:
url: jdbc:mysql://{数据库地址}/{数据库名}
username: {数据库用户名}
password: {数据库密码}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update# 自动建表配置,会在运行时就把所有实体类表创建出来,新增字段会自动修改表添加,但是删除字段不会同步移除表column
show-sql: false#是否运行时显示执行的sql
接着我们创建对应的实体类(表):
@Entity
@Table(name="person")//name注解用于指定实体类映射的表名,如果不指定会默认使用实体类的类名小写作为表名
public class Person {
@Id//主键
@GeneratedValue(strategy= GenerationType.IDENTITY)//主键自增长
private Integer id;
//也可以动态的设置列名,如果不进行设置则默认使用字段小写名,如果字段为驼峰例如nameNew,自动默认的列名会为name_new
//同样column还可以设置一些列的默认属性,例如是否可为null,默认值等等
@Column(name ="name")
private String name;
private String age;
}
然后我们实现数据库的操作类即可:
public interface PersonRepository extends JpaRepository<Person,Integer> {
//我们即可以使用JPA提供的方法动态操作生成sql查询,也可以通过注解,自己手动编写sql运行
@Query(value ="select * from person where name=?1 and age=?2",nativeQuery=true)
public Person findPersonBySql(String name,Integer age);
}
然后我们直接使用即可:
@Autowired
PersonRepository personRepository;
@GetMapping("/findperson")
public String findPerson(@RequestParam("name") String name,@RequestParam("age") Integer age){
Person person=personRepository.findPersonBySql(name,age);
//JPA已经内置提供了一些简便方法
personRepository.findAll();
//jpa提供的save既是创建方法也是更新方法,更新逻辑为查找这个对象主键,不存在就创建,已存在就更新
//注意的是,save更新会更新所有列,所以如果传入的person的name为null,但是表里有值,会被更新为null
personRepository.save(person);
return "查找person";
}
数据库的事物操作:
@Service
public class PersonService {
@Autowired
PersonRepository personRepository;
//springboot的transactional注解,指定在service上,开启数据库的事物操作
@Transactional
public void saveAndDelete(){
//因为开启了Transactional,所以两条数据库操作一定要均执行成功,否则回滚,均不执行
Person person1=new Person();
person1.setName("刘德华");
personRepository.save(person1);
Person person2=new Person();
person2.setName("张学友");
personRepository.save(person2);
}
}