• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 使用eclipse搭建spring-data-jpa項目 條件 分頁 排序查詢 事務

    標簽: 學習Spring  spring  jpa  eclipse  java  mysql

    我們要做什么

    這篇文章是我借助Spring框架搭建的一個spring-data-jpa的后端demo,可以帶條件并分頁查詢數據庫記錄,支持事務,希望對你有幫助。
    Eclipse的朋友可以使用STS來快速構建你的spring項目,在Eclipse上方工具欄,點擊Help-> Eclipse Marketplace, 搜索STS,那個Spring Tool Suite就是。Install之后,重啟Eclipse, 你就可以像在IDEA里面一樣快速生成一個spring項目啦!
    在Eclipse Marketplace里搜索STS, 下載Spring項目開發套件(spring tool suite)
    Eclipse新建spring starter project

    你需要有這些準備

    • 可以聯網的電腦 (能科學上網更佳)
    • 配置好JDK和Maven的Eclipse環境
    • 對spring-data框架有一定了解

    代碼及相關配置文件

    pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>org.lzy.example</groupId>
    	<artifactId>backend-practice</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>backend-practice</name>
    	<description>Demo project for Spring Boot</description>
    
    	 <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>
    	<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot</artifactId>
    			<version>2.2.12.RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-jpa</artifactId>
    			<version>2.2.12.RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    			<version>2.2.12.RELEASE</version>
    		</dependency>
    		
    		 <dependency>
            	<groupId>com.alibaba</groupId>
            	<artifactId>druid</artifactId>
            	<version>1.0.29</version>
            </dependency>
            
            <dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<version>8.0.22</version>
    	</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<version>2.2.12.RELEASE</version>
    			<exclusions>
    				<exclusion>
    					<groupId>org.junit.vintage</groupId>
    					<artifactId>junit-vintage-engine</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    

    application.properties文件

    Spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    Spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
    Spring.datasource.url=jdbc:mysql://[YOUR_DATABASE_URL_HERE]:3306/[YOUR_DATABASE_NAME_HERE]?characterEncoding=utf8
    Spring.datasource.username=[YOUR_USERNAME_HRER]
    Spring.datasource.password=[YOUR_PASSWORD_HRER]
    Spring.jpa.properties.hibernate.show_sql=true
    Spring.jpa.properties.hibernate.format_sql=true
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    

    mysql數據庫建表

    Customer表

    FieldTypePrimaryKeyauto_increment
    idint主鍵自增
    firstNamevarchar
    lastNamevarchar

    TrainInfo表

    FieldTypePrimaryKeyauto_increment
    idint主鍵自增
    trainNumbervarchar
    trainLeaveTimedate
    trainStartStationvarchar

    TicketRecord表

    FieldTypePrimaryKeyauto_increment
    idint主鍵自增
    passengerNamevarchar
    trainNumbervarchar

    整體項目結構

    package structure

    各個代碼文件

    Customer.java

    package org.lzy.example.entity;
    import java.io.Serializable;
    
    import javax.persistence.*;
    
    
    
    // because no @Table annotation exists, it is assumed that this
    // entity is mapped to a table named Customer
    @Entity
    public class Customer  implements Serializable {
    	
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	private Long id;
    	private String firstName;
    	private String lastName;
    	
    	
    	// for the sake of JPA
    	protected Customer() {}
    	
    	public Customer(String firstName, String lastName) {
    		this.firstName = firstName;
    		this.lastName = lastName;
    	}
    
    	public Long getId() {
    		return id;
    	}
    
    	public void setId(Long id) {
    		this.id = id;
    	}
    
    	public String getFirstName() {
    		return firstName;
    	}
    
    	public void setFirstName(String firstName) {
    		this.firstName = firstName;
    	}
    
    	public String getLastName() {
    		return lastName;
    	}
    
    	public void setLastName(String lastName) {
    		this.lastName = lastName;
    	}
    
    	@Override
    	public String toString() {
    		return "Customer [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
    	}
    	
    	
    }
    
    

    TicketRecord.java

    package org.lzy.example.entity;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Entity
    public class TicketRecord {
    	
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	private Integer id;
    	
    	private String passengerName;
    	
    	private String trainNumber;
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getPassengerName() {
    		return passengerName;
    	}
    
    	public void setPassengerName(String passengerName) {
    		this.passengerName = passengerName;
    	}
    
    	public String getTrainNumber() {
    		return trainNumber;
    	}
    
    	public void setTrainNumber(String trainNumber) {
    		this.trainNumber = trainNumber;
    	}
    
    	public TicketRecord(String passengerName, String trainNumber) {
    		super();
    		this.passengerName = passengerName;
    		this.trainNumber = trainNumber;
    	}
    	
    
    }
    
    

    TrainInfo.java

    package org.lzy.example.entity;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    public class TrainInfo  implements Serializable {
    	@Id 
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	private Integer id;
    	
    	@Temporal(TemporalType.TIMESTAMP)
    	private Date trainLeaveTime;
    	
    	private String trainStartStation;
    	
    	private String trainNumber;
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public Date getTrainLeaveTime() {
    		return trainLeaveTime;
    	}
    
    	public void setTrainLeaveTime(Date trainLeaveTime) {
    		this.trainLeaveTime = trainLeaveTime;
    	}
    
    	public String getTrainStartStation() {
    		return trainStartStation;
    	}
    
    	public void setTrainStartStation(String trainStartStation) {
    		this.trainStartStation = trainStartStation;
    	}
    
    	public String getTrainNumber() {
    		return trainNumber;
    	}
    
    	public void setTrainNumber(String trainNumber) {
    		this.trainNumber = trainNumber;
    	}
    	
    }
    

    CustomerRepository.java

    package org.lzy.example.repository;
    
    import org.lzy.example.entity.Customer;
    import org.springframework.data.repository.CrudRepository;
    import java.util.List;
    
    public interface CustomerRepository extends CrudRepository<Customer, Long> {
    	List<Customer> findByLastName(String lastName);
    	
    	Customer findById(long id);
    }
    
    

    TicketRecordRepository.java

    package org.lzy.example.repository;
    
    import org.lzy.example.entity.TicketRecord;
    import org.springframework.data.repository.CrudRepository;
    
    public interface TicketRecordRepository extends CrudRepository<TicketRecord, Long> {
    	
    }
    

    TrainInfoRepository.java

    package org.lzy.example.repository;
    
    import java.util.List;
    
    import org.lzy.example.entity.TrainInfo;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.repository.PagingAndSortingRepository;
    import org.springframework.data.repository.query.Param;
    
    public interface TrainInfoRepository extends PagingAndSortingRepository<TrainInfo, Long> {
    	
    	List<TrainInfo> findByTrainNumber(String trainNumber);
    	
    	List<TrainInfo> findByTrainStartStation(String station, Pageable pageable);
    }
    
    

    NoThisTrainException.java

    package org.lzy.example.exception;
    
    public class NoThisTrainException extends RuntimeException {
    	// 有參構造器
    	public NoThisTrainException(String message){ 
    		super(message); 
    		}
    	
    }
    

    CustomerServiceController.java

    package org.lzy.example.controller;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.lzy.example.entity.Customer;
    import org.lzy.example.repository.CustomerRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class CustomerServiceController {
    	
    	@Autowired
    	private CustomerRepository customerRepository;
    	
    	@RequestMapping("/customer/add")
    	public Map<String, Object> add(@RequestBody(required=false) Customer customer){
    		Map<String, Object> resultMap = new HashMap<String, Object>();
    		
    		customerRepository.save(customer);
    		resultMap.put("msg", "ok");
    		return resultMap;
    		
    	}
    	
    	@RequestMapping("/customer/query_all")
    	public Map<String, Object> query_all(){
    		Map<String, Object> resultMap = new HashMap<String, Object>();
    		
    		List<Customer> allCustomers = (List<Customer>) customerRepository.findAll();
    		resultMap.put("msg", "ok");
    		resultMap.put("data", allCustomers);
    		resultMap.put("total", allCustomers.size());
    		return resultMap;
    		
    	}
    }
    
    

    TrainServiceController.java

    package org.lzy.example.controller;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.lzy.example.entity.TicketRecord;
    import org.lzy.example.entity.TrainInfo;
    import org.lzy.example.exception.NoThisTrainException;
    import org.lzy.example.repository.CustomerRepository;
    import org.lzy.example.repository.TicketRecordRepository;
    import org.lzy.example.repository.TrainInfoRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Sort;
    import org.springframework.data.domain.Sort.Direction;
    import org.springframework.data.domain.Sort.Order;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TrainServiceController {
    	
    	@Autowired
    	private CustomerRepository customerRepostitory;
    	
    	@Autowired
    	private TrainInfoRepository trainInfoRepository;
    	
    	@Autowired
    	private TicketRecordRepository ticketRecordRepository;
    	
    	@RequestMapping("/trainService/query/station/{stationName}/{page}/{size}")
    	public Map<String, Object> queryStation(@PathVariable("stationName") String station, 
    			@PathVariable("page") Integer page,
    			@PathVariable("size") Integer size) {
    		Map<String, Object> returnMap = new HashMap<String, Object>();
            PageRequest pageRequest =  PageRequest.of(page-1, size,Direction.DESC, "trainLeaveTime", "trainNumber");
    		List<TrainInfo> t = trainInfoRepository.findByTrainStartStation(station, pageRequest);
    		returnMap.put("data", t);
    		returnMap.put("total", t.size());
    		returnMap.put("page", page);
    		returnMap.put("size", size);
    		
    		return returnMap;
    	}
    	
    	@Transactional
    	@RequestMapping("/trainService/order/submit/{train_no}/{p_name}")
    	public Map<String, Object> submitTrainTicketOrder(@PathVariable("train_no") String trainNumber,
    			@PathVariable("p_name") String passengerName){
    		Map<String, Object> returnMap = new HashMap<String, Object>();
    		//1  向TicketRecord表插入一條購票記錄
    		TicketRecord tr = new TicketRecord(passengerName, trainNumber);
    		ticketRecordRepository.save(tr);
    		
    		//2  在TrainInfo表里查詢是否有這趟列車存在
    		String resultStatus = "購票失敗";
    		List<TrainInfo> ti = trainInfoRepository.findByTrainNumber(trainNumber);
    //		System.out.println(ti.size());
    		if (ti.size() != 0)
    			resultStatus = "購票成功";
    		else
    			throw new NoThisTrainException("查詢不到該趟列車!");
    		
    		
    		returnMap.put("result", resultStatus);
    		return returnMap;
    		
    		
    	}
    
    }
    
    

    BackendPracticeApplication.java

    package org.lzy.example;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class BackendPracticeApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(BackendPracticeApplication.class, args);
    	}
    
    }
    
    

    記錄我遇到的坑

    1. entity的那些類一定不要忘記生成setter/gettter方法,否則在controller里的getContent()只會記錄元素個數,不會顯示出內容!!
    2. 數據庫表最好把主鍵設置為自增,然后GenerationType用IDENTITY。
    3. 之前我自己而外在entity的類前加上@Table(name=“Customer”), 但是這樣做它有時還是會顯示Table ‘xxx.Customer’ does not exist, 所以我干脆不要這個注釋了,但是application.properties里面別忘了
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    
    1. TrainServiceController.java這個類里的submitTrainTicketOrder方法,如果不加@Transactional注解,好像是不能支持事務的。大家可以自己測試一下。
    2. 下面這行代碼產生的 ti 不能使用 == null 來判斷是否查詢到記錄(即使查不到它也不為null), 應該用 ti.size() != 0來判斷,血的教訓。。。
    List<TrainInfo> ti = trainInfoRepository.findByTrainNumber(trainNumber);
    // 如果查詢不到記錄
    //  System.out.println(ti.size());  0
    //  System.out.println(ti==null);  false
    

    謝謝大家的捧場,如果有任何問題可以留言,我會時不時回來看的。

    版權聲明:本文為linzeyang1997原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/linzeyang1997/article/details/111385886

    智能推薦

    mybatis條件分頁查詢sql

    需求:一個搜索欄輸入條件進行模糊查詢. 1.controller層2.service層實現類3.mybatis.xml文件中sql編寫: 4.使用postman檢驗成功...

    數組刪除其中某個對象的方法

    數組刪除其中的對象或元素,在前端是比較常見的需求。 我現在比較常用的方法如下: 這種方法只適合刪除具有唯一標識的對象。 有沒有想要脫單的小伙伴,加入我們的脫單星球,認識更多優秀的小哥哥小姐姐 特此聲明,星球是免費的,但是創建星球的時候說是必須輸入金額,所以只能先私聊,我再加你免費加入!...

    圖床搭建以及圖床工具的使用

    為什么要用圖床和圖床工具? 比較下面三種md中的圖片url地址(均免費),你會使用哪一種? 選1?由于是本地路徑,文檔分享后給其他人打開后很可能顯示圖片加載失敗。 選2?雖然分享后可以顯示圖片,但能保證加載速度? 選3?我肯定選這種,即兼容2的瀏覽器訪問,又能保證訪問速度。 這樣就可以回答上面的問題了!保證瀏覽器訪問要用圖床,保證加載速度要用圖床工具,又不花錢想想就開心。 除此之外本篇博客還會講解...

    并發編程理論篇

    一、必備知識回顧 計算機又叫電腦,即通電的大腦,發明計算機是為了讓他通電之后能夠像人一樣去工作,并且它比人的工作效率更高,因為可以24小時不間斷 計算機五大組成部分 控制器 運算器 存儲器 輸入設備 輸出設備 計算機的核心真正干活的是CPU(控制器+運算器=中央處理器) 程序要想被計算機運行,它的代碼必須要先由硬盤讀到內存,之后cpu取指再執行 并發 看起來像同時運行的就可以稱之為并發 并行 真正...

    Java LinkedHashMap

    Java LinkedHashMap 前言 Map是我們在實際使用過程中常用的集合,HashMap在Java的實際開發中出鏡率很高,它通過hash算法實現了高效的非線程安全的集合,它有一個缺點就是,用戶插入集合的數據時無序,在我們需要一些有序的map的時候,我們就需要引入另外一個集合:LinkedHashMap。 LinkedHashMap是一個有序的非線程安全的集合,它是HashMap的子類,基...

    猜你喜歡

    Spark Streaming處理文件(本地文件以及hdfs上面的文件)

    標題介紹文件流之前先介紹一下Dstream 下面是來自官網一段的說明,Discretized Streams或DStream是Spark Streaming提供的基本抽象。它表示連續的數據流,可以是從源接收的輸入數據流,也可以是通過轉換輸入流生成的已處理數據流。在內部,DStream由一系列連續的RDD表示,這是Spark對不可變的分布式數據集的抽象(有關更多詳細信息,請參見Spark編程指南)。...

    《痞子衡嵌入式半月刊》 第 8 期

    痞子衡嵌入式半月刊: 第 8 期 這里分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農歷年分二十四節氣,希望在每個交節之日準時發布一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 :《痞子衡嵌入式半月刊: 第 7 期》 嘮兩句 今天是小滿,小滿節氣意味著進入了大幅降水的雨季。痞子...

    (C++)二叉樹的線索化 / 線索二叉樹

    好久不見,朋友們!雖然我知道沒人看我的博客,但我還是想叨逼叨一下。啊,好久沒編程了(其實也就一周沒編),但你們知道,程序員一天不編程那能叫程序員么???雖然我不是程序員哈哈哈哈哈,但還是要有基本素養嘛。 繼續寫二叉樹,給自己立一個flag,就是這幾天要寫完之前沒做完的幾道題,和二叉樹紅黑樹各種樹之類的~~雖然有這個flag,但我還是很實誠地遵從自己的內心,買了一張明天的電影票,等我回來告訴你們好不...

    Linux內存管理:分頁機制

    《Linux內存管理:內存描述之內存節點node》 《Linux內存管理:內存描述之內存區域zone》 《Linux內存管理:內存描述之內存頁面page》 《Linux內存管理:內存描述之高端內存》 《Linux內存管理:分頁機制》 《內存管理:Linux Memory Management:MMU、段、分頁、PAE、Cache、TLB》 目錄 1 分頁機制 1.1 為什么使用多級頁表來完成映射 ...

    Logtail 混合模式:使用插件處理文件日志

    作為一個服務百萬機器的日志采集 agent,Logtail 目前已經提供了包括日志切分、日志解析(完整正則、JSON、分隔符)、日志過濾在內的常見處理功能,能夠應對絕大多數場景的處理需求。但有些時候,由于應用的歷史原因或是本身業務日志的復雜性,單一功能可能無法滿足所采集日志的處理需求,比如: 日志可能不再是單一格式,有可能同時由 JSON 或者分隔符日志組成。 日志格式可能也不固定,不同的業務邏輯...

    精品国产乱码久久久久久蜜桃不卡