JPA是Java Persistence API的简称,中文名Java持久层API。它是一套标准或规范,需要供应商来实现其功能的,而Hibernate从3.2就开始兼容JPA了。本篇博客就来说说springboot如何使用JPA来访问数据库的以及springboot的事务管理

首先我们创建一个springboot项目,并添加如下依赖

纯jpa 连接sqlite_纯jpa 连接sqlite


项目创建好之后,我们先创建一个User实体类

@Entity
@Table(name="user")
public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	@Column(length=10,unique=true)
	private String userId;
	@Column(length=20)
	private String userName;
	@Column(length=16)
	private String password;
	@Column(length=5)
	private String sex;
	@Column(length=10)
	private String birthday;
	@Column(columnDefinition="varchar(5) not null default ''comment '用户状态:0 生效,1 失效'")
	private String status;
	@Column(length=10)
	private String createDate;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public String getCreateDate() {
		return createDate;
	}
	public void setCreateDate(String createDate) {
		this.createDate = createDate;
	}
	
}

1.@Entity表示这是一个实体类,项目启动时会根据类的属性自动建表
2.@Table用来标注实体类与数据库中表名的对应关系
3.@Id表示该字段为主键
4.@GeneratedValue表示主键的生成策略,通过属性strategy来指定,其值有四种:

  • GenerationType.TABLE:使用一个特定的数据库表格来保存主键,持久化引擎通过关系数据库的一张特定的表格来生成主键,这种策略的好处就是不依赖于外部环境和数据库的具体实现,在不同数据库间可以很容易的进行移植,但由于其不能充分利用数据库的特性,所以不会优先使用
  • GenerationType.SEQUENCE:有些数据库不支持主键自增长,比如Oracle,所以他提供了一种序列sequence作为主键生成策略
  • GenerationType.IDENTITY:主键自增长,数据库在插入数据时,会自动给主键赋值,比如MYSQL可以在创建表时声明"auto_increment" 来指定主键自增长
  • GenerationType.AUTO:JPA默认的主键生成策略,可以显示的指定@GeneratedValue(strategy=GenerationType.AUTO),也可以直接写@GeneratedValue。它表示JPA会根据底层数据库使用的主键生成策略选择以上三种的一种

5.@Column用来标注属性与表字段的对应关系,其属性有

  • name:表示属性对应的字段名称
  • length:表示字段的长度,只对varchar类型有效,默认为255个字符
  • unique:表示该字段是否为唯一标识,默认为false
  • nullable:表示该字段是否可以为null值,默认为true
  • insertable:表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值
  • updatable:表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值
  • columnDefinition:表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用
  • precision:表示精度,字段类型为double时,表示数值的总长度
  • scale:表示精度,字段类型为double时,表示小数点所占的位数

再创建一个UserDao接口继承JpaRepository接口

public interface UserDao extends JpaRepository<User, Integer> {

	public User findUserByUserId(String userId);
	
	@Query("select u from User u where u.userId=:userId and u.password=:password")
	public User findByUserIdAndPassword(@Param("userId") String userId,@Param("password") String password);
}

1.JpaRepository<User, Integer>,其中User表示实体类的类型,Integer表示主键的类型
2.继承JpaRepository接口后我们就具有了一下数据访问方法:

  • List< T > findAll()
  • List< T > findAllById(Iterable< ID > ids)
  • void flush()
  • T save(T t)
  • void delete(T t)
  • void deleteAll()

3.该接口中还自定义了两个数据访问方法findUserByUserId(String userId)和findByUserIdAndPassword(String userId,String password)
4.@Query表示该方法根据其内的hql来查询

然后再创建一个UserController

@Controller
@RequestMapping(value="/user")
public class UserController {
	
	@Autowired
	private UserDao userDao;
	
	@ResponseBody
	@GetMapping(value="/findUserByUserId")
	public User findUserByUserId(@RequestParam String userId){
	
		return userDao.findUserByUserId(userId);
	}

	@ResponseBody
	@GetMapping("/findUserList")
	public List<User> findUserList() {
		
		return userDao.findAll();
	}
	
	@ResponseBody
	@GetMapping(value="/getByUserIdAndPassword")
	public User getByUserIdAndPassword(@RequestParam String userId,@RequestParam String password){
	
		return userDao.findByUserIdAndPassword(userId, password);
	}
}

然后再application.yml中配置数据源和jpa的一些相关配置

spring:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
  datasource:
    url: jdbc:mysql://localhost:3306/jpa
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

1.ddl-auto:表示实体类维护表结构的具体行为,update为每次启动项目时,若实体类有变化则更新其表结构,表内数据不丢失。create为每次启动项目时都会创建表,若之前存在表,则删除重建,此法会丢失数据,慎用。create-drop为项目启动时根据实体类生成表,但是当sessionFactory关闭的时候表会被删除。validate表示启动时验证实体类和数据表是否一致。none表示什么都不做
2.jpa连接mysql自动建表默认使用MyISAM引擎,它不提供事务的支持,也不支持行级锁和外键。若要支持事务,可指定数据库引擎为InnoDB。mysqldatabase-platform:org.hibernate.dialect.MySQL5InnoDBDialect属性即指定数据库引擎为InnoDB
3.show-sql:true 表示在控制台中打印出sql

OK!一切就绪,启动项目,访问UserController中对应的方法就行了。