前提:

  创建一个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的基本使用的更多相关文章

  1. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  2. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  3. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  4. springmvc+jpa实现分页的两种方式

    1.工具类 public final class QueryTool { public static PageRequest buildPageRequest(int pageNumber, int ...

  5. spring boot(五):spring data jpa的使用

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  6. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  7. 一步步学习 Spring Data 系列之JPA(一)

    引入: Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服 ...

  8. 一步步学习 Spring Data 系列之JPA(二)

    继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...

  9. jpa+springmvc+springdata(一)

    学习尚硅谷笔记: 首先配置application.xml: <?xml version="1.0" encoding="UTF-8"?> <b ...

  10. jpa

    学习尚硅谷jpa笔记: 所依赖的jar包: 首先在META-INF下创建配置文件,persistence.xml <?xml version="1.0" encoding=& ...

随机推荐

  1. listview优化加强版

    import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory; ...

  2. Thinkphp拖拽上传文件-使用webuploader插件(自己改动了一些地方)——分片上传

    html页面: <!DOCTYPE html> <html class="js cssanimations"> <head> <meta  ...

  3. sublime text 3.0新版本注册码

    -– BEGIN LICENSE -– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...

  4. 数据库文件*.sdf文件定时备份,但是大小的增量在不断增长的问题排查

    在某项目上,使用SQL Server数据库,现场反馈每天定时备份数据库文件,每天的数据量是400多个申请单的量.之前每天增长量是50M,但是后来两天增长量是80M,每天的数据量差不多. 到底从什么地方 ...

  5. Java实现字符串转换十六进制MD5值

    public class Encode {    public final static String md5(String s) {        char hexDigits[] = { '0', ...

  6. java学习总结篇二--3 种简单排序

    本篇文章,先从数据结构开始,一边总结,一边反思,寻求最优解. 本文简单温习下最基础的三类算法:选择,冒泡,插入.先定义一个交换数组作为备用: /** * 交换数组元素 * @param arr * @ ...

  7. Python爬虫(十一)_案例:使用正则表达式的爬虫

    本章将结合先前所学的爬虫和正则表达式知识,做一个简单的爬虫案例,更多内容请参考:Python学习指南 现在拥有了正则表达式这把神兵利器,我们就可以进行对爬取到的全部网页源代码进行筛选了. 下面我们一起 ...

  8. archsummit2017见闻和思考

    前几天参加了archsummit的北京站.2天的日程安排的十分紧凑,大多数时间同时有多场专题分享,选择想要听的专题就成了首要的事情,按照感兴趣的,可能用到的,启发思考的原则选择了几场适合自己的专题,这 ...

  9. 记一次高并发场景下.net监控程序数据上报的性能调优

    最近在和小伙伴们做充电与通信程序的架构迁移.迁移前的架构是,通信程序负责接收来自充电集控设备的数据实时数据,通过Thrift调用后端的充电服务,充电服务收到响应后放到进程的Queue中,然后在管理线程 ...

  10. MacBook 经常使用快捷键

    Mac OS X系统图形表示方法 ⇧ = shift ⌃ = control ⌥ = option / alt  Home=fn + ◄  End=fn + ►  Page Up=fn + ▲ Pag ...