spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发
前言:
基于spring framework 4.x或spring boot 1.x开发环境
务必注意以下版本问题:
Spring framework4.x(Spring boot1.x)对应spring-data1.x
Spring framework5.x(Spring boot2.x)对应spring-data2.x
一、依赖
需要jpa 1.x,hibernate 5.x,spring-data-commons,spring-data-jpa
maven方式:
- <dependency>
- <groupId>org.hibernate.javax.persistence</groupId>
- <artifactId>hibernate-jpa-2.1-api</artifactId>
- <version>1.0.2.Final</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-core</artifactId>
- <version>5.2.16.Final</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-entitymanager</artifactId>
- <version>5.2.16.Final</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-jpa</artifactId>
- <version>1.11.11.RELEASE</version>
- </dependency>
二、环境配置
注意两个扫描器(一个是po实体类扫描,还有一个是dao层接口扫描)
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- eguid博客所有原创文章均采用知识共享署名-相同方式共享 3.0 中国大陆许可协议进行许可。如有转载请注明博客地址:https://blog.csdn.net/eguid_1/article/details/80018676-->
- <!-- druid连接池 -->
- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
- <property name="driverClassName" value="${jdbc.driverClassName}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- <property name="maxActive" value="${jdbc.maxActive}" />
- <property name="initialSize" value="${jdbc.initialSize}" />
- <property name="maxWait" value="${jdbc.maxWait}" />
- <property name="maxIdle" value="${jdbc.maxIdle}" />
- <property name="minIdle" value="${jdbc.minIdle}" />
- <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
- <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
- <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
- <property name="validationQuery" value="${jdbc.validationQuery}"/>
- <property name="validationQueryTimeout" value="${jdbc.validationQueryTimeout}" />
- <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
- <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}" />
- <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
- <property name="poolPreparedStatements" value="false" />
- <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
- <!-- 配置监控统计拦截的filters -->
- <property name="filters" value="stat,wall"/>
- <property name="connectionProperties" value="druid.stat.slowSqlMillis=5000" />
- </bean>
- <!-- JPA工厂对象 -->
- <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <!-- 扫描此包下的所有Entity,进行ORM映射(这里的实体类包路径需要修改) -->
- <property name="packagesToScan" value="cc.eguid.xxx.pojo.po" />
- <property name="persistenceProvider">
- <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
- </property>
- <property name="jpaVendorAdapter">
- <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
- <property name="generateDdl" value="false" />
- <property name="database" value="MYSQL" />
- <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
- <property name="showSql" value="true" />
- </bean>
- </property>
- <property name="jpaDialect">
- <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
- </property>
- <property name="jpaPropertyMap">
- <map>
- <entry key="hibernate.query.substitutions" value="true 1, false 0" />
- <entry key="hibernate.default_batch_fetch_size" value="16" />
- <entry key="hibernate.max_fetch_depth" value="2" />
- <entry key="hibernate.generate_statistics" value="true" />
- <entry key="hibernate.bytecode.use_reflection_optimizer" value="true" />
- <entry key="hibernate.cache.use_second_level_cache" value="false" />
- <entry key="hibernate.cache.use_query_cache" value="false" />
- </map>
- </property>
- </bean>
- <!-- 使用声明式事务管理 -->
- <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
- <!-- JPA事务管理器 -->
- <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
- <property name="entityManagerFactory" ref="entityManagerFactory"/>
- </bean>
- <!--扫描 JPA持久化接口,spring-data-jpa会自动生成实现类(这里的repostory接口包路径需要修改)-->
- <jpa:repositories base-package="cc.eguid.xxx.dao" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>
- </beans>
三、实体类和Repository接口
(1)编写dao层接口(不需实现类,spring-data-jpa会自动生成实现类)
- import org.springframework.data.repository.CrudRepository;
- /**
- * spring-data-jpa自动生成实现类,简化dao层开发
- * @author eguid
- *
- */
- public interface UserRepository extends CrudRepository<GameUserinfo, Integer>{
- GameUserinfo findByUsername(String username);
- }
(2)自动生成的ORM映射Entity(用JPA生成工具生成的)
- /**
- * The persistent class for the game_userinfo database table.
- *
- */
- @Entity
- @Table(name="userinfo")
- @NamedQuery(name="Userinfo.findAll", query="SELECT g FROM Userinfo g")
- public class Userinfo extends BaseEntity {
- private static final long serialVersionUID = 1L;
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- @Column(unique=true, nullable=false)
- private Integer userid;
- private Timestamp createtime;
- @Column(length=50)
- private String nickname;
- @Column(length=100)
- private String password;
- private int type;
- @Column(length=50)
- private String username;
- //bi-directional many-to-many association to Roleinfo
- @ManyToMany
- @JoinTable(
- name="userrole"
- , joinColumns={
- @JoinColumn(name="userid", nullable=false)
- }
- , inverseJoinColumns={
- @JoinColumn(name="roleid", nullable=false)
- }
- )
- private List<roleinfo> roleinfos;
- public Userinfo() {
- }
- public Integer getUserid() {
- return this.userid;
- }
- public void setUserid(Integer userid) {
- this.userid = userid;
- }
- public Timestamp getCreatetime() {
- return this.createtime;
- }
- public void setCreatetime(Timestamp createtime) {
- this.createtime = createtime;
- }
- public String getNickname() {
- return this.nickname;
- }
- public void setNickname(String nickname) {
- this.nickname = nickname;
- }
- public String getPassword() {
- return this.password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public int getType() {
- return this.type;
- }
- public void setType(int type) {
- this.type = type;
- }
- public String getUsername() {
- return this.username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public List<Roleinfo> getRoleinfos() {
- return this.roleinfos;
- }
- public void setRoleinfos(List<Roleinfo> roleinfos) {
- this.roleinfos = roleinfos;
- }
- }
四、总结
1、添加依赖(添加spring-data及spring-data-jpa依赖包)
2、配置jpa环境(配置dao扫描路径和实体类扫描路径)
3、编写实体类和dao层接口(如果是简单的单表增删改查操作,直接继承CrudRepository接口即可,基本不需要写代码)
jpa单表操作基本无可挑剔,涉及多表操作需要手写hql语句或jpa
实体类是用工具生成的,所以实际上只需要写一个dao接口即可
spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发的更多相关文章
- spring事务详解(二)简单样例
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- Spring学习(一)-----Spring 模块详解
官方下载链接:http://repo.spring.io/release/org/springframework/spring/ Spring 模块详解: Core 模块 spring-beans-3 ...
- Spring RestTemplate详解
Spring RestTemplate详解 1.什么是REST? REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格 ...
- Spring配置文件详解 – applicationContext.xml文件路径
Spring配置文件详解 – applicationContext.xml文件路径 Java编程 spring的配置文件applicationContext.xml的默 ...
- spring配置文件详解--真的蛮详细
spring配置文件详解--真的蛮详细 转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常 ...
- 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理
Spring AOP详解 . JDK动态代理.CGLib动态代理 原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...
- J2EE进阶(四)Spring配置文件详解
J2EE进阶(四)Spring配置文件详解 前言 Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸".Java EE程 ...
- spring事务详解(五)总结提高
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...
随机推荐
- 浅谈iOS中MVVM的架构设计与团队协作【转载】
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- android利用apkplug框架实现主应用与插件通讯(传递随意对象)实现UI替换
时光匆匆,乍一看已半年过去了,经过这半年的埋头苦干今天最终有满血复活了. 利用apkplug框架实现动态替换宿主Activity中的UI元素.以达到不用更新应用就能够更换UI样式的目的. 先看效果图: ...
- C++常用强制类型转换
1.static_cast 最常用的类型转换符,在正常状况下的类型转换,如把int转换成float,如: int i; float f; f=(float)i; 或者 f=static_cast(i) ...
- 【WPF学习笔记】之 System.Exception 对象名 'XXXX' 无效。
我在运行vs时候发现项目报错,如下图: 报Exception错误,对象名“XXXXXX”无效. 经过调查得知,因为连接数据库的库名写错了,如下: 对应正确数据库的库名: 把库名改正确,问题就解决了.
- 转载 ----Android学习笔记 - 蓝牙篇 (Bluetooth)
1.什么是蓝牙 Bluetooth是目前使用的最广泛的无线通讯协议之一 主要针对短距离设备通讯(10米) 常用于连接耳机.鼠标和移动通讯设备等 2.发现周围蓝牙设备 BluetoothAd ...
- 继续封装DBDA.php 加入ajax
<?php class DBDA { public $host = "localhost"; //服务器地址 public $uid = "root"; ...
- spirng boot资料
这里有个srping boot 各种整合的资料 https://blog.csdn.net/Winter_chen001/article/details/80537829 SpringBoot入门总结 ...
- TCP交换数据流——Nagle算法简单记录
Nagle算法: 该算法提出的目的是想解决网络中大量的小的TCP数据包造成网络拥塞的问题,举个例子,当客户端要发送一个字节的TCP数据包到服务器时,我们实际上产生了41字节长的分组:包括20字节的IP ...
- rtsp转rtmp、hls网页直播服务器EasyNVR前端兼容性调试:ie下的 pointer-events- none
发现问题: 之前在做EasyNVR 的web页面开发过程中,力求的都是一个播放效果的.功能的展示.对于兼容性也有注意,但有些细节还是难免有所疏忽. 内部测试发现:由于我们是流媒体的实时视频直播,在we ...
- mysql的分库分表
1 什么是分库分表 这里讨论的情况是一台机器上对应一个数据库. 分库的对象是表,分表的对象是行.分库是说把属于同一个模块的相关性很高的表放在同一个数据库中.分表是说把同一个表的的行分成多个子表,把各个 ...