java jpa 还流行吗_恕我直言,Spring Boot 集成Spring Data JPA的玩法你还真不一定知道...

通过本文你可以收获:

什么是JPA?

认识Spring data JP

快速搞定Spring boot集成Spring data JPA

Spring data JPA高级用法入门

什么是JPAJPA是Java Persistence API的简称

目前市面上比较流行的ORM框架有Mybatis、Hibernate、SpringJDBC等。

在没有JPA规范之前,由于没有官方的标准,使得每个ORM框架之间的API差距都蛮大的,只要使用了一种ORM框架后系统会严重受限于该ORM框架的标准。

基于上这些原因,Sun引入新的JPA ORM,主要原因有两点:

简化现有Java EE 应用开发工作

Sun希望整合ORM技术,实现统一的API调用接口

JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它又不限于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。Hibernate3.2+、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。JPA是一套规范,不是产品。那么像Hibernate、TopLink、JDO他是一套产品。如果某产品实现了这个JPA规范,我们就称之为JPA的实现产品。

总的来说jap包含三个方面的技术:

ORM映射元数据,支持xml和注解两种元数据的形式,元数据描述对象和表之间的映射关系。

API,操作实体对象来执行增删改查操作(CRUD)

查询语言,通过面向对象非面向数据库的查询语言(JPQL)查询数据,避免程序的SQL语句紧密耦合。

以下是JPA的架构图

784d93c1d43d

Spring data JPA入场

Spring data JPA  是spring家族下的Spring data下面的一个子项目。

官网地址:

https://spring.io/projects/spring-data-jpa#overview

784d93c1d43d

Spring data JPA  是Spring基于ORM框架、JPA规范的基础之上封装的一套JPA应用框架,可以让使用者(程序员)用最简单的代码即可实现对象数据的CRUD操作,上手容易,能提高开发效率。其实说白了Spring就是基于Hibernate之上构建的JPA使用解决方案,方便于大家在Spring Boot项目中的使用JPA技术。

快速上手Spring data jpa

首先是快速建一个Spring Boot项目。

添加依赖

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

添加相关配置项

#mysql配置

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/my_jpa?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false

spring.datasource.username=root

spring.datasource.password=lwt123456@

spring.jpa.properties.hibernate.hbm2ddl.auto=update

#展示sql(调试或者排查问题时候很有用)

spring.jpa.show-sql=true

spring.jpa.properties.hibernate.format_sql=true

配置项简单说明

spring.data配置的是数据库相关信息

spring.jpa.properties.hibernate.hbm2ddl.auto=update

create:每次运行程序时,都会重新创建表,故而数据会丢失

create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表

upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)

validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错

none: 禁用DDL处理

建表语句

CREATE TABLE `tuser` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(32) DEFAULT NULL,

`password` varchar(16) DEFAULT NULL,

`phone` varchar(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

初始化一条数据

INSERT INTO `my_jpa`.`tuser`( `name`, `password`, `phone`) VALUES ('zhangsan', '123456', '17256154321');

Entity

import javax.persistence.*;

@Entity

public class TUser {

@Id

@GeneratedValue

private Integer id ;

private String name;

private String password;

private String phone;

//get set

}

UserJpaDao继承JpaRepository。有的项目可能会定义成UserRepository,跟上父类的命名方式。这个是项目规范而已,不在本次技术讨论范围,这里还是采用传统方式:

controller--service--dao模式

UserJpaDao的代码如下

import com.tian.usercenter.jpa.TUser;

import org.springframework.data.jpa.repository.JpaRepository;

public interface  UserJpaDao extends JpaRepository {

}

UML图如下

784d93c1d43d

其中JpaRepository中已有的方法

784d93c1d43d

另外QueryByExampleExecutor中已有的方法,通过方法名可以看出是查询使用:

784d93c1d43d

另外CrudRepository中定义的方法,CRUD就是增删改查的意思,顾名思义,这个类主要是增删改查的基本方法的定义。

784d93c1d43d

写一个Controller@RestController

public class JpsController {

@Resource

private UserJpaDao userJpaDao;

@GetMapping("/testjpa")

public Object test(){

long count = userJpaDao.count();

System.out.println("cout="+count);

return userJpaDao.findAll();

}

}

这里使用了count方法和findAll方法,都是使用已有的方法,细心的人看出来了,这两个方法并不是我们dao里实现的。

提醒:这里是为了演示,所以controller直接调用dao了,通常开发的时候中间至少还有一层service。

启动类@SpringBootApplication

public class UserCenterApplication {

public static void main(String[] args) {

SpringApplication.run(UserCenterApplication.class, args);

}

}

启动main方法

已经成功启动了。

访问一下:http://localhost:8080/testjpa

784d93c1d43d

sql日志打印

784d93c1d43d

这样spring data jpa就这么简单的集成到Spring Boot项目中明了。

高级用法自定义sql

在实际项目开发中,简单的增删改查通常是很难满足的,基本都会使用到一些自定义sql来实现业务。下面就是用自定义sqlpublic interface  UserJpaDao extends JpaRepository {

@Query(value = "select * from tuser tu where tu.name= ?1 ", nativeQuery = true)

TUser findByName(String name);

}

很多人都习惯于原生态sql,所以这里需要加上一个nativeQuery=true

sql中的?1表示方法参数中的第一个参数。

除了上面指定参数以外还有可以使用。

注意:注解@Param别导错包@Query(value = "select tu from TUser tu where tu.id= :id ")TUser findByPId(@Param("id") Integer id);

启动类@RestController

public class JpsController {

@Resource

private UserJpaDao userJpaDao;

@GetMapping("/testjpa")

public Object test() {

TUser user = userJpaDao.findByName("zhangsan");

System.out.println("findByName=" + user);

return userJpaDao.findByPId(1);

}

}

启动项目。

请求:http://localhost:8080/testjpa

784d93c1d43d

后台输出

784d93c1d43d

OK,今天就到这里。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值