刚开始做写手上什么网站,哪些网站权重高,南昌房产网官方网站,微信建设银行官方网站目录 引出Jpa是啥#xff1f;Jpa的使用创建实体类写dao接口类写服务类 crud增删改查增加修改根据id删除全查询分页查询 条件查询模糊查询单条件查询多条件查询模糊查询排序查询 多对一查询定义实体类auto主键策略下新增进行全查询测试 全部代码application.yml配置类pom配置文… 目录 引出Jpa是啥Jpa的使用创建实体类写dao接口类写服务类 crud增删改查增加修改根据id删除全查询分页查询 条件查询模糊查询单条件查询多条件查询模糊查询排序查询 多对一查询定义实体类auto主键策略下新增进行全查询测试 全部代码application.yml配置类pom配置文件实体类Car实体类Factory实体类 dao接口类service服务类测试代码 总结 引出 1.jpa是啥java持久层的apiSpringBoot官方支持 2.约定大于配置的理念增删改查savedeleteByIdfindAll 3.多条件查询andorlike约定大于配置 4.多对一的查询ManyToOne Jpa是啥
Spring Data JPA JPA是Java Persistence API的缩写是Java EEEnterprise Edition中用于实现对象关系映射ORM的一种规范。它提供了一组用于管理和持久化Java对象的API使开发人员能够以面向对象的方式操作数据库。
JPA的目标是提供一种统一的、面向对象的数据访问方式使开发人员能够更加方便地进行数据库操作而不需要关注底层数据库的细节。它抽象了不同数据库之间的差异提供了一套通用的API使开发人员能够以相同的方式操作不同的数据库。
JPA的核心概念包括实体Entity、实体管理器EntityManager、持久化上下文Persistence Context等。开发人员可以通过注解或XML配置来定义实体类和数据库表之间的映射关系然后使用EntityManager进行增删改查等数据库操作。
JPA的实现有很多比较常用的有Hibernate、EclipseLink等。开发人员可以根据自己的需求选择合适的JPA实现框架来使用。
Jpa的使用
创建实体类
javax Entity Table IdGeneratedValue(strategy) AUTO/IDENTITY(数据库自己的主键自增长策略???)Column GenerationType.AUTO:会多一张表记录键 GenerationType.IDENTITY:用数据库自增的主键 GeneratedValue(strategy GenerationType.IDENTITY) // 用数据库自增长策略 在jpa中ddl-auto共分为四种:
spring.jpa.hibernate.ddl-auto create ----每次启动SpringBoot程序时没有表会新建表格表内有数据会清空
spring.jpa.hibernate.ddl-auto create-drop ----每次启动SpringBoot程序时会清空表数据
spring.jpa.hibernate.ddl-auto update ---- 每次启动SpringBoot程序时没有表格会新建表格表内有数据不会清空只会更新
spring.jpa.hibernate.ddl-auto validate ---- 每次启动SpringBoot程序时会校验实体类字段与数据库字段的类型是否相同不同则会报错 package com.tianju.jpa.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.persistence.*;
import java.math.BigDecimal;Data
NoArgsConstructor
AllArgsConstructor// 表示这个实体类是和数据库表对应的
Entity
Table(name car_tab) // 对应的表名
public class Car {Id // 是主键// GenerationType.AUTO:会多一张表记录键// GenerationType.IDENTITY:用数据库自增的主键GeneratedValue(strategy GenerationType.IDENTITY) // 用数据库自增的策略Column(name car_id)private Integer id;Column(name car_num)private String carNum; // 车牌Column(name car_brand)private String brand; // 品牌Column(name car_color)private String color; // 颜色Column(name car_price)private BigDecimal price; // 价格
} 写dao接口类 JpaRepositoryIdentity,String实体类以及主键的类型 package com.tianju.jpa.mapper;import com.tianju.jpa.entity.Car;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;/*** JpaRepositoryIdentity,String实体类以及主键的类型*/
Repository // 用在持久化对象上类似于mapper
public interface CarDao extends JpaRepositoryCar,Integer {
}
写服务类
package com.tianju.jpa.service.impl;import com.tianju.jpa.entity.Car;
import com.tianju.jpa.mapper.CarDao;
import com.tianju.jpa.service.ICarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class CarServiceImpl implements ICarService {Autowiredprivate CarDao carDao;Overridepublic void add(Car car) {carDao.save(car);}
}crud增删改查
增加
carDao.save(car);插入多条数据 插入后的结果 修改 Overridepublic void update(Car car) {carDao.save(car);}Overridepublic Car findById(int id) {Car car carDao.findById(id).get();return car;}根据id删除 Overridepublic void deleteById(int id) {carDao.deleteById(id);}全查询 Overridepublic ListCar findAll() {return carDao.findAll();}分页查询 import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; Overridepublic Page findByPage(int pageNum, int pageSize) {PageRequest pageRequest PageRequest.of(pageNum, pageSize);PageCar carPage carDao.findAll(pageRequest);return carPage;}分页查询的sql 条件查询模糊查询 单条件查询
package com.tianju.jpa.mapper;import com.tianju.jpa.entity.Car;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;import java.util.List;/*** JpaRepositoryIdentity,String实体类以及主键的类型*/
Repository // 用在持久化对象上类似于mapper
public interface CarDao extends JpaRepositoryCar,Integer {ListCar findCarsByColor(String color);
} 多条件查询
package com.tianju.jpa.mapper;import com.tianju.jpa.entity.Car;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;import java.util.List;/*** JpaRepositoryIdentity,String实体类以及主键的类型*/
Repository // 用在持久化对象上类似于mapper
public interface CarDao extends JpaRepositoryCar,Integer {ListCar findCarsByColor(String color);ListCar findByColorAndBrand(String color,String brand);ListCar findByColorOrBrand(String color,String brand);}or查询 模糊查询
package com.tianju.jpa.mapper;import com.tianju.jpa.entity.Car;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;import java.util.List;/*** JpaRepositoryIdentity,String实体类以及主键的类型*/
Repository // 用在持久化对象上类似于mapper
public interface CarDao extends JpaRepositoryCar,Integer {ListCar findCarsByColor(String color);ListCar findByColorAndBrand(String color,String brand);ListCar findByColorOrBrand(String color,String brand);ListCar findByBrandLike(String brand);}排序查询 package com.tianju.jpa.service.impl;import com.tianju.jpa.entity.Car;
import com.tianju.jpa.mapper.CarDao;
import com.tianju.jpa.service.ICarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;import java.util.List;Service
public class CarServiceImpl implements ICarService {Autowiredprivate CarDao carDao;Overridepublic void add(Car car) {carDao.save(car);}Overridepublic void update(Car car) {carDao.save(car);}Overridepublic Car findById(int id) {Car car carDao.findById(id).get();return car;}Overridepublic void deleteById(int id) {carDao.deleteById(id);}Overridepublic ListCar findAll() {return carDao.findAll();}Overridepublic Page findByPage(int pageNum, int pageSize) {PageRequest pageRequest PageRequest.of(pageNum, pageSize);PageCar carPage carDao.findAll(pageRequest);return carPage;}Overridepublic ListCar findCarsByColor(String color) {return carDao.findCarsByColor(color);}Overridepublic ListCar findByColorAndBrand(String color, String brand) {return carDao.findByColorAndBrand(color, brand);}Overridepublic ListCar findByColorOrBrand(String color, String brand) {return carDao.findByColorOrBrand(color,brand);}Overridepublic ListCar findByBrandLike(String brand) {return carDao.findByBrandLike(brand);}Overridepublic ListCar orderByPrice() {Sort price Sort.by(Sort.Direction.DESC, price);return carDao.findAll(price);}
}
多对一查询 定义实体类
package com.tianju.jpa.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.persistence.*;
import java.math.BigDecimal;Data
NoArgsConstructor
AllArgsConstructor// 表示这个实体类是和数据库表对应的
Entity
Table(name car_tab) // 对应的表名
public class Car {Id // 是主键// GenerationType.AUTO:会多一张表记录键// GenerationType.IDENTITY:用数据库自增的主键GeneratedValue(strategy GenerationType.IDENTITY) // 用数据库自增的策略Column(name car_id)private Integer id;Column(name car_num)private String carNum; // 车牌Column(name car_brand)private String brand; // 品牌Column(name car_color)private String color; // 颜色Column(name car_price)private BigDecimal price; // 价格ManyToOneJoinColumn(name factory_id)private Factory factory; // 多对一的工厂
}
package com.tianju.jpa.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.persistence.*;/*** 生产车的工厂多个车对应一个工厂*/Data
NoArgsConstructor
AllArgsConstructor// 表示这个实体类是和数据库表对应的
Entity
Table(name car_factory) // 对应的表名public class Factory {IdGeneratedValue(strategy GenerationType.AUTO)Column(name factory_id)private Integer id;Column(name factory_name)private String name;} 自动建的表 auto主键策略下新增 新增后的表 进行全查询测试 运行的SQL语句 全部代码
application.yml配置类
在jpa中ddl-auto共分为四种:
spring.jpa.hibernate.ddl-auto create ----每次启动SpringBoot程序时没有表会新建表格表内有数据会清空
spring.jpa.hibernate.ddl-auto create-drop ----每次启动SpringBoot程序时会清空表数据
spring.jpa.hibernate.ddl-auto update ---- 每次启动SpringBoot程序时没有表格会新建表格表内有数据不会清空只会更新
spring.jpa.hibernate.ddl-auto validate ---- 每次启动SpringBoot程序时会校验实体类字段与数据库字段的类型是否相同不同则会报错
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.111.130:3306/jpa_db?useUnicodetruecharacterEncodingutf8serverTimezoneGMT%2B8allowMultiQueriestrueusername: rootpassword: 123jpa:# 允许显示sqlshow-sql: truehibernate:# 自动对表进行增删改查的操作创建表# 可以开始的时候打开等表创建好之后关闭ddl-auto: updateserver:port: 9089pom配置文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.tianju.jpa/groupIdartifactIdspring-boot-jpa/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/properties!-- 起步依赖--parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.6.13/version/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-openapi2-spring-boot-starter/artifactIdversion4.0.0/version/dependency!-- Jpa的包--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId/dependency/dependencies/project实体类
Car实体类
package com.tianju.jpa.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.persistence.*;
import java.math.BigDecimal;Data
NoArgsConstructor
AllArgsConstructor// 表示这个实体类是和数据库表对应的
Entity
Table(name car_tab) // 对应的表名
public class Car {Id // 是主键// GenerationType.AUTO:会多一张表记录键// GenerationType.IDENTITY:用数据库自增的主键GeneratedValue(strategy GenerationType.IDENTITY) // 用数据库自增的策略Column(name car_id)private Integer id;Column(name car_num)private String carNum; // 车牌Column(name car_brand)private String brand; // 品牌Column(name car_color)private String color; // 颜色Column(name car_price)private BigDecimal price; // 价格ManyToOneJoinColumn(name factory_id)private Factory factory; // 多对一的工厂
}
Factory实体类
package com.tianju.jpa.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.persistence.*;/*** 生产车的工厂多个车对应一个工厂*/Data
NoArgsConstructor
AllArgsConstructor// 表示这个实体类是和数据库表对应的
Entity
Table(name car_factory) // 对应的表名public class Factory {IdGeneratedValue(strategy GenerationType.AUTO)Column(name factory_id)private Integer id;Column(name factory_name)private String name;}
dao接口类
package com.tianju.jpa.mapper;import com.tianju.jpa.entity.Car;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;import java.util.List;/*** JpaRepositoryIdentity,String实体类以及主键的类型*/
Repository // 用在持久化对象上类似于mapper
public interface CarDao extends JpaRepositoryCar,Integer {ListCar findCarsByColor(String color);ListCar findByColorAndBrand(String color,String brand);ListCar findByColorOrBrand(String color,String brand);ListCar findByBrandLike(String brand);}service服务类
package com.tianju.jpa.service.impl;import com.tianju.jpa.entity.Car;
import com.tianju.jpa.mapper.CarDao;
import com.tianju.jpa.service.ICarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;import java.util.List;Service
public class CarServiceImpl implements ICarService {Autowiredprivate CarDao carDao;Overridepublic void add(Car car) {carDao.save(car);}Overridepublic void update(Car car) {carDao.save(car);}Overridepublic Car findById(int id) {Car car carDao.findById(id).get();return car;}Overridepublic void deleteById(int id) {carDao.deleteById(id);}Overridepublic ListCar findAll() {return carDao.findAll();}Overridepublic Page findByPage(int pageNum, int pageSize) {PageRequest pageRequest PageRequest.of(pageNum, pageSize);PageCar carPage carDao.findAll(pageRequest);return carPage;}Overridepublic ListCar findCarsByColor(String color) {return carDao.findCarsByColor(color);}Overridepublic ListCar findByColorAndBrand(String color, String brand) {return carDao.findByColorAndBrand(color, brand);}Overridepublic ListCar findByColorOrBrand(String color, String brand) {return carDao.findByColorOrBrand(color,brand);}Overridepublic ListCar findByBrandLike(String brand) {return carDao.findByBrandLike(brand);}Overridepublic ListCar orderByPrice() {Sort price Sort.by(Sort.Direction.DESC, price);return carDao.findAll(price);}
}
测试代码
package com.tianju.jpa.mapper;import com.tianju.jpa.entity.Car;
import com.tianju.jpa.entity.Factory;
import com.tianju.jpa.service.ICarService;
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.data.domain.Page;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.math.BigDecimal;
import java.util.List;
import java.util.Random;import static org.junit.Assert.*;SpringBootTest
RunWith(SpringJUnit4ClassRunner.class)
public class CarDaoTest {Autowiredprivate ICarService carService;Testpublic void addCar(){for (int i 0;i10;i){double random Math.round(Math.random() * 100) / 100.0 8888;
// carService.add(new Car(null,苏A888 i,BMW,红色,new BigDecimal(random)));}}Testpublic void updateCar(){Car car carService.findById(10);car.setCarNum(浙江888);carService.update(car);}Autowiredprivate FactoryDao factoryDao;Testpublic void addFactory(){factoryDao.save(new Factory(null,上海工厂));factoryDao.save(new Factory(null,南京工厂));factoryDao.save(new Factory(null,山西工厂));}Testpublic void deleteById(){carService.deleteById(11);}Testpublic void findCarsByColor(){ListCar cars carService.findCarsByColor(红色);cars.forEach(System.out::println);}Testpublic void findCarsByColorAndBrand(){ListCar cars carService.findByColorAndBrand(红色,BYD);cars.forEach(System.out::println);}Testpublic void findCarsByColorOrBrand(){ListCar cars carService.findByColorOrBrand(红色,BYD);cars.forEach(System.out::println);}Testpublic void findByPage(){Page page carService.findByPage(1, 3);page.forEach(car - {System.out.println(car);});}Testpublic void findAll(){ListCar all carService.findAll();all.forEach(car - {System.out.println(car);});}Testpublic void findLike(){ListCar all carService.findByBrandLike(B%);all.forEach(car - {System.out.println(car);});}Testpublic void orderByPrice(){ListCar all carService.orderByPrice();all.forEach(car - {System.out.println(car);});}public static void main(String[] args) {double random Math.round(Math.random() * 100) / 100.0;System.out.println(random);}}总结
1.jpa是啥java持久层的apiSpringBoot官方支持 2.约定大于配置的理念增删改查savedeleteByIdfindAll 3.多条件查询andorlike约定大于配置 4.多对一的查询ManyToOne