先来介绍一下jpa,spring data jpa是对Hibernate的一种封装,方便我们去使用Hibernate,spring全家桶中类似的有spring-data-redis,spring-data-mongodb,mybaits-spring.从这些产品可以看出,spring基本上对市场上的每一种数据库有进行了封装。 在使用持久化操作的时候,我们一般会使用工厂方法来新建对象操作数据库,mybatis的是sqlsession,Hibernate是session,在jpa中是EntityManager. 不过使用jpa的时候有一个非常大的好处是它可以根据我们的方法名动态的生成sql语句,减少了开发的代码量,而且在更换数据库的时候非常方便,移植性较好。
在jpa中没有dao这个概念,取而代之的是repositroy(仓库)。
在使用jpa之前,我们一般需要对jpa进行一些配置。下面列举了一些常用的配置:
spring.jpa.show-sql= true : 在控制台显示sql语句
spring.jpa.hibernate.ddl-auto=update :自动更新表结构
spring.jpa.hibernate.use-new-id-generator-mappings=false :取消jpa自动生成hibernate_sequence,否则会报错,显示数据库中 没有hibernate_sequence这张表
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect //设置数据方言
spring.jpa.properties.hibernate.dialect=包名.MySQL5DialectUTF8 // 自定义数据库方言,方便切换数据库
自定义数据库方言如下:
public class MySQL5DialectUTF8 extends MySQL5InnoDBDialect {
@Override
public String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
}
}
注意:所有的例子基于spring boot2,并且需要在maven中引入相关的依赖
现在来新建一张User表
@Data
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JSONField(ordinal = 1)
private int id;
@JSONField(ordinal = 2)
private String username;
@JSONField(ordinal = 3)
private String password;
}
注意:JSONField是在使用fastjson时自定义顺序
使用jpa新建实体类时,必须指定主键id,生成主键的策略
接下就可以写Repository,一般直接继承JpaRepository
@Repository
public interface UserRepository extends JpaRepository<User,Integer> {
String findByUsername(String username);
}
继承jpaRepository之后,就可以动态的生成sql语句了,其中泛型JpaRepository<R,T>,R为实体类,T为主键的类型
基本的curd方法为:
save(User user);添加一个user
findAll():查询所有的user 返回值为list
findById(int id):根据id查询user
deleteById(int id):根据id删除user,返回值为void
findByUsername(String username):根据username查询user //这个方法是定义在userRepository中
这些基本上就是curd方法,可以看到完全不需要写sql语句,全部由jpa自动生成。
不过jpa自动生成sql有一定的规范,下面是官网的截图。
如果想在控制台打印sql,可在配置文件中添加:spring.jpa.show-sql=true