摘要:Spring-data-jpa的强大和方便之处在于:可以仅仅用一层接口,就可以实现对数据库的访问和操作。本文详细介绍了,Spring Boot环境下如何使用Spring-data-jpa 来访问和操作数据库。
开发环境:
SpringBoot
Spring-data-jpa
开发工具:IntelliJ IDEA
mysq 5.7
1.pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.配置文件
数据库连接
# mysql
spring.datasource.url=jdbc:mysql://22.22.22.22/ss
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
jpa相关:
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql
spring.jpa.generate-ddl=true
spring.data.jpa.repositories.enabled=true
ddl-auto的四种状态:
create: 每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
3.实体类
package com.alibaba.entity;
import javax.persistence.*;
import java.io.Serializable;
/**
* Created by lightClouds917
* Date 2018/2/3
* Description:
*/
@Table(name = "user")
@Entity
public class User implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id",nullable = false)
private Integer id;
@Column(name = "name",nullable = false,unique = true)
private String name;
@Column(name = "password",nullable = true)
private String password;
@Column(name = "address",nullable = true)
private String address;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", address='" + address + '\'' +
'}';
}
public User(String name, String password, String address) {
this.name = name;
this.password = password;
this.address = address;
}
public User() {
}
}
注意注解:
@Table(name = "user") 为建表的表名
@Entity 标明为实体类
@Id 主键上一定要有这个标识,不然会出错的
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Transient Entity中不映射成列的字段得加@Transient 注解
这是主键的生成策略,四种方式:
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。
4.持久层
package com.alibaba.dao;
import com.alibaba.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* Created by lightClouds917
* Date 2018/2/3
* Description:
*/
public interface UserRepository extends JpaRepository<User,Long> {
User findByName(String name);
User findById(Integer id);
User findByAddress(String address);
void deleteByName(String name);
}
持久层,需要继承JpaRepository<User,Long>,第一个参数为实体类类型,第二个为long类型,在这个父类方法中,有一些已经写好了的方法可以直接调用;而且,还提供了,根据方法名自动解析生成sql的功能,如果使用idea,联想功能也是很强大的,当我写个find后他会自动联想这个实体中的属性,你可以直接选择然后用and或者or等来拼接。
jpa还有很多更强大的用法,比如自己写sql,分页,去重等,本篇先简单介绍如何入门。
问题:
1.出现如下时:
Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'.You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
可修改:
spring.datasource.url=jdbc:mysql://47.100.54.6/sz
为:
spring.datasource.url=jdbc:mysql://47.100.54.6/sz?useSSL=false
2.如出现如下错误时,请在实体的主键上加上@Id注解
Caused by: org.hibernate.AnnotationException: No identifier specified for entity