在SpringBoot框架中引入Jpa,大致分为如下步骤:
1.在pom文件中引入相关依赖
<!--database-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--Spring data jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.在application.yml中添加jpa相关的配置:
下面是mysql的数据库配置
IpAddress:Port/Database替换成自己的数据库地址、端口号和数据库名称
username和password也替换掉
spring:
......
datasource:
url: jdbc:mysql://IpAddress:Port/Database?useUnicode=true&characterEncoding=UTF8&verifyServerCertificate=false&useSSL=false&requireSSL=false
username: admin
password: admin
driver-class-name: com.mysql.jdbc.Driver
maxIdleTime: 1800
validationQuery: select 1
testOnBorrow: true
max-idle: 5
min-idle: 5
test-while-idle: true
hibernate:
show_sql: true
ddl_auto: update
jpa:
database: MYSQL
show_sql: true
hibernate:
ddl_auto: update
naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
3.创建实体类:
创建一个与controller平级的包entity,在entity内新建一个User实体对象(以User为例):
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User implements Serializable {
@Id
private String id;
@Column
private String name;
@Column
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
}
注解@Entity表示该类是个实体类。
注解@Id表示该属性为表的主键。
注解@Column表示该属性为表中的一列。
@Json开头的注解是Json序列化相关的,@JsonIgnoreProperties的作用是忽略指定属性,@JsonFormat作用是指定序列化时非字符串属性转为字符串的格式。
对于自增主键还需要添加一个注解:
@Id
@GeneratedValue
private String id;
对于uuid主键还需要添加两个注解:
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private String id;
4.创建Repository类:
@Repository
public interface UserRepository extends JpaRepository<User, String> {
List<User> findByName(String name);
List<User> findAll();
void flush();
User saveAndFlush(User user);
}
注解@Repository用于持久层的接口。
该接口扩展自JpaRepository<S, T>,S为实体类的类型,T为实体类的注解为Id的属性的类型。
这个接口会根据方法的名字做一些推断。例如findByName方法,Jpa会分局findBy后面的字段生成类似 "select * from user where name=?"这样的SQL语句。
复杂的查询可以在方法上注解@Query,指定SQL语句或HQL语句,例如:
@Query(nativeQuery = true, value = "select * from project_tool where project_id=?1 and tool_id=?2")
ProjectTool findByProjectIdAndToolId(String projectId, String toolId);
创建接口:
public interface UserService {
User getUserById(String id);
List<User> getAllUsers();
User addUser(User user);
User updateUser(User user);
void deleteUser(User user);
void deleteUserById(String userId);
}
实现接口:
@Service
public class UserServiceImpl implements UserService {
private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private UserRepository userRepository;
@Override
public User getUserById(String id) {
return this.userRepository.findOne(id);
}
@Override
public List<User> getAllUsers() {
return this.userRepository.findAll();
}
@Override
public User addUser(User user) {
return this.userRepository.saveAndFlush(user);
}
@Override
public User updateUser(User user) {
return this.userRepository.saveAndFlush(user);
}
@Override
public void deleteUser(User user) {
this.userRepository.delete(user);
}
@Override
public void deleteUserById(String userId) {
this.userRepository.delete(userId);
}
}
实现类使用注解@Service。
实现中用到了UserRepository,使用@Autowired依赖注入即可。