JPA的基本使用
前提:
创建一个springboot项目
创建一个名为springboottest的MySQL数据库
1 jar包准备
jpa的jar包
mysql驱动的jar包
druid数据库连接池的jar包
lombok工具jar包
注意01: druid的jar包在都如时一定要指定版本,其它的spring boot项目会自动进行版本管理
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.xiangxu</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>springboot</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--数据库相关-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.19</version>
</dependency> <!--工具-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
pom.xml
2 数据库连接池配置和JPA配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 指定使用druid连接池
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 182838
url: jdbc:mysql://127.0.0.1/springboottest?characterEncoding=utf-8&useSSL=false #最大活跃数
maxActive: 20
#初始化数量
initialSize: 1
#最大连接等待超时时间
maxWait: 60000
#打开PSCache,并且指定每个连接PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
#通过connectionProperties属性来打开mergeSql功能;慢SQL记录
#connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
#配置监控统计拦截的filters,去掉后监控界面sql将无法统计,'wall'用于防火墙
filters: stat, wall, log4j jpa:
show-sql: true
hibernate:
ddl-auto: update
# format-sql: true # TODO: 配置失败
连接池和JPA配置
package cn.xiangxu.springboot.baseConfig; import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* 配置DRUID访问的Sevlet和filter
*/
@Configuration
public class DruidConfiguration { @Bean
public ServletRegistrationBean statViewServlet(){
//创建servlet注册实体
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//设置ip白名单
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
servletRegistrationBean.addInitParameter("deny","192.168.0.19");
//设置控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername","wys");
servletRegistrationBean.addInitParameter("loginPassword","123456");
//是否可以重置数据
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
} @Bean
public FilterRegistrationBean statFilter(){
//创建过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//设置过滤器过滤路径
filterRegistrationBean.addUrlPatterns("/*");
//忽略过滤的形式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
druid的servlet和filter配置
jpa基础配置详解:点击前往
druid配置详解:点击前往
3 创建一个实体类
实体类相关注解说明:点击前往
技巧01:lombok的妙用
注意01:使用lombok的坑 -> 即使导入了相关的jar包,lombok的注解在IDEA中时不会生效的,但是项目进行打包后就会生效 -> 解决办法
package cn.xiangxu.springboot.entity.dataObject; import lombok.Data; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; @Entity
@Data
public class Girl {
@Id
@GeneratedValue
@Column(name = "girlId")
private Integer id;
private Integer age;
private String name; public Girl() {
} public Girl(Integer age, String name) {
this.age = age;
this.name = name;
}
}
实体类
4 创建一个与实体类对应的持久层接口
注意01:该接口需要实现一个特定的父接口JpaRepository,继承了这个接口后就该接口就会自动被容器管理,无需再添加注解
chijge cn.xiangxu.springboot.repository; import cn.xiangxu.springboot.entity.dataObject.Girl;
import org.springframework.data.jpa.repository.JpaRepository; public interface GirlRepository extends JpaRepository<Girl, Integer> { }
持久层接口
5 创建一个服务层接口
调用持久层对象的相应方法实现简单的增删改查操作
package cn.xiangxu.springboot.service; import cn.xiangxu.springboot.entity.dataObject.Girl; import java.util.List; public interface GirlService {
Girl saveGirl(Girl girl);
Girl findGirlOne(Integer id);
List<Girl> finGirldAll();
}
服务层接口
package cn.xiangxu.springboot.service.serviceImpl; import cn.xiangxu.springboot.entity.dataObject.Girl;
import cn.xiangxu.springboot.repository.GirlRepository;
import cn.xiangxu.springboot.service.GirlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List; @Service("girlService")
public class GirlServiceImpl implements GirlService {
@Autowired
private GirlRepository girlRepository; @Override
public Girl saveGirl(Girl girl) {
return girlRepository.save(girl);
} @Override
public Girl findGirlOne(Integer id) {
return girlRepository.findOne(id);
} @Override
public List<Girl> finGirldAll() {
return girlRepository.findAll();
}
}
服务层接口实现类
6 创建服务层测试类
package cn.xiangxu.springboot.service.serviceImpl; import cn.xiangxu.springboot.entity.dataObject.Girl;
import cn.xiangxu.springboot.service.GirlService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import static org.junit.Assert.*; @RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j // 日志相关
public class GirlServiceImplTest { @Autowired
private GirlService girlService; @Test
public void saveGirl() throws Exception {
Girl girl = new Girl(25, "三少");
Girl result = girlService.saveGirl(girl);
log.info("【插入数据】");
Assert.assertNotEquals(null, result);
} @Test
public void findGirlOne() throws Exception {
Girl result = girlService.findGirlOne(1);
log.info("【查询单个】");
Assert.assertEquals(new Integer(1), result.getId());
} @Test
public void finGirldAll() throws Exception {
List<Girl> girls = girlService.finGirldAll();
log.info("查询列表");
Assert.assertNotEquals(new Integer(0), new Integer(girls.size()));
} }
服务层测试类
7 具体使用02
说明:不使用数据库连接池,这里只是给出一些特殊的地方
坑01:springboot版本升级后,实体类中的id字段必须根据数据库类型设定对应的默认主键值产生类型
package cn.xiangxu.jpa_demo01.domain.domain_do; import lombok.Data; import javax.persistence.*; /**
* @author 王杨帅
* @create 2018-08-12 15:01
* @desc
**/
@Entity
@Table(name = "student")
@Data
public class Student { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
private String name;
private Integer age;
private String address;
}
Student.java
spring:
datasource:
url: jdbc:mysql://127.0.0.1/testdemo?characterEncoding=utf-8&useSSL=false
username: root
password: 182838 jpa:
properties:
hibernate:
format_sql: true
show_sql: true
配置类
package cn.xiangxu.jpa_demo01.repository; import cn.xiangxu.jpa_demo01.domain.domain_do.Student;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import static org.junit.Assert.*; @RunWith(SpringRunner.class)
@SpringBootTest
public class StudentRepositoryTest { @Autowired
private StudentRepository studentRepository; @Test
public void findAll() {
List<Student> all = studentRepository.findAll();
Assert.assertTrue(all.size() > 0);
} }
测试类
JPA的基本使用的更多相关文章
- 快速搭建springmvc+spring data jpa工程
一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- springmvc+jpa实现分页的两种方式
1.工具类 public final class QueryTool { public static PageRequest buildPageRequest(int pageNumber, int ...
- spring boot(五):spring data jpa的使用
在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...
- 转:使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 一步步学习 Spring Data 系列之JPA(一)
引入: Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服 ...
- 一步步学习 Spring Data 系列之JPA(二)
继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...
- jpa+springmvc+springdata(一)
学习尚硅谷笔记: 首先配置application.xml: <?xml version="1.0" encoding="UTF-8"?> <b ...
- jpa
学习尚硅谷jpa笔记: 所依赖的jar包: 首先在META-INF下创建配置文件,persistence.xml <?xml version="1.0" encoding=& ...
随机推荐
- memcached复制-repcached
1.前言 由于memcached把数据都放到内存里,因此性能是极高的,正因为如此,不可避免会造成数据丢失,repcached就派上用场了,它可以实现memcached的主从复制 2.安装repcach ...
- Less循环
Less循环 在Less中,mixin可以调用它自身.通过这种递归调用,再结合Guard表达式和模式匹配,就可以写出各种循环结构.如,使用循环来创建一个网格类: .generate-columns(4 ...
- IK-Analyzer(5.3.1)动态配置自定义词典
参考文献:http://blog.csdn.net/fatpanda/article/details/37911079 jar包: IK-Analyzer-extra-5.3.1.jar IKAnal ...
- 51Nod--1012最小公倍数
1012 最小公倍数LCM 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 输入2个正整数A,B,求A与B的最小公倍数. Input 2个数A,B,中间用 ...
- 基于UDP协议的socket编程
UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...
- Angular之指令Directive系列
项目筹备近期开启Angular学习,指令比较难理解所以记录备案,推荐Angualr实战学习视频大漠穷秋 Angular实战 一.指令directive概述 指令可以对元素绑定事件监听或者改变DOM结构 ...
- Scala入门系列(十一):模式匹配
引言 模式匹配是Scala中非常有特色,非常强大的一种功能. 类似于Java中的switch case语法,但是模式匹配的功能要比它强大得多,switch只能对值进行匹配,但是Scala的模式匹配除了 ...
- 怎样将word文件转化为Latex文件:word-to-latex-2.56具体解释
首先推荐大家读一读这篇博文:http://blog.csdn.net/ibingow/article/details/8613556 --------------------------------- ...
- MS OFFICE WORD 绝招
以MS OFFICE WORD 2010为例. 1.WORD 文件夹连接线(标准称呼:前导符)为什么有的稀,有的密? 答案:文件夹格式字体不同. 2.首页.文件夹页.正文有的要页眉,有的不要,首页不要 ...
- SDUTOJ 贪心 -商人小鑫
题目描写叙述 小鑫是个商人,当然商人最希望的就是多赚钱.小鑫也一样. 这天,他来到了一个遥远的国度.那里有着n件商品,对于第i件商品须要付出ci的价钱才干得到. 当然.对于第i件商品,小鑫在自己心中有 ...