> 文档中心 > SpringBoot整合JPA项目开发实战

SpringBoot整合JPA项目开发实战


没错,这就是你想要的。如果能带给你帮助,欢迎点赞或留下足迹哦!

以下实操一个简易的客户订单管理系统:采用SpringBoot+JPA实现,目的是全面体验JPA和SpringBoot的魅力,很全,一起来体验。

相关好文合集:

SpringBoot整合JPA项目实战

常常急需的基于MVC的信息管理系统(很全)

java比较器Comparator/Comparable怎么玩?

Java复制一个文件的内容到另一个文件的七种方法

jsp与Servlet前后端交互典型实例

基于MVC的信息管理系统(你没看错,这就是你想要的)

前后端ajax请求交互验证(通用)

SpringBoot邮件发送(抄送、密送、图片、多文件等一应俱全哦)

SpringBoot+Mybatis+Maven整合操作实例

SpringBoot+JPA+Maven/Gradle开发实例

上行若水,大行至简

需要注意的是:导包、字段的对应、SQL

项目结构

为达到目的且简易起见,忽略Service层。

配置文件,分为开发和生产两种配置文件,可随时切换:

application.yml

spring:  profiles:    active:    - dev 

application-dev.yml

server:  port: 8008spring:  datasource:    data-username: root    data-password: wl    url: jdbc:mysql://localhost:3308/mtm-dev    driver-class-name:  com.mysql.jdbc.Driver  jpa:    hibernate:      ddl-auto: update    show-sql: true      datebase-platform: org.hibernate.dialect.MySQLDialect

application-prod.yml

server:  port: 8009spring:  datasource:    data-username: root    data-password: wl    url: jdbc:mysql://localhost:3308/mtm-prod    driver-class-name:  com.mysql.jdbc.Driver  jpa:    hibernate:      ddl-auto: update    show-sql: true      datebase-platform: org.hibernate.dialect.MySQLDialect

启动项目时application.yml中选择的哪种环境则自动使用对应的配置文件,但命名必须鲜明。

实体类设计:

Customer.java

package com.wl.ssms.eo;import java.util.ArrayList;import java.util.List;import java.util.Set;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name="mycustomer")public class Customer {private Long id ;private String name ;@Id @GeneratedValuepublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Order.java

package com.wl.ssms.eo;import java.util.Date;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;@Entity@Table(name="myorders")public class Order {private Long id;private String orderId;private Float total;private Date date ;//private List items=new ArrayList();private Customer customer ;@Id @GeneratedValuepublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}@Column(nullable=false)public Float getTotal() {return total;}public void setTotal(Float total) {this.total = total;}//关系被维护端,订单中存在客户的ID作为外键@ManyToOne(cascade={CascadeType.REFRESH,CascadeType.REMOVE,CascadeType.MERGE,CascadeType.PERSIST},optional=false)@JoinColumn(name="cus_id")public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "Order [id=" + id + ", orderId=" + orderId + ", total=" + total + ", date=" + date + ", customer="+ customer + "]";}}

单项OrderItem.java

package com.wl.ssms.eo;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;@Entity@Table(name="myorderItems")public class OrderItem {private Long id;private String productName;private Float sellPrice;private Order order;@Id @GeneratedValuepublic Long getId() {return id;}public void setId(Long id) {this.id = id;}@Column(nullable=false)public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public Float getSellPrice() {return sellPrice;}public void setSellPrice(Float sellPrice) {this.sellPrice = sellPrice;}//关系维护端  设置外键@ManyToOne(cascade={CascadeType.REFRESH,CascadeType.REMOVE,CascadeType.MERGE,CascadeType.PERSIST},optional=false)@JoinColumn(name="order_id")public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}}

控制层设计(注意每一个细节):

CustomerController.java

package com.wl.ssms.controller;import java.util.Iterator;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import com.wl.ssms.eo.Customer;import com.wl.ssms.eo.Order;import com.wl.ssms.eo.OrderItem;import com.wl.ssms.repository.CustomerRepository;import com.wl.ssms.repository.OrderRepository;@RestControllerpublic class CustomerController {@Autowiredprivate CustomerRepository customerRepository ;@Autowiredprivate OrderRepository orderRepository ;/** * 获取用户列表 * zq */@GetMapping("/cus")public List getAllCus(){return customerRepository.findAll();}/** * 查询某用户 * zq */@GetMapping("/cus/{cid}")public Customer getAllCus(@PathVariable Long cid){return customerRepository.findById(cid).get();}/** * 获取某用户的所有订单 * zq */@GetMapping("/cus/{id}/order")public List getAllCusOrders(@PathVariable("id") Long cid){//Customer c =  customerRepository.findById(cid).get();//System.out.println("用户"+c.getName()+"的订单【"+c.getOrder()+"】\n");//return c.getOrder() ;List orderList = customerRepository.findAllOrderByCusId(cid) ;System.out.println("订单:"+orderList.toString()+"\n");return customerRepository.findAllOrderByCusId(cid);}/** * 获取某用户的所有订单项 * zq */@GetMapping("/cus/{id}/orderItems")public List getAllCusOrderItems(@PathVariable("id") Long cid){List list = customerRepository.findAllOrderItemsByCusId(cid);Iterator it = list.iterator() ;System.out.println("所有订单项:\n");while(it.hasNext()) {System.out.println(it.next().toString());}return list ;}/** * 获取某用户的某订单1 * localhost:8008/cus/1/order/20181017232401L * zq */@GetMapping("/cus/{cid}/order/{oid}")public Order getOrderByCidAndOid1(@PathVariable("cid") Long cid,@PathVariable("oid") String oid ) {return orderRepository.findByCidAndOid(cid, oid);}/** * 获取某用户的某订单2 * localhost:8008/cus/1/ordert/20181017232401L * zq */@GetMapping("/cus/{cid}/ordert/{oid}")public Order getOrderByCidAndOid2(@PathVariable("cid") Long cid,@PathVariable("oid") String oid ) {Order o = orderRepository.findByCustomer_idAndOrderId(cid, oid) ;System.out.println(o.toString());return o;}/** * 添加一个用户 * zq */@PostMapping("/cus")public String addCus(Customer customer) {Customer c = customerRepository.save(customer);return "用户{"+c.toString()+"}添加成功!\n";}}

OrderController.java

package com.wl.ssms.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.DeleteMapping;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.PutMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import com.wl.ssms.eo.Order;import com.wl.ssms.repository.CustomerRepository;import com.wl.ssms.repository.OrderRepository;@RestControllerpublic class OrderController {@Autowiredprivate OrderRepository orderRepository ;@Autowiredprivate CustomerRepository customerRepository ;/** * 获取订单列表 * @return */@GetMapping("/order")public List getAllOrder(){return orderRepository.findAll() ;}/** * 根据订单ID获取某订单 */@GetMapping("/order/{oid}")public Order getAOrder(@PathVariable("oid") Long oid) {Order order = orderRepository.findById(oid).get();return order ;}/** * 添加一个订单 */@PostMapping("/order")public String addOrder( Order order) {//order.setCustomer(customerRepository.findById(1L).get());//order.setOrderId("20181017232401L");orderRepository.saveAndFlush(order);return "订单"+order+"已添加成功!";}/** * 修改某订单 */@PutMapping("/order")public Order updateOrder( Order order) {return orderRepository.save(order);}/** * 删除某订单 */@DeleteMapping("/order/{id}")public String deleteOrder(@PathVariable("id") Long id) {orderRepository.deleteById(id);return "id为"+id+"的订单已经删除成功!";}}

OrderItemController.java

package com.wl.ssms.controller;import java.util.List;import java.util.Set;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.DeleteMapping;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.PutMapping;import org.springframework.web.bind.annotation.RestController;import com.wl.ssms.eo.Order;import com.wl.ssms.eo.OrderItem;import com.wl.ssms.repository.OrderItemRepository;import com.wl.ssms.repository.OrderRepository;@RestControllerpublic class OrderItemController {@Autowiredprivate OrderItemRepository orderItemRepository  ;@Autowiredprivate OrderRepository orderRepository ;/** * 获取订单项列表 * @return */@GetMapping("/orderItem")public List getAllOrder(){return orderItemRepository.findAll() ;}/** * 根据订单ID获取旗下的所有订单项 */@GetMapping("/orderItem/{id}/items")public List getOneAllItems(@PathVariable("id") Long oid){//Order order = orderRepository.findById(oid).get();//return order.getItems() ;return null ;}/** * 根据订单项ID获取某订单项 */@GetMapping("/orderItem/{itemid}")public OrderItem getAOrder(@PathVariable("itemid") Long oid) {OrderItem item = orderItemRepository.findById(oid).get();return item ;}/** * 添加一个订单项 */@PostMapping("/orderItem")public String addOrder(OrderItem order) {//order.setCustomer(customerRepository.findById(1L).get());//order.setOrderId("20181017232401L");orderItemRepository.saveAndFlush(order);return "订单"+order+"已添加成功!";}/** * 修改某订单 */@PutMapping("/orderItem")public OrderItem updateOrder( OrderItem order) {return orderItemRepository.save(order);}/** * 删除某订单项 */@DeleteMapping("/orderItem/{id}")public String deleteOrder(@PathVariable("id") Long id) {orderItemRepository.deleteById(id);return "id为"+id+"的订单已经删除成功!";}}

dao层设计

CustomerRepository.java

package com.wl.ssms.repository;import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;import com.wl.ssms.eo.Customer;import com.wl.ssms.eo.Order;import com.wl.ssms.eo.OrderItem;public interface CustomerRepository extends JpaRepository{/** * 获取某用户的所有订单项ot.productName,ot.sellPrice * zq */@Query(value="SELECT ot from OrderItem ot,Order o where o.id=ot.order.id AND cus_id=:cusid")List findAllOrderItemsByCusId(@Param("cusid")Long cusid);/** * 获取某用户的所有订单 * zq */@Query(value="SELECT o from Order o where cus_id=:cusid")List findAllOrderByCusId(@Param("cusid")Long cusid);}

OrderRepository.java

package com.wl.ssms.repository;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;import com.wl.ssms.eo.Order;public interface OrderRepository extends JpaRepository{/** * 获取某用户的某订单1 * Modifying queries的返回值只能为void或者是int/Integer  *  单独使用@Query注解只是查询,如涉及到修改、删除则需要再加上@Modifying注解  *  zq */@Query(value="SELECT o from Order o where o.customer.id=?1 AND o.orderId=?2")Order findByCidAndOid(@Param("cid") Long cid,@Param("oid") String oid);/** * 获取某用户的某订单2 * 双表连接查询 * zq */Order findByCustomer_idAndOrderId(@Param("cusid")Long cusid,@Param("oid") String oid);}

OrderItemRepository.java

为空。

可以看到用户自行实现的dao层方法并不多,因为JPA的原因,许多方法内置,许多已经由JPA代劳了,我们只需写对方法名即可完成调用,用户无需显示再写一遍。你可以体验一下了。

如果你对一些基础注解或者用法不太了解,可以前往 SpringBoot之JPA的介绍与使用 参考。