【记一次】JPA初学搭建的入门测试
前沿
谈到SpringBoot,我们不由地会联想到一些常用的ORM框架。比如:现象级的Mybatis“家喻户晓”,人人必备的交互神器;罕见级的“JdbcTemplate",作为深入底层研发者的必需品。本文谈到的将是另一个入门级神器“JPA”。为什么选它,无非就是一个字:快。
环境
编辑器:IDEA
框架:SpringBoot (2.0.5.RELEASE)
JDK:1.8
测试工具:Postman
正文 (相关配置)
1.maven配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</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>
<!-- WEB JAR-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JPA JAR-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL JAR-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- TEST JAR-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2. 目录结构
结构.png后台交互四层套
控制层:controller
业务层:service
数据层:respository
实体层:pojo
启动类
BaseStarter
配置
resources: application.yml
3.配置文件(application.yml)
spring:
profiles:
active: product
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update
show-sql: true
默认
默认端口:8080
启动环境:生产
数据源信息
数据库名称:study
数据库账号:root
数据库密码:123456
JPA配置
ddl策略:ddl-auto:update
控制台打印SQL:show-sql: true
关于DDL的配置说明
ddl-auto:create----每次运行该程序,没有表格会新建表格,表内有数据会清空
ddl-auto:create-drop----每次程序结束的时候会清空表
ddl-auto:update----每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
ddl-auto:validate----运行程序会校验数据与数据库的字段类型是否相同,不同会报错
原文链接引用:https://blog.csdn.net/zhangtongpeng/article/details/79609942
正文 (代码编写)
1.包 - Pojo
描述:与数据表映射的实体类
类名:CarPojo
表名:t_car
package cn.alfq.lx.pojo;
import javax.persistence.*;
import java.util.Date;
/**
* @program: SpringBootJPA
* @description: 车模型实体类
* @author: LouYue
* @create: 2019-08-13 16:08
**/
@Entity(name = "car")
@Table(name="t_car")
public class CarPojo {
@Id
@GeneratedValue
@Column(name="id")
private Integer id;
@Column
private String carName;
@Column
private String carContent;
@Column
private String carType;
@Column
private Date createTime;
@Column
private Date updateTime;
public CarPojo(){
}
public CarPojo(Integer id, String carName, String carContent, String carType, Date createTime, Date updateTime){
this.id = id;
this.carName = carName;
this.carContent = carContent;
this.carType = carType;
this.createTime = createTime;
this.updateTime = updateTime;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public String getCarContent() {
return carContent;
}
public void setCarContent(String carContent) {
this.carContent = carContent;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
2.包 - respository
类名:CarRepository
package cn.alfq.lx.respository;
import cn.alfq.lx.pojo.CarPojo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* @program: SpringBootJPA
* @description: 车模型数据交互接口类 - JPA Repository
* @author: LouYue
* @create: 2019-08-13 16:07
**/
@Repository
public interface CarRepository extends JpaRepository<CarPojo,Integer> {
/**
* 根据主键查询信息
*
* @param id 主键ID
* @return CarPojo
*/
CarPojo getById(Integer id);
}
JPA重要的接口为JpaRepository,接口中封装了很多与数据库相关的基本方法,包括分页,排序等。
JPA可自定义SQL和执行方法,自定义关键词有get,find等,后续文章会细讲到。
3.包 - service
描述:业务方法接口统计
类名:CarService
方法:增删改查,排序查,主键查
package cn.alfq.lx.servcie;
import cn.alfq.lx.pojo.CarPojo;
import java.util.List;
/**
* @program: SpringBootJPA
* @description: 车模型业务接口类
* @author: LouYue
* @create: 2019-08-13 16:13
**/
public interface CarService {
/**
* 添加车信息
*
* @param pojo 传参模型
* @return Integer
*/
CarPojo add(CarPojo pojo);
/**
* 删除车信息 -> 主键标识
*
* @param id 主键标识
*/
void deleteById(Integer id);
/**
* 修改车信息
*
* @param pojo 传参模型
* @return CarPojo
*/
CarPojo update(CarPojo pojo);
/**
* 查询车信息列表
*
* @return List
*/
List<CarPojo> selectList();
/**
* 查询车信息列表 - 排序
*
* @return List
*/
List<CarPojo> selectListSorts();
/**
* 查询车信息 - 主键标识
*
* @param id 主键标识
* @return CarPojo
*/
CarPojo selectById(Integer id);
}
4.包 - service.impl
描述:业务方法接口实现
类名:CarServiceImpl
方法:增删改查,排序查,主键查
package cn.alfq.lx.servcie.impl;
import cn.alfq.lx.pojo.CarPojo;
import cn.alfq.lx.respository.CarRepository;
import cn.alfq.lx.servcie.CarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @program: SpringBootJPA
* @description: 车模型业务实现类
* @author: LouYue
* @create: 2019-08-13 16:18
**/
@Service
public class CarServiceImpl implements CarService {
private final CarRepository carRepository;
@Autowired
public CarServiceImpl(CarRepository carRepository) {
this.carRepository = carRepository;
}
@Override
public CarPojo add(CarPojo pojo) {
return carRepository.save(pojo);
}
@Override
public void deleteById(Integer id) {
carRepository.deleteById(id);
}
@Override
public CarPojo update(CarPojo pojo) {
return carRepository.save(pojo);
}
@Override
public List<CarPojo> selectList() {
return carRepository.findAll();
}
@Override
public List<CarPojo> selectListSorts() {
return carRepository.findAll(new Sort(Sort.Direction.DESC,"createTime"));
}
@Override
public CarPojo selectById(Integer id) {
return carRepository.getById(id);
}
}
5.包 - controller
描述:作为响应信息汇聚视图的URL实现类
类名:CarController
方法:增删改查,排序查,主键查
package cn.alfq.lx.controller;
import cn.alfq.lx.pojo.CarPojo;
import cn.alfq.lx.servcie.CarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @program: SpringBootJPA
* @description: 车模型控制类
* @author: LouYue
* @create: 2019-08-13 16:28
**/
@RestController
public class CarController {
private final CarService carService;
@Autowired
public CarController(CarService carService) {
this.carService = carService;
}
/**
* 添加车信息
*
* @param pojo 传参模型
* @return Integer
*/
@PutMapping(value = "/addCar")
public CarPojo add(@RequestBody CarPojo pojo) {
return carService.add(pojo);
}
/**
* 删除车信息 -> 主键标识
*
* @param id 主键标识
*/
@DeleteMapping(value="/deleteCarById")
public void deleteById(@RequestParam("id") Integer id){
carService.deleteById(id);
}
/**
* 修改车信息
*
* @param pojo 传参模型
* @return CarPojo
*/
@PostMapping(value ="/updateCar")
public CarPojo update(@RequestBody CarPojo pojo){
return carService.update(pojo);
}
/**
* 查询车信息列表
*
* @return List
*/
@GetMapping(value = "/selectListCars")
public List<CarPojo> selectList(){
return carService.selectList();
}
/**
* 查询车信息列表 - 排序
*
* @return List
*/
@GetMapping(value = "/selectListCarsSort")
public List<CarPojo> selectListSorts() {
return carService.selectListSorts();
}
/**
* 查询车信息 - 主键标识
*
* @param id 主键标识
* @return CarPojo
*/
@GetMapping(value="/selectCarById")
public CarPojo selectById(@RequestParam("id") Integer id){
return carService.selectById(id);
}
}
以@RequestBody传参的URL以application/Json参数类型进行传递
以@RequestParam穿参的URL以 url?param1=value方式进行传递
正文 (程序启动)
BaseStarter类
package cn.alfq.lx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @program: SpringBootJPA
* @description: SpringBoot启动入口
* @author: LouYue
* @create: 2019-08-13 16:02
**/
@SpringBootApplication
public class BaseStarter {
public static void main(String[] args) {
SpringApplication.run(BaseStarter.class, args);
}
}
执行结果
hibernate默认命名策略
org.hibernate.cfg.ImprovedNamingStrategy
可配置命名策略分为两种
第一:org.hibernate.cfg.DefaultNamingStrategy
第二:org.hibernate.cfg.ImprovedNamingStrategy
第一种:直接映射,优先以@table,@Column的自定义值为准
第二种:表名,字段为小写,当有大写字母的时候会转换为分隔符号“_”
DDL执行策略 - 会自动生成数据表
t_car.png
以添加方法结果为例,修改同理
addCar.png
以查询方法为结果为例,查询同理
selectCarById.png
结尾
以上便是SpringBoot整合JPA入门级测试,适用于初学者和遗忘者进行练习和搭建。笔者能力有限,后续也会一边跟进文章一边补充能量,争取做一个关于JPA的专栏,为广大初学者和开发者提供资源,有些不足之处还望各位海涵 😄
下一篇文章将会 介绍JPA中常用的注解