目录:
简介
使用
2.1 依赖
2.2 配置数据源信息文件
2.3 Dao层编写
简介
Spring Data JPA 是 spring data 项目下的一个模块。提供了一套基于 JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA 来实现的。
Spring Data JPA 的技术特点:
我们只需要定义接口并集成 Spring Data JPA 中所提供的接口就可以了。不需要编写接口实现类。
使用
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
配置文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/mytest
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update #自动更新
show-sql: true #日志中显示sql语句
jpa.hibernate.ddl-auto
是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:
- create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
- create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
- update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
- validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity //这里一定要添加@Entity注解
public class User {
@Id
private int id;
private String username;
private String password;
private int age;
}
Dao层编写
import org.springframework.data.jpa.repository.JpaRepository;
import com.jason.entity.User;
// 这里不需要注入,很奇怪吧?
public interface UserRepository extends JpaRepository<User, Integer>{
void deleteByUsername(String username);
User findByUsername(String username);
}
在调用时,可以参看Spring Data博客的接口生成规则介绍。
这里也有一篇很多使用示例的博客:Spring Data Jpa的基本使用
启动类
//这里也不需要扫描Dao层,神奇吧?
@SpringBootApplication
public class SpringDataJpaDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDataJpaDemoApplication.class, args);
}
}
接口
特别注意,删除操作需要添加@Transactional,开启事务!!!不然会报错。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.jason.dao.UserRepository;
import com.jason.entity.User;
@RestController
@Transactional
public class UserController {
@Autowired
private UserRepository userRepository;
/**
* 添加一个用户信息
* @param user
* @return
*/
@RequestMapping("/addUser")
public String addUser(User user) {
try {
userRepository.save(user);
return "Success";
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "Failed";
}
}
/**
* 查询数据库所有信息
* @return
*/
@RequestMapping("/getAll")
public String getAll() {
try {
return JSON.toJSONString(userRepository.findAll());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "Failed";
}
}
@RequestMapping("/getUser")
public String getUser(String username) {
try {
return JSON.toJSONString(userRepository.findByUsername(username));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "Failed";
}
}
/**
* 删除用户信息
* @param username
* @return
*
* 特别注意,删除操作需要添加@Transactional,开启事务
*/
@RequestMapping("/deleteUser")
public String deleteUser(String username) {
try {
userRepository.deleteByUsername(username);
return "Success";
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "Failed";
}
}
/**
* 更新用户信息
* @param username
* @param age
* @return
*/
@RequestMapping("/updateUser")
public String updateUser(String username, int age) {
try {
User findByUsername = userRepository.findByUsername(username);
findByUsername.setAge(age);
userRepository.save(findByUsername);
return "Success";
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "Failed";
}
}
}