JPA是Java Persistence API的简称,中文名Java持久层API。它是一套标准或规范,需要供应商来实现其功能的,而Hibernate从3.2就开始兼容JPA了。本篇博客就来说说springboot如何使用JPA来访问数据库的以及springboot的事务管理
首先我们创建一个springboot项目,并添加如下依赖
项目创建好之后,我们先创建一个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中对应的方法就行了。