单独建一个项目,加入测试和热部署依赖,其它全部去掉,然后加入下面两个依赖:
这样jps和mysql就加入并自动配置进来了,可以进行数据库开发。
在配置文件里加入数据库基本连接配置:
基本的内容都配置好和加进来就可以写代码了,下面是一个JPA风格的实体类,以用过的 SYS_USER 表为例,实体类如下:
@Entity注解说明是个实体类
@Table注解表名实体类对应的表名,表名为name值
@Id定义一条记录的唯一标识,并结合注解@GeneratedValue将其设置为自动生成
接下来使用JPA持久化,定义一个接口,继承于JPA资源库JpaRepository接口,使用@Repository注解将这个接口也定义为一个资源库,使它能被其它资源使用,并为其它程序提供存取数据库的功能。代码如下:
关于SYS_USER的持久化代码已经完成了,可以看到过程很简单,接下来进行测试,进入测试类,调用接口的方法,首先测试一个新增方法:
执行,可以看到如下结果:
原因是,MySQL对lower_case_table_names使用区分大小写的表名比较设置 (可能值为'0')。但是,FishEye在表名 FE-4276中不一致-数据库表OPEN的大小写不一致。
我的解决办法是,在配置文件中加入一行配置:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
然后执行测试代码,可以看到执行成功,然后看下一下数据库,发现新增成功:
在spirngboot中,使用JPA加数据库,可以很容易实现持久化,几乎不需要什么代码。增删改查的写法都与这个例子类似。
看一下分页查询的写法,首先数据库准备九条数据:
然后每页设置为3条,分别查询第一页和第二页,先查询第二页,如下:
控制台日志为:
查询第一页,如下:
控制台日志为:
观察可以得出,JPA页码从0开始,使用要注意!!!
进入父接口JpaRepository,可以看到已经定义好的可以直接使用的很多方法,如下:
这些都是可以在上面及其简单的配置基础上直接使用的。
JPA还提供了一些自定义声明方法的规则,例如,在接口中使用关键字findBy,readBy,getBy,作为方法名的前缀,拼接实体类中的属性字段(首个字母大写),并可以选择拼接一些SQL查询关键字来组合成一个查询方法,例如,对于用户实体,下列查询关键字可以这样使用:
And, 例如:findByIdAndName(Long id, String name)
Or,例如:findByIdOrName(Long id, String name)
Between,例如:findByIdBetween(Long startId, Long endId)
LessThan,例如:findByIdLessThan(Long endId)
GreaterThan,例如:findByIdGreaterThan(Long startId)
IsNull,例如:findByNameIsNull()
IsNotNull,例如:findByNameIsNotNull()
NotNull,例如:与IsNotNull等价
Like,例如:findByNameLike(String name)
NotLike,例如:findByNameNotLike(String name)
OrderBy,例如:findByNameOrderByIdAsc(String name)
Not,例如:findByNameNot(String name)
In,例如:findByNameIn(Collection<String> nameList)
NotIn,例如:findByNameNotIn(Collection nameList)
又如,下面对用户实体类自定义的方法声明,它们都是符合JPA规则的,这些方法也不用实现,JPA将会代理实现这些方法:
SysUser findByNameLike(String name);
SysUser readByName(String name);
List<User> getByIdLessThan(Long id);
在多个实体类中,可以使用@ManyToOne @ManyToMany 等注释在实体中实现关系对应和级联操作,如果数据库中没有物理外键等内容,可以不写这类注解。
spirngboot中,整合JPA与mysql就是这么简单,可以用JDBC连接的都可以使用这种方式持久化。
在自己定义的接口中,可以使用@Query注解来自定义SQL语句。注意使用的都是类名和属性名,例如:
在自己的项目中,可以根据项目组的规范,自定义接口来扩展JPA的接口。定义一些新的通用方法。
所有支持JDBC和JPA的关系型数据库都可以按照上面的例子进行操作。