关注“Java后端技术全栈”**
回复“面试”获取全套大厂面试材料
通过本文你能够播种:
- 什么是JPA?
- 意识Spring data JPA
- 疾速搞定Spring boot集成Spring data JPA
- Spring data JPA高级用法入门
什么是JPA
JPA是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的架构图
Spring data JPA入场
Spring data JPA 是spring家族下的Spring data上面的一个子项目。
官网地址:
https://spring.io/projects/sp...
Spring data JPA 是Spring基于ORM框架、JPA标准的根底之上封装的一套JPA利用框架,能够让使用者(程序员)用最简略的代码即可实现对象数据的CRUD操作,上手容易,能进步开发效率。其实说白了Spring就是基于Hibernate之上构建的JPA应用解决方案,不便于大家在Spring Boot我的项目中的应用JPA技术。
疾速上手Spring data jpa
首先是疾速建一个Spring Boot我的项目。
参考:如何疾速构建Spring Boot根底我的项目?
增加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
增加相干配置项
#mysql配置spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/my_jpa?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=falsespring.datasource.username=rootspring.datasource.password=lwt123456@spring.jpa.properties.hibernate.hbm2ddl.auto=update#展现sql(调试或者排查问题时候很有用)spring.jpa.show-sql=truespring.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.*;@Entitypublic 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<TUser,Integer> {}
UML图如下
其中JpaRepository中已有的办法
另外QueryByExampleExecutor中已有的办法,通过办法名能够看出是查问应用:
另外CrudRepository中定义的办法,CRUD就是增删改查的意思,顾名思义,这个类次要是增删改查的根本办法的定义。
写一个Controller
@RestControllerpublic 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。
启动类
@SpringBootApplicationpublic class UserCenterApplication { public static void main(String[] args) {SpringApplication.run(UserCenterApplication.class, args);}}
启动main办法
曾经胜利启动了。
拜访一下:http://localhost:8080/testjpa
sql日志打印
这样spring data jpa就这么简略的集成到Spring Boot我的项目中明了。
高级用法
自定义sql
在理论我的项目开发中,简略的增删改查通常是很难满足的,根本都会应用到一些自定义sql来实现业务。上面就是用自定义sql
public interface UserJpaDao extends JpaRepository<TUser,Integer> { @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);
启动类
@RestControllerpublic 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
后盾输入
OK,明天就到这里。
举荐浏览
终于明确为什么要加 final 关键字了!
如何优雅的导出 Excel