ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-12-18 19:29:51  阅读:163  来源: 互联网

标签:java String jpa spring eclipse springframework import org public


内容

我们要做什么

这篇文章是我借助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

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

标签:java,String,jpa,spring,eclipse,springframework,import,org,public
来源: https://blog.csdn.net/linzeyang1997/article/details/111385886

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有