Spring Data JPA


目录:

  1. 简介

  2. 使用

    2.1 依赖

    2.2 配置数据源信息文件

    2.3 Dao层编写

简介

Spring Data JPA 是 spring data 项目下的一个模块。提供了一套基于 JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA 来实现的。

Spring Data JPA 的技术特点:

我们只需要定义接口并集成 Spring Data JPA 中所提供的接口就可以了。不需要编写接口实现类

img

使用

依赖

<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";
		}
	}
	
}

文章作者: 小小千千
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小千千 !
评论
  目录