码迷,mamicode.com
首页 > 编程语言 > 详细

SpringBoot24 SpringDataJPA环境搭建

时间:2018-08-13 22:56:24      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:actor   ati   word   color   ima   integer   思路   mysql数据库   base   

 

1 版本说明

  JDK:1.8

  MAVENT:3.5

  SpringBoot:2.0.4

  IDEA:旗舰版207.2

  MySQL:5.5

技术分享图片

技术分享图片

 

2 SpringDataJPA环境搭建(SpringBoot版本)

  2.1 创建一个SrpingBoot项目

    需要引入的依赖如下图所示

技术分享图片

  2.2 配置数据库相关

    》创建一个mysql数据库testdemo

    》在testdemo中创建一个student表

技术分享图片
/*
Navicat MySQL Data Transfer

Source Server         : mysql5.4
Source Server Version : 50540
Source Host           : localhost:3306
Source Database       : testdemo

Target Server Type    : MYSQL
Target Server Version : 50540
File Encoding         : 65001

Date: 2018-08-13 21:13:51
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(50) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` int(10) NOT NULL,
  `address` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4;
student.sql

    》在springboot项目中配置数据库信息

技术分享图片
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
application.yml

    2.2.1 利用IDEA连接数据

      参考博文

    2.2.2 利用IDEA自动生成实体类

技术分享图片
package cn.xiangxu.jpa_demo03.domain.domain_do;

import javax.persistence.*;

/**
 * @author 王杨帅
 * @create 2018-08-13 21:36
 * @desc
 **/
@Entity
@Table(name = "student", schema = "testdemo", catalog = "")
public class StudentDO {
    private int id;
    private String name;
    private int age;
    private String address;

    @Id
    @Column(name = "id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "age")
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Basic
    @Column(name = "address")
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) return true;
        if (object == null || getClass() != object.getClass()) return false;

        StudentDO studentDO = (StudentDO) object;

        if (id != studentDO.id) return false;
        if (age != studentDO.age) return false;
        if (name != null ? !name.equals(studentDO.name) : studentDO.name != null) return false;
        if (address != null ? !address.equals(studentDO.address) : studentDO.address != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + age;
        result = 31 * result + (address != null ? address.hashCode() : 0);
        return result;
    }
}
StudentDO.java

      参考博文

  2.3 创建持久层

    技巧01:持久层接口只需要继承 JpaRepository 接口即可

技术分享图片
package cn.xiangxu.jpa_demo03.domain.repository;

import cn.xiangxu.jpa_demo03.domain.domain_do.StudentDO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * @author 王杨帅
 * @create 2018-08-13 21:53
 * @desc 学生持久层接口
 **/
public interface StudentRepository extends JpaRepository<StudentDO, Integer> {

}
StudentRepository.java

    技巧02:需要使用持久层实例时,只需要进行依赖注入即可

    技巧03:持久层接口上不用写   @Repository  ,因为继承了 JpaRepository 接口后就已经是一个被Spring容器管理的持久层Bean啦

    技巧04:Repository相关接口

技术分享图片 技术分享图片     

  2.4 测试持久层

    技巧01:继承 JpaRepository 接口后就可以有很过方法可以使用

    技巧02:可以直接使用的原因是:拦截 + JDK动态代理

技术分享图片
package cn.xiangxu.jpa_demo03.domain.repository;

import cn.xiangxu.jpa_demo03.domain.domain_do.StudentDO;
import lombok.extern.slf4j.Slf4j;
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 StudentRepositoryTest {

    @Autowired
    private StudentRepository studentRepository;

    @Test
    public void findall() {
        List<StudentDO> all = studentRepository.findAll();
        System.out.println(all);
    }

}
View Code

    技巧03:jpa支持自定义SQL【借助@Query注解实现】

 

 3 Projections 对查询结果的扩展

  3.1 返回类型建模

    Spring JPA 对 Projections 的扩展的支持,个人觉得这是个非常好的东西,从字面意思上理解就是映射,指的是和 DB 的查询结果的字段映射关系。一般情况下,我们是返回的字段和 DB 的查询结果的字段是一一对应的,但有的时候,需要返回一些指定的字段,不需要全部返回,或者返回一些复合型的字段,还得自己写逻辑。Spring Data 正是考虑到了这一点,允许对专用返回类型进行建模,以便更有选择地将部分视图对象。(声明:来自gitChat)

    3.1.1 需求

      只需要查询学生的姓名和年龄信息,其余信息不进行查询

    3.1.2 思路

      声明一个接口,包含我们要返回的属性的方法即可

    3.1.3 编程实现

      》根据实体类中属性的get方法创建接口

        技巧01:接口中的方法就是需要获取的字段在实体类中对应的get方法

技术分享图片
package cn.xiangxu.jpa_demo03.domain.domain_do;

/**
 * @author 王杨帅
 * @create 2018-08-13 22:16
 * @desc
 **/
public interface StudentBaseInfo {

    String getName();
    Integer getAge();

}
StudentBaseInfo.java

      》测试类

技术分享图片
package cn.xiangxu.jpa_demo03.domain.repository;

import cn.xiangxu.jpa_demo03.domain.domain_do.StudentBaseInfo;
import cn.xiangxu.jpa_demo03.domain.domain_do.StudentDO;
import cn.xiangxu.jpa_demo03.repository.StudentRepository;
import lombok.extern.slf4j.Slf4j;
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;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class StudentRepositoryTest {

    @Autowired
    private StudentRepository studentRepository;

    @Test
    public void findall() {
        List<StudentDO> all = studentRepository.findAll();
        System.out.println(all);
    }

    @Test
    public void findByName() {
        List<StudentBaseInfo> byNameIs = studentRepository.findByNameIs("杨玉林");
        System.out.println(byNameIs);
    }

}
View Code

技术分享图片

      》跳坑01:通过这种方式获取到的数据是一个Map对象,如何转化成一个实体类列表呢

      》填坑01:创建一个实体类,这个实体类的字段要和创建的接口中方法对应实体类类的字段名保持一致【PS:本博文就继续使用之前的实体类】,将查询到的数据转化成流,然后利用peek这个中间操作进行转化

技术分享图片
package cn.xiangxu.jpa_demo03.domain.repository;

import cn.xiangxu.jpa_demo03.domain.domain_do.StudentBaseInfo;
import cn.xiangxu.jpa_demo03.domain.domain_do.StudentDO;
import cn.xiangxu.jpa_demo03.repository.StudentRepository;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class StudentRepositoryTest {

    @Autowired
    private StudentRepository studentRepository;

    @Test
    public void findall() {
        List<StudentDO> all = studentRepository.findAll();
        System.out.println(all);
    }

    @Test
    public void findByName() {
        List<StudentBaseInfo> byNameIs = studentRepository.findByNameIs("杨玉林");
        System.out.println(byNameIs);
    }

    @Test
    public void findBYName02() {
        List<StudentBaseInfo> byNameIs = studentRepository.findByNameIs("王杨帅");
        List<StudentDO> studentDOList = new ArrayList<>();
        byNameIs.stream()
                .peek(
                        i -> {
                            StudentDO studentDO = new StudentDO();
                            BeanUtils.copyProperties(i, studentDO);
                            studentDOList.add(studentDO);
                        }
                )
                .forEach(
                       System.out::println
                );
        System.out.println(studentDOList);
    }

}
View Code

技术分享图片

      》转化后的结果为

技术分享图片

 

    

    

 

SpringBoot24 SpringDataJPA环境搭建

标签:actor   ati   word   color   ima   integer   思路   mysql数据库   base   

原文地址:https://www.cnblogs.com/NeverCtrl-C/p/9471496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!