spring-boot快速入門學習筆記-整合JPA mybatis rabbitmq mongodb redis

哪吒小子發表於2019-03-04
  • 交流或更多內容請關注我的公眾號:nezha_blog
  • 我的技術部落格:nezha.github.io
微信公眾號

1. Spring Boot學習筆記–全註解方式

Spring Boot教程與Spring Cloud教程

2. pring boot中文幫助文件

Spring Boot Reference Guide中文翻譯 -《Spring Boot參考指南》—說明:本文件翻譯的版本:1.4.1.RELEASE。

3. 常用註解

  • @RestController
    返回json形式的結果,便於前後端分離。是@ResponseBody 和 @Controller的組合體
  • @RequestMapping
    配置url對映
  • @EnableAutoConfiguration
  • @Configuration
  • @ComponentScan
  • @SpringBootApplication

很多Spring Boot開發者總是使用 @Configuration@EnableAutoConfiguration@ComponentScan 註解他們的main類。由於這些註解被如此頻繁地一塊使用(特別是你遵循以上最佳實踐時),Spring Boot提供一個方便的 @SpringBootApplication 選擇。

@SpringBootApplication 註解等價於以預設屬性使用 @Configuration@EnableAutoConfiguration@ComponentScan

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
複製程式碼
  • @ConfigurationProperties

屬性注入,prefix指代注入的配置來自connection的物件

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
    private String username;
    private InetAddress remoteAddress;
    // ... getters and setters
}
複製程式碼
connection:
  name: 趙武
  age: 18
  job: Java研發工程師
複製程式碼

為了使用@ConfigurationProperties beans,你可以使用與其他任何bean相同的方式注入它們

@Service
public class MyService {
    @Autowired
    private ConnectionSettings connection;
    //...
    @PostConstruct
    public void openConnection() {
        Server server = new Server();
        this.connection.configure(server);
    }
}
複製程式碼
  • @EnableConfigurationProperties
  • @Component@Bean
    @Bean主要被用在方法上,來顯式宣告要用生成的類
  • @Profiles

Spring Profiles提供了一種隔離應用程式配置的方式,並讓這些配置只能在特定的環境下生效。

spring:
  profiles:
    active: dev
複製程式碼
  • @Value

用於獲取配置檔案下的配置項

people:
  name: 趙武
  age: 18
  job: Java研發工程師
複製程式碼
    @Value("${people.name}")
    private String name;
複製程式碼
  • @Controller

@PathVariable,@RequestParam
@GetMapping,@PostMapping:Get 或Post方式的請求,組合模式

@PathVariable的使用,獲取請求引數

@RequestMapping(value="/hello/{id}",method = RequestMethod.GET)
public String sayhello(@PathVariable("id")Integer myid){
    return "id:"+myid;
}
複製程式碼

@RequestParam的使用,獲取傳統方式的引數

@RequestMapping(value="/hi",method = RequestMethod.GET)
public String sayhi(@RequestParam(value = "id",required = false,defaultValue = "100")Integer myid){
    return "id:"+myid;
}
複製程式碼

4. spring data JPA — 單資料來源

具體的實現程式碼demo:Spring-Boot-Restful-JPA的demo程式

定義了物件持久化的標準,主要是對Hibernate的整合

現階段發現和mybatis的直觀操作很一致,都是可能集中管理資料庫連線與釋放,JPA想比較於mybatis可以自動建表,不知道算不算一種優勢,在我看來不算是。畢竟表結構基本上資料庫工程師都搞定了的事。

1.加入依賴

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
複製程式碼

2.配置資料庫和JPA

ddl-auto:建立的方式

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/coder
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
複製程式碼

3.建立Mapper物件

@Entity: 持久化例項

@Table: 自定義表的名稱

@Entity
//@Table(name = "programmer")
public class Coder {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private Integer age;
    public Coder(){
        
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
複製程式碼

4.整合JpaRepository

主要是基於Hibernate的

public interface CoderRepository extends JpaRepository<Coder,Integer> {
    //這個是擴充套件開來的查詢方式
    public List<Coder> findByAge(Integer age);
}
複製程式碼

5.實現一個CoderController,實現增刪改查。

@RestController
public class CoderController {
    @Autowired
    private CoderRepository coderRepository;

    //1.Get方式請求,查詢所有程式設計師資訊
    @GetMapping(value = "/coders")
    public List<Coder> coderList(){
        return coderRepository.findAll();
    }
    //2.Post方式,增加程式設計師
    @PostMapping(value = "/coders")
    public Coder CoderAdd(@RequestParam("name")String name,@RequestParam("age")Integer age){
        Coder coder = new Coder();
        coder.setAge(age);
        coder.setName(name);
        return  coderRepository.save(coder);
    }
    //3.通過id查詢一個人
    @GetMapping(value = "/coders/{id}")
    public Coder CoderFindOne(@PathVariable("id")Integer id){
        return coderRepository.findOne(id);
    }
    //4.通過id刪除一個人
    @DeleteMapping(value = "/coders/{id}")
    public void CoderDelete(@PathVariable("id")Integer id){
        coderRepository.delete(id);
    }
    //5.更新一個人,用Postman模擬的時候注意:用x-www-form-urlencoded
    @PutMapping(value = "/coders/{id}")
    public Coder CoderUpdateOne(@PathVariable("id")Integer id, @RequestParam("name") String name, @RequestParam("age")Integer age){
        Coder coder = new Coder();
        coder.setId(id);
        coder.setName(name);
        coder.setAge(age);
        return coderRepository.save(coder);
    }
    //6.擴充套件Jpa介面,按照年齡查詢
    @GetMapping(value = "/coder/age/{age}")
    public List<Coder> CoderFindAll(@PathVariable("age")Integer age){
        return coderRepository.findByAge(age);
    }

}
複製程式碼

6.實現mysql的事務

  • 首先新建一個Service類:CoderService
@Service
public class CoderService {
    @Autowired
    CoderRepository coderRepository;

    @Transactional
    public void insertTwo(){
        Coder coderA = new Coder();
        coderA.setAge(101);
        coderA.setName("1");
        coderRepository.save(coderA);

        Coder coderB = new Coder();
        coderB.setAge(102);
        coderB.setName("102");
        coderRepository.save(coderB);

    }
}
複製程式碼
  • 在CoderController中自動載入coderService
@Autowired
private CoderService coderService;
複製程式碼
  • 在CoderController呼叫service。
//7.使用事務,同時插入兩個人的資料
@PostMapping(value = "coder/two")
public void coderTwo(){
    coderService.insertTwo();
}
複製程式碼

7.使用@Query實現自定義sql查詢

  • CoderRepository實現下面程式碼
@Query("select p from Coder p where p.id = (select max(p2.id) from Coder p2)")
    Coder getMaxIdCoder();
複製程式碼
  • CoderController中使用getMaxIdCoder方法
//8.自定義sql語句查詢
@GetMapping(value = "/coder/find")
public Coder CoderFindByTask(){
    return coderRepository.getMaxIdCoder();
}
複製程式碼

5. Spring Boot MyBatis — 單資料來源

基於註解方式的Mybatis其實和JPA很類似,不過mybatis不提供自動建立表的操作。這點上jpa更好些。

我的demo程式,在我的github上:spring-boot-mybatis-mysql

引用部落格:
Spring Boot + MyBatis + MySQL 整合–簡書 FlySheep_ly

程式設計師DD:Spring Boot整合MyBatis

     [Spring Boot中使用MyBatis註解配置詳解](http://blog.didispace.com/mybatisinfo/)
複製程式碼

1.引入依賴

<!-- 新增 MyBatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.2.0</version>
</dependency>
<!-- 新增 MySQL -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.41</version>
</dependency>
複製程式碼

2.application.properties中配置mysql的連線配置

spring.datasource.url=jdbc:mysql://localhost:3306/test01
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
複製程式碼

3.建立對映物件User

關於序列化的實現,最好還是實現一下。

import java.io.Serializable;

public class User implements Serializable{
    private static final long serialVersionUID = -5554561712056198940L;

    private Long id;
    private String name;
    private Integer age;

    public User(){
    }

    public 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;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

}
複製程式碼

4.建立User對映的操作UserMapper

關於Mapper的更多操作,請參考mybatis官網

/**
 * Created by nezha on 2017/4/26.
 */

@Mapper
public interface UserMapper {
    /**
     * 新增操作,返回新增元素的 ID
     * @param User
     */
    @Insert("insert into person(name,age) values(#{name},#{age})")
    @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
    void insert(User user);
    /**
     * 查詢所有
     * @return
     */
    @Select("select id,name,age from person")
    List<User> selectAll();

    @Select("SELECT * FROM USER WHERE NAME = #{name}")
    User findByName(@Param("name") String name);
}
複製程式碼

5.呼叫測試

發現Restful風格真是好習慣,很好用很實用。

@EnableTransactionManagement
@RestController
public class TestController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping(value = "/test/{name}")
    public User findOne(@PathVariable("name")String name){
        return userMapper.findByName(name);
    }
}
複製程式碼

可能出現的問題:

mybatis+spring boot, mapper 提示Could not autowire. 一直提示不能載入

spring-boot快速入門學習筆記-整合JPA mybatis rabbitmq mongodb redis
  • 解決方案

修改idea配置,將spring 的severity的值設定為”warning”, 如下:

spring-boot快速入門學習筆記-整合JPA mybatis rabbitmq mongodb redis

如果想進一步縮小修改範圍的話:

Alt + Enter quick fix or change settings
Settings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class - warning
複製程式碼

關於多源配置的問題:

1.Spring Boot 整合 Mybatis 實現 Druid 多資料來源詳解

2.springboot+mybatis多資料來源最簡解決方案

6. Spring Boot RabbitMQ

我的demo程式:spring-boot-RabbitMQ

Spring Boot RabbitMQ 入門–這篇文章寫得不錯,關於RabbitMQ的三種Exchange方式講的很好。不過程式碼不是很簡潔。

RabbitMQ詳解純潔的微笑的文章程式碼很簡潔

安裝與配置

翟永超-Spring boot系列教程

RabbitMQ的三種Exchange方式

1.Direct Exchange

spring-boot快速入門學習筆記-整合JPA mybatis rabbitmq mongodb redis

如果 routing key 匹配, 那麼Message就會被傳遞到相應的queue中。其實在queue建立時,它會自動的以queue的名字作為routing key來繫結那個exchange。

2.Fanout Exchange

spring-boot快速入門學習筆記-整合JPA mybatis rabbitmq mongodb redis

只需要簡單的將佇列繫結到交換機上。一個傳送到交換機的訊息都會被轉發到與該交換機繫結的所有佇列上。很像子網廣播,每臺子網內的主機都獲得了一份複製的訊息。Fanout交換機轉發訊息是最快的。

3.Topic Exchange

spring-boot快速入門學習筆記-整合JPA mybatis rabbitmq mongodb redis

將路由鍵和某模式進行匹配。此時佇列需要繫結要一個模式上。符號“#”匹配一個或多個詞,符號“”匹配不多不少一個詞。因此“audit.#”能夠匹配到“audit.irs.corporate”,但是“audit.

例項講解

三種方式最主要的檔案就三個:

1.sender的配置

2.receiver的配置

3.rabbitConfig的配置

下面,我們通過在Spring Boot應用中整合RabbitMQ,並實現一個簡單的傳送、接收訊息的例子來對RabbitMQ有一個直觀的感受和理解。

在Spring Boot中整合RabbitMQ是一件非常容易的事,因為之前我們已經介紹過Starter POMs,其中的AMQP模組就可以很好的支援RabbitMQ,下面我們就來詳細說說整合過程:

1.pom依賴引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
複製程式碼

2.連線配置

spring.application.name=rabbitmq-hello
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
複製程式碼

3.建立訊息生產者Sender

建立訊息生產者Sender。通過注入AmqpTemplate介面的例項來實現訊息的傳送,AmqpTemplate介面定義了一套針對AMQP協議的基礎操作。在Spring Boot中會根據配置來注入其具體實現。在該生產者,我們會產生一個字串,併傳送到名為hello的佇列中。

@Component
public class Sender {
    @Autowired
    AmqpTemplate amqpTemplate;
    public void send() {
        String context = "hello " + new Date();
        System.out.println("Sender : " + context);
        this.amqpTemplate.convertAndSend("hello", context);
    }
}
複製程式碼

4.建立訊息消費者Receiver

建立訊息消費者Receiver。通過@RabbitListener註解定義該類對hello佇列的監聽,並用@RabbitHandler註解來指定對訊息的處理方法。所以,該消費者實現了對hello佇列的消費,消費操作為輸出訊息的字串內容。

@Component
@RabbitListener(queues = "hello")
public class Receiver {
    @RabbitHandler
    public void process(String hello) {
        System.out.println("Receiver1 : " + hello);
    }
}
複製程式碼

5.建立RabbitMQ的配置類RabbitConfig

建立RabbitMQ的配置類RabbitConfig,用來配置佇列、交換器、路由等高階資訊。這裡我們以入門為主,先以最小化的配置來定義,以完成一個基本的生產和消費過程。

@Configuration
public class RabbitConfig {


    //1.配置一個名為hello的一對一的訊息佇列
    @Bean
    public Queue helloQueue() {
        return new Queue("hello");
    }
}
複製程式碼

5.單元測試:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = HelloApplication.class)
public class HelloApplicationTests {
    @Autowired
    private Sender sender;
    @Test
    public void hello() throws Exception {
        sender.send();
    }
}
複製程式碼

7. Spring Boot mongodb

spring boot mongodb 的demo程式:spring-boot-mongodb

安裝與配置

1、進入mongodb的shell : mongo

2、切換資料庫: use admin

3、新增使用者,指定使用者的角色和資料庫:

db.createUser(  
  { user: "admin",  
    customData:{description:"superuser"},
    pwd: "admin",  
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]  
  }  
)  
user欄位,為新使用者的名字;
pwd欄位,使用者的密碼;
cusomData欄位,為任意內容,例如可以為使用者全名介紹;
roles欄位,指定使用者的角色,可以用一個空陣列給新使用者設定空角色。在roles欄位,可以指定內建角色和使用者定義的角色。
複製程式碼

4、檢視建立的使用者 : show users 或 db.system.users.find()

5、啟用使用者許可權:

修改配置檔案,增加配置:

$ vim /etc/mongod.conf
security:
  authorization: enabled
複製程式碼

6.重新啟動mongodb

sudo service mongod restart
複製程式碼

7.使用使用者管理賬戶登入認證

use admin
db.auth(`admin`, `admin`)
複製程式碼

8.遠端登陸

mongo 123.xxx.xxx.xxx:27017/amdin -uadmin -padmin
複製程式碼

第一個admin:指代資料庫
第二個admin:指代使用者名稱
第三個admin:指代密碼

spring boot 整合 mongodb

1.引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
複製程式碼

2.建立儲存的實體

建立要儲存的User實體,包含屬性:id、username、age

public class User {

    @Id
    private String id;

    private String username;
    private Integer age;

    public User(String username, Integer age) {
//        this.id = id;
        this.username = username;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "username:"+username+"--age:"+age;
    }
}
複製程式碼

3.實現User的資料訪問物件

實現User的資料訪問物件:UserRepository

public interface UserRepository extends MongoRepository<User, String> {

    User findByUsername(String username);

}
複製程式碼

4.配置mongodb的連線

#mongodb3.X的配置
spring.data.mongodb.uri=mongodb://admin:admin@123.206.xxx.xxx:27017/test
#mongodb2.x的配置
spring.data.mongodb.host=localhost spring.data.mongodb.port=27017
複製程式碼

5.在單元測試中呼叫

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test05ApplicationTests{
    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() {
        userRepository.deleteAll();
        // 建立三個User,並驗證User總數
        userRepository.save(new User("didi", 30));
        userRepository.save(new User("mama", 40));
        userRepository.save(new User("kaka", 50));
        Assert.assertEquals(3, userRepository.findAll().size());

        // 刪除一個User,再驗證User總數
        User u = userRepository.findByUsername("didi");
        System.out.println(u.toString());
        userRepository.delete(u);
        Assert.assertEquals(2, userRepository.findAll().size());
    }

}
複製程式碼

出現的問題

1.發現執行成功,但是查不到資料

主要是自己理解錯誤,mongodb資料庫下還有collection(相當於表).然後針對每一個Database下可能有多個collection

8. Spring Boot redis

redis的demo程式:nezha/spring-boot-redis

1.引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
</dependency>
複製程式碼

2.引數配置

# REDIS (RedisProperties)
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=123.206.xxx.xxx
# Redis伺服器連線埠
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=-1
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連線池中的最大空閒連線
spring.redis.pool.max-idle=16
# 連線池中的最小空閒連線
spring.redis.pool.min-idle=0
# 連線超時時間(毫秒)
spring.redis.timeout=0
複製程式碼

3.測試訪問

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test04ApplicationTests {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Test
    public void test() throws Exception {
        // 儲存字串
        stringRedisTemplate.opsForValue().set("aaa", "111");
        Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));
    }

}
複製程式碼

9. Spring Boot定時任務

定時任務demo程式:spring-boot-schedule

1.pom包配置

這部分基本的spring boot啟動項就行,沒有什麼特別的依賴包

2.啟動類啟用定時

@EnableScheduling
@SpringBootApplication
public class ScheduleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduleApplication.class, args);
    }
}
複製程式碼

3.建立定時任務實現類

定時任務一

/**
 * Created by nezha on 2017/4/28.
 */
@Component
public class SchedulerTask {
    private int count = 0;

    @Scheduled(cron="*/6 * * * * ?")
    private void process(){
        System.out.println("this is scheduler task runing  "+(count++));
    }
}
複製程式碼

定時任務二

/**
 * Created by nezha on 2017/4/28.
 */
@Component
public class SchedulerTask2 {
    private static SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 6000)
    public void reportCurrentTime() {
        System.out.println("現在時間:" + dateFormat.format(new Date()));
    }
}
複製程式碼

4.引數說明

@Scheduled 引數可以接受兩種定時的設定,一種是我們常用的cron="*/6 * * * * ?",一種是 fixedRate = 6000,兩種都表示每隔六秒列印一下內容。

fixedRate 說明

  • @Scheduled(fixedRate = 6000) :上一次開始執行時間點之後6秒再執行
  • @Scheduled(fixedDelay = 6000) :上一次執行完畢時間點之後6秒再執行
  • @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延遲1秒後執行,之後按fixedRate的規則每6秒執行一次

10. Spring Boot相關技術

自定義圖示

Spring Boot自定義Banner—自定義圖示

部署spring專案

1.IntelliJ Idea中直接執行

2.mvn spring-boot:run

3.mvn install >>> 會生成jar檔案,執行jar檔案。

spring boot測試的時候,怎麼單元測試

1.使用@SpringBootTest
檔案主要實在test目錄下

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test05ApplicationTests{
    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() {
        userRepository.deleteAll();
        // 建立三個User,並驗證User總數
        userRepository.save(new User("didi", 30));
        userRepository.save(new User("mama", 40));
        userRepository.save(new User("kaka", 50));
    }
}
複製程式碼

2.使用@SpringBootApplication

在主目錄下com.nezha/

@SpringBootApplication
public class Application implements CommandLineRunner {
    @Autowired
    private CustomerRepository repository;
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        repository.deleteAll();
        // save a couple of customers
        repository.save(new Customer("Alice", "Smith"));
        repository.save(new Customer("Bob", "Smith"));
    }
}
複製程式碼

3.使用RestController

這種方式很方便,很好用,有些時候我會用。

相關文章