4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.0.M1 com.demo SpringBootDataJPA 0.0.1-SNAPSHOT SpringBootDataJPA Spring Boot Data JPA 1.8 org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java runtime net.bytebuddy byte-buddy 1.9.12 org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin spring-snapshots Spring Snapshots https://repo.spring.io/snapshot true spring-milestones Spring Milestones https://repo.spring.io/milestone spring-snapshots Spring Snapshots https://repo.spring.io/snapshot true spring-milestones Spring Milestones https://repo.spring.io/milestone
创建一个名为springbootdatajpa 的数据库。此数据库有一个表:产品
--
-- Table structure for table `product`
--CREATE TABLE `product` (`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,`name` varchar(250) COLLATE utf8_unicode_ci NOT NULL,`price` decimal(10,1) NOT NULL,`quantity` int(11) NOT NULL,`description` text COLLATE utf8_unicode_ci NOT NULL,`photo` varchar(250) COLLATE utf8_unicode_ci NOT NULL,`featured` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;--
-- Dumping data for table `product`
--INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Mobile 1', '2.0', 2, 'description 1', 'thumb1.gif', 0);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Mobile 2', '1.0', 5, 'description 2', 'thumb2.gif', 1);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Mobile 3', '3.0', 9, 'description 3', 'thumb3.gif', 0);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Computer 1', '5.0', 12, 'description 4', 'thumb1.gif', 1);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Computer 2', '7.0', 5, 'description 5', 'thumb1.gif', 0);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Computer 3', '12.0', 2, 'description 6', 'thumb2.gif', 1);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Laptop 1', '3.0', 8, 'description 7', 'thumb2.gif', 0);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Laptop 2', '4.0', 11, 'description 8', 'thumb3.gif', 1);
INSERT INTO `product` (`name`, `price`, `quantity`, `description`, `photo`, `featured`) VALUES('Laptop 3', '2.0', 15, 'description 9', 'thumb2.gif', 0);
DELIMITER $$
CREATE PROCEDURE sp_findBetween(min decimal, max decimal)
BEGINSELECT * FROM product where price BETWEEN min and max;
END $$
DELIMITER ;
产品表的结构
产品表数据
在src/main/resources文件夹中打开application.properties文件,并添加连接到数据库的配置,如下所示:
spring.datasource.url= jdbc:mysql://localhost:3306/springbootdatajpa
spring.datasource.username=root
spring.datasource.password=123456
创建名为com.demo.entities 的新包。在此包中,创建名为 Product 的新 java 类.java如下所示:
package com.demo.entities;import java.io.Serializable;import java.math.BigDecimal;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "product")
public class Product implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private int id;private String name;private BigDecimal price;private int quantity;private String description;private String photo;private boolean featured;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getPrice() {return price;}public void setPrice(BigDecimal price) {this.price = price;}public int getQuantity() {return quantity;}public void setQuantity(int quantity) {this.quantity = quantity;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getPhoto() {return photo;}public void setPhoto(String photo) {this.photo = photo;}public boolean isFeatured() {return featured;}public void setFeatured(boolean featured) {this.featured = featured;}}
创建名为com.demo.repository 的新包。在这个包中,创建名为ProductRepository的新接口.java从 Spring Framework 的CrudRepository接口实现如下:
package com.demo.repositories;import java.math.BigDecimal;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.demo.entities.Product;@Repository("productRepository")
public interface ProductRepository extends CrudRepository {@Query(value = "{call sp_findBetween(:min, :max)}", nativeQuery = true)public List findAllBetweenStoredProcedure(@Param("min") BigDecimal min, @Param("max") BigDecimal max);}
创建名为com.demo.services 的新包。在此包中创建名为ProductService的新接口.java如下所示:
package com.demo.services;import java.math.BigDecimal;
import java.util.List;
import com.demo.entities.Product;public interface ProductService {public List findAllBetweenStoredProcedure(BigDecimal min, BigDecimal max);}
在com.demo.services包中,创建名为ProductServiceImpl的新java类.java从ProductService接口实现
package com.demo.services;import java.math.BigDecimal;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.demo.entities.Product;
import com.demo.repositories.ProductRepository;@Transactional
@Service("productService")
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductRepository productRepository;@Overridepublic List findAllBetweenStoredProcedure(BigDecimal min, BigDecimal max) {return productRepository.findAllBetweenStoredProcedure(min, max);}}
在com.demo包中,创建名为JPAConfiguration的新 java 类.java如下所示:
package com.demo;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;import com.demo.services.ProductService;
import com.demo.services.ProductServiceImpl;@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = { "com.demo.repositories" })
@ComponentScan("com.demo")
@PropertySource("classpath:application.properties")
public class JPAConfiguration {@Beanpublic ProductService productService() {return new ProductServiceImpl();}}
创建名为com.demo.main 的新包。在此包中,创建名为 demo 的新 java 文件.java如下所示:
package com.demo.main;import java.math.BigDecimal;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;import com.demo.JPAConfiguration;
import com.demo.entities.Product;
import com.demo.services.ProductService;public class Demo {public static void main(String[] args) {try {AbstractApplicationContext context = new AnnotationConfigApplicationContext(JPAConfiguration.class);ProductService productService = context.getBean(ProductService.class);System.out.println("Find product have price between 4 and 8");for (Product product : productService.findAllBetweenStoredProcedure(BigDecimal.valueOf(4), BigDecimal.valueOf(8))) {System.out.println("Id: " + product.getId());System.out.println("Name: " + product.getName());System.out.println("Price: " + product.getPrice());System.out.println("========================");}context.close();} catch (Exception e) {System.out.println(e.getMessage());}}}
Id: 4
Name: Computer 1
Price: 5.0
========================
Id: 5
Name: Computer 2
Price: 7.0
========================
Id: 12
Name: Laptop 2
Price: 4.0
========================