使用eclipse搭建spring-data-jpa项目 条件 分页 排序查询 事务

我们要做什么

这篇文章是我借助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
  1. 【补充】如果你突然遇到 No default constructor for entity 这个报错,看看实体类里有没有空构造器,没有的话创建一个 protected Xxxx() {} 然后再运行试试?

谢谢大家的捧场,如果有任何问题可以留言,我会时不时回来看的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值