标签:actor ati word color ima integer 思路 mysql数据库 base
JDK:1.8
MAVENT:3.5
SpringBoot:2.0.4
IDEA:旗舰版207.2
MySQL:5.5
需要引入的依赖如下图所示
》创建一个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;
》在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
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; } }
技巧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> { }
技巧02:需要使用持久层实例时,只需要进行依赖注入即可
技巧03:持久层接口上不用写 @Repository ,因为继承了 JpaRepository 接口后就已经是一个被Spring容器管理的持久层Bean啦
技巧04:Repository相关接口
技巧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); } }
技巧03:jpa支持自定义SQL【借助@Query注解实现】
Spring JPA 对 Projections 的扩展的支持,个人觉得这是个非常好的东西,从字面意思上理解就是映射,指的是和 DB 的查询结果的字段映射关系。一般情况下,我们是返回的字段和 DB 的查询结果的字段是一一对应的,但有的时候,需要返回一些指定的字段,不需要全部返回,或者返回一些复合型的字段,还得自己写逻辑。Spring Data 正是考虑到了这一点,允许对专用返回类型进行建模,以便更有选择地将部分视图对象。(声明:来自gitChat)
只需要查询学生的姓名和年龄信息,其余信息不进行查询
声明一个接口,包含我们要返回的属性的方法即可
》根据实体类中属性的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(); }
》测试类
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); } }
》跳坑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); } }
》转化后的结果为
SpringBoot24 SpringDataJPA环境搭建
标签:actor ati word color ima integer 思路 mysql数据库 base
原文地址:https://www.cnblogs.com/NeverCtrl-C/p/9471496.html