使用Spring-Data-JPA组件操作数据库。
JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。
Spring-Data-JPA是Spring对Hibernate的整合。
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
配置文件加数据库配置:
spring:
profiles:
active: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dbgirl
username: root
password: 123456
jpa:
hibernate:
ddl-auto: create
show-sql: true
建立数据库对应的一个类,这里是Girl的bean,
@Entity
public class Girl {
@Id
@GeneratedValue
private Integer id; //表示主键,并且自增
private String cupSize;
private Integer age;
private String content;
public Girl() {
//必须生成无参的构造方法,不然数据库操作会报错
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCupSize() {
return cupSize;
}
public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
接着建好mysql数据库dbgirl,然后ide点击运行。运行后用Navicat查看dbgir数据库,发现girl表已经建好了。
这里其实配置文件中设置了每次运行都先删除再创建表:
jpa:
hibernate:
ddl-auto: create
show-sql: true
ddl-auto: update则不会重新创建。
操作数据库
1、新建Girl的bean,上面已经做过了。
2、新建一个接口GirlRepository继承自JpaRepository
public interface GirlRepository extends JpaRepository<Girl,Integer>{}
//Girl为数据库表对应的实体,Integer代表主键
3、增加url映射方法
@Autowired
private GirlRepository girlRepository;
/**
* 获取所有的女生
* @return
*/
@GetMapping(value = "/girls")
public List<Girl> girlList(){
return girlRepository.findAll();
}
over,直接运行。仅仅只要三步,多么的简单啊。
如果要根据age也就是年龄来查找,则
public interface GirlRepository extends JpaRepository<Girl,Integer>{
//通过年龄来查询,这里会查找findByAge中by后的age是否在Girl中有,没有则会报错
//参考链接http://blog.csdn.net/pengdingxu10/article/details/72674900
public List<Girl> findByAge(Integer age);
}
GirlController中
/**
* 根据年龄查询
* @param age
* @return
*/
@GetMapping(value = "/girls/age/{age}")
public List<Girl> girlListByAge(@PathVariable("age") Integer age){
return girlRepository.findByAge(age);
}
只查找一条记录,用findOne。
/**
* 查询一个女生
* @param id
* @return
*/
@GetMapping(value = "/girls/{id}")
public Girl girlFindOne(@PathVariable("id") Integer id){
return girlRepository.findOne(id);
}
根据id更新一个女生
/**
* 更新
* @param id
* @param cupSize
* @param age
* @param content
* @return
*/
@PutMapping(value = "/girls/{id}")
public Girl girlUpdate(@PathVariable("id") Integer id,
@RequestParam("cupSize") String cupSize,
@RequestParam("age") Integer age,
@RequestParam("content") String content){
Girl girl = new Girl();
girl.setId(id);
girl.setCupSize(cupSize);
girl.setAge(age);
girl.setContent(content);
return girlRepository.save(girl);//返回保存的girl
}
根据id删除一条记录
/**
* 删除
* @param id
*/
@DeleteMapping(value = "/girls/{id}")
public void girlDelete(@PathVariable("id") Integer id){
girlRepository.delete(id);
}
使用事务
使用@Transactional
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Transactional
public void insertTwo(){
Girl girlA = new Girl();
girlA.setCupSize("B");
girlA.setAge(22);
girlA.setContent("古灵精怪");
girlRepository.save(girlA);
Girl girlB = new Girl();
girlB.setCupSize("F");
girlB.setAge(16);
girlB.setContent("人小鬼大");
girlRepository.save(girlB);
}
}
保存数据遇到的问题
保存女生一条数据发现在mysql中中文是?号,参考以下链接解决
Spring Boot下Mysql数据库的中文乱码问题分析
mysql如何更改character-set-server默认为latin1
window下重启mysql
启动:输入 net stop mysql
停止:输入 net start mysql