SpringBoot Road (1) Первое знакомство со SpringBoot

Spring Boot база данных Микросервисы SQL

####ПредисловиеSpring Bootиспользуется для упрощенияSpringНовый фреймворк для первоначальной настройки и разработки приложений, считающийсяSpringMVCПреемник тесно связан с микросервисами.Демонстрация простого примера Spring Boot

####Преимущества и недостатки SpringMVC

  • преимущество:

    • Spring BootПодходит для быстрой разработки и построения микросервисных систем. Инкапсулирует часто используемые компоненты, такие какMyBatis, Hibernate, MongoDBЖдать.
    • чистыйJavaнастройка проста и удобна.
    • После настройки инструментов сборки, таких как Maven,java -jarРазвертывание относительно простое.
    • Spring BootОн очень удобен для настройки и может быть настроен вapplication.ymlилиConfigсвоего рода,Spring BootОбщая идея заключается в том, что если есть настройка, настройка имеет приоритет, в противном случае используется конфигурация по умолчанию.
    • Spring BootУпрощает кодирование, настройку, развертывание и мониторинг.
  • недостаток:

    • Настолько удобно, что неопытные новички вообще не знаютSpring BootЧто сделал нижний? Интеграция высока, и понять нижний слой во время использования непросто.
    • Есть несколько соответствующих учебных документов и много ям.

####Первое приложение Spring Boot

  1. Сначала создайтеNew Project, выбиратьSpring Initializr,потомChoose Initializr Service URLдолжен выбратьCustom, правильная ссылка должна бытьhttp://start.spring.io/, вместоhttps://start.spring.io/.httpsЭто приведет к провалу нашего визита!

Paste_Image.png

2. Связанная конфигурация,TypeМы выбираемMaven Project

Paste_Image.png

3. ВыберитеWebВот и все. Кроме тогоSpring BootВерсия 1.5.8

Paste_Image.png

4.Finished. Готово!

Paste_Image.png

5. Так как по умолчаниюsetting.xmlКонфигурация, для нас слишком медленная загрузка jar с пульта, поэтому мы должны изменить.m2следующееsetting.xmlфайл, покаsetting.xmlизначально указывал наC:\Users\Administrator\.m2\repositoryАдрес склада можно изменить на следующий из нашего пользовательского диска. Мой файл settings.xml выглядит так, если вы все еще не понимаете, пожалуйста, переместитеКонфигурация, связанная с Setting.xml

<mirrors>
	 <mirror>  
		<id>alimaven</id>  
		<name>aliyun maven</name>  
		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
		<mirrorOf>central</mirrorOf>          
	</mirror>  
  </mirrors

6. Мы это видимDemoApplicationкласс, это всеSpring BootВход приложения, есть@SpringBootApplicationЭто замечание очевидно.

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

7. Далее мы создаемHelloController.java, @RestControllerРоль этой аннотации: объявить, что этоControllerкласс, возвращаетсяjson. На самом деле это@ResponseBodyи@Controllerкомбинация.

@RestController
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String say() {
        return "Hello, Spring Boot!";
    }
}

8. Есть 3 способа начать. (1) непосредственно вItellij IDEAзапускать.

Paste_Image.png
(2) В корневом каталоге проекта откройте командное окно и введитеmvn spring-boot:run
Paste_Image.png

(3) В корневом каталоге проекта откройте командное окно и введитеmvn install, пусть проект сгенерируетjarСумка.

Paste_Image.png
тогда вы найдетеtargetЕще один под сумкойjarСумка.
Paste_Image.png

введите командуjava -jar target/demo-0.0.1-SNAPSHOT.jar

Paste_Image.png
9. Мы можем получить доступSpring Bootприменяемый.

Paste_Image.png


###Конфигурация свойств проекта 1. Мы можемresources文件夹Сборка 3 нижеproperties,application-dev.propertiesЯвляется файлом конфигурации в среде разработки.application-prod.propertiesЭто файл конфигурации в среде приложения.Spring BootФайл конфигурации, читаемый по умолчанию,application.properties, нам нужно толькоapplication.propertiesВы можете указать файл конфигурации, в котором будет использоваться среда. Например:spring.profiles.active=dev

Paste_Image.png

2. Мыapplication-dev.properties, настройте некоторую информацию, чтобы позволить нашемуControllerкласс для чтения информации о конфигурации.

server.port=8081
server.context-path=/girl
cupSize=A
height=160
content="cupSize: ${cupSize}, age: ${height}"
girl.cupSize=A
girl.height=160

3. Класс Controller считывает информацию о конфигурации и запускает Spring Boot для вывода результатов.

public class HelloController {
    @Value("${cupSize}")
    private String cupSize;

    @Value("${height}")
    private String height;

    @Value("${content}")
    private String content;

    @RequestMapping(value = "/display", method = RequestMethod.GET)
    public String display() {
       return "cupSize=" + cupSize + ", height=" + height;
    }

    @RequestMapping(value = "/content", method = RequestMethod.GET)
    public String displayContent() {
        return content;
    }
}

Paste_Image.png

Paste_Image.png

4.ControllerКласс читает строку с префиксом информации о конфигурации, например, мы хотим прочитатьgirl.cupSize=A girl.height=160Что нам делать с этой конфигурационной информацией с девушками. Нам нужно определитьGirlProperties.java.@ConfigurationPropertiesПредставляет информацию о конфигурации, с каким префиксом мы хотим прочитать,@ComponentУказывает, что этот класс был зарегистрирован в файле конфигурации Spring.

@ConfigurationProperties(prefix = "girl")
@Component
public class GirlProperties {
    private String cupSize;
    private String height;

    public String getCupSize() {
        return cupSize;
    }

    public void setCupSize(String cupSize) {
        this.cupSize = cupSize;
    }

    public String getHeight() {
        return height;
    }

    public void setHeight(String height) {
        this.height = height;
    }
}

5.Controllerкласс читатьGirlProperties, мы будем использовать@AutowiredинъекцияGirlPropertiesЭкземпляр этого класса, который внедряется через тип компонента. Запустите приложение Spring Boot и выведите результаты.

@RestController
public class HelloController {
    @Autowired
    private GirlProperties girlProperties;

    @RequestMapping(value = "/properties", method = RequestMethod.GET)
    public String displayProperties() {
        return girlProperties.getCupSize() + girlProperties.getHeight();
    }
}

Paste_Image.png


###Использование контроллера 1. Используйте как можно больше@GetMappingи@PostMappingзаменять@RequestMapping(value = "/xxxxx", method = RequestMethod.GET)2. При необходимости вSpring Bootиспользовать@Controller, должен вернуть логическое представление. Например

@Controller
public class DemoController {
    @RequestMapping(value = "/saylove", method = RequestMethod.GET)
    public String sayLove() {
        return "index";
    }
}

index.htmlвtemplatesпод папкой

Paste_Image.png

3.pom.xmlКонфигурация выглядит следующим образом

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>girl</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.8.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<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-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
			<version>1.5.8.RELEASE</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

###Операции с базой данных 1. Вapplication-dev.propertiesНастройка конфигурации подключения к данным

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot
spring.datasource.username=root
spring.datasource.password=xiaoma96
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-autoЕсть 4 свойства:create: Независимо от того, была ли эта таблица изначально в базе данных, при каждом запуске приложения таблица будет удаляться, а затем будет создаваться новая таблица.update: Если в базе есть эта таблица и есть данные, то я сохраню эту таблицу и не буду ее удалять.create-drop: Когда приложение остановится, эта таблица в базе данных будет удалена.none: не производит никаких действий.

2. Что такоеJPA?JPAПолное английское названиеJava Persistence APIОпределен ряд стандартов для сохраняемости объектов. В настоящее время продукты, реализующие эту спецификацию, включаютHibernate.

3. Как использоватьJPA?использовался раньшеLiferayТехнологии,Liferayпройти черезServiceBuilderгенерироватьService.xml,на этоService.xmlНастройте таблицы базы данных, которые необходимо создатьentityинформацию, а затем определить некоторые поля метода. Затем постройте его. создаст соответствующийCRUDметод очень хитрый. И при следующем запуске приложения будет сгенерирована соответствующая таблица базы данных. Если вам нужно настроить оператор sql, вам нужно толькоfinderImplиServiceImplДобавьте свой собственный метод внутри, затемbuildТеперь регенерируйте интерфейс. такой жеJPA,простоCRUDНам не нужно писать операторы sql, нам просто нужно определитьGirlRepositoryинтерфейс, унаследованныйJpaRepository<Girl, Integer>Вот и все. нужно настроитьCRUD, мы добавляем соответствующий метод в строку.

public interface GirlRepository extends JpaRepository<Girl, Integer> {

    public List<Girl> findByAge(Integer age);

    public List<Girl> findByCupSize(String cupSize);

    public List<Girl> findByName(String name);
}

4. ОпределениеRESTfulAPI,открытьCRUDинтерфейс. увеличить, использоватьPOST, запрос с использованиемGET, обновить с помощьюPUT, удалить с помощьюDELETE.

@RestController
public class GirlController {
    @Autowired
    private GirlRepository girlRepository;

    /**
     * Queries all girls.
     * @return girls List queryed
     */
    @GetMapping(value = "/girls")
    public List<Girl> girlList() {
        return girlRepository.findAll();
    }

    /**
     * Adds girl
     * @param name
     * @param cupSize
     * @param age
     * @return girl added
     */
    @PostMapping(value = "/girls")
    public Girl girlAdd(@RequestParam("name") String name, @RequestParam("cupsize") String cupSize
            , @RequestParam("age") Integer age) {
        Girl girl = new Girl();
        girl.setAge(age);
        girl.setName(name);
        girl.setCupSize(cupSize);
        return girlRepository.save(girl);
    }

    /**
     * Finds girl by id
     * @param id
     * @return girl finded
     */
    @GetMapping(value = "/girls/{id}")
    public Girl girlFindOne(@PathVariable("id") Integer id) {
        return girlRepository.findOne(id);
    }

    /**
     * Updates girl
     * @param id
     * @param name
     * @param cupSize
     * @param age
     * @return girl updated
     */
    @PutMapping(value = "/girls/{id}")
    public Girl girlUpdateOne(@PathVariable("id") Integer id, @RequestParam("name") String name, @RequestParam("cupsize") String cupSize
            , @RequestParam("age") Integer age) {
        Girl girl = new Girl();
        girl.setCupSize(cupSize);
        girl.setName(name);
        girl.setAge(age);
        girl.setId(id);
        return girlRepository.save(girl);
    }

    /**
     * Deletes girl by id
     * @param id
     */
    @DeleteMapping(value = "/girls/{id}")
    public void girlDeleteOne(@PathVariable("id") Integer id) {
        girlRepository.delete(id);
    }

    /**
     * Queries girls by name
     * @param name
     * @return girl list queryed
     */
    @GetMapping(value = "/girls/name/{name}")
    public List<Girl> girlFindByName(@PathVariable("name") String name) {
        return girlRepository.findByName(name);
    }

    /**
     * Queries girls by age
     * @param age
     * @return girl list queryed
     */
    @GetMapping(value = "/girls/age/{age}")
    public List<Girl> girlFindByAge(@PathVariable("age") Integer age) {
        return girlRepository.findByAge(age);
    }

    /**
     * Queries girls by cupsize
     * @param cupSize
     * @return girl list queryed
     */
    @GetMapping(value = "/girls/cupsize/{cupsize}")
    public List<Girl> girlFindByCupSize(@PathVariable("cupsize") String cupSize) {
        return girlRepository.findByCupSize(cupSize);
    }
}

5. ИспользуйтеPostmanтест программного обеспеченияAPI. Здесь я просто тестирую запросapi, показывать.

Paste_Image.png


###Управление транзакциями 1. Что такое транзакция Транзакция представляет собой серию операций, выполняемых как логическая единица. Он имеет 4 свойства

  • Атомарность: транзакция — это атомарная операция, состоящая из последовательности действий. Атомарность транзакций гарантирует, что действия либо завершатся, либо завершатся неудачно.
  • Непротиворечивость: после завершения транзакции, будь она успешной или неудачной, система должна гарантировать, что бизнес, который она моделирует, находится в согласованном состоянии, не полностью завершен или частично не выполнен, а фактические данные не должны быть повреждены.
  • Изоляция: может быть много транзакций, работающих с одними и теми же данными одновременно, поэтому каждая транзакция должна быть изолирована от других транзакций, чтобы предотвратить повреждение данных.
  • Долговечность: после завершения транзакции, независимо от того, что произойдет, системная ошибка, ее результаты не должны быть затронуты, чтобы она могла восстановиться после любого системного сбоя, обычно недостатки транзакции записываются в постоянное хранилище.

2. Несколько транзакций, которые мы обычно используем:

  • PROPAGATION_REQUIRED: если есть транзакция, текущая транзакция поддерживается, если нет, то она включена.
  • PROPAGATION_SUPPORTS: Если есть транзакция, поддерживается текущая транзакция, если нет транзакции, она выполняется как не-транзакция.
  • PROPAGATION_REQUIRES_NEW: Начать новую транзакцию, независимую от текущей транзакции, текущая транзакция приостанавливается.

3. Мы моделируем откат транзакции, чтобы отразить атомарность транзакции.saveэксплуатация без проблем, второйsaveОперация выдает исключение. Но не частично успешным, не частично неудачным. Эти две операции в конечном итоге будут отменены.

@Service
public class GirlService {

    @Autowired
    private GirlRepository girlRepository;

    @Transactional
    public void insertTwo() {
        Girl girlA = new Girl("garrett-test", 18, "Z");
        girlRepository.save(girlA);

        Girl girlB = new Girl("mayday-test", 21, "BBBBBBBB");
        girlRepository.save(girlB);
    }
}

@RestController
public class GirlController {
    @Autowired
    private GirlService girlService;

    /**
     * Tests transaction
     */
    @GetMapping(value = "/transaction")
    public void transactionTest() {
        girlService.insertTwo();
    }
}

4. Запустите приложение, откройтеPostman,контрольная работаAPI. Очевидно, операция была отброшена, когда произошло исключение, и в базу данных не было вставлено никаких данных.

image.png


####Конец комментариев Учиться нет конца, давайте работать вместе.

Категории