SpringBoot(一)

Springboot(一)

什么是SpringBoot

SpringBoot是Spring項目中的一個子工程迅办,與Spring-famework同屬于Spring的產(chǎn)品

用一些固定的方式來構建生產(chǎn)級別的Spring應用喝滞。SpringBoot推崇約定大于配置的方式以便于能夠盡可能快速的啟動并運行程序

我們把Spring Boot稱為搭建程序的腳手架帐偎,最主要作用就是幫我們快速的構建龐大的項目缚态,并且盡可能的減少一切xml配置,做到開箱即用媳板。

為什么要用SpringBoot

我們Java一直被人詬病臃腫、麻煩痘绎。往往我們需要開發(fā)一個Java項目時津函,總是需要大量的工作來進行配置和構建。主要原因是:

  • 復雜的配置
  • 混亂的依賴管理

SpringBoot的特點

我們可以使用SpringBoot創(chuàng)建Java應用孤页,并使用java -jar啟動尔苦,就能得到一個生產(chǎn)級別的web工程

  • 為所有Spring的開發(fā)者提供一個非常快速的散庶、廣泛接受的入門體驗
  • 開箱即用(啟動器starter-其實就是SpringBoot提供的一個jar包,并通過自己設置.properties參數(shù)來達到配置的目的)
  • 提供一些大型項目中常見的非功能性特性
  • 無需xml配置凌净,絕對沒有代碼生成

快速入門

快速創(chuàng)建SpringBoot項目

idea快速創(chuàng)建SpringBoot項目

選擇web

SpringBoot項目結構
  • 啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootFastcreateApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringbootFastcreateApplication.class, args);
    }

}

啟動類分析

  1. @SpringBootApplication:證明這工程是一個springboot的應用
  2. main方法:SpringApplication.run
    構造一個springApplication悲龟,執(zhí)行SpringApplication的run方法

手動創(chuàng)建SpringBoot項目

  1. 創(chuàng)建一個Maven工程 作為父工程


    image.png
  2. 引入spring父工程依賴
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>
  1. 添加一個起步依賴(引入start-web、java的版本1.8)
    為了讓SpringBoot幫我們完成各種自動配置冰寻,我們必須引入SpringBoot提供的自動配置依賴须教。也就是啟動器。因為我們是web項目斩芭,所以我們在這里引入web啟動器
<!--2轻腺、JAVA的版本-->
<properties>
    <java.version>1.8</java.version>
</properties>

<!--3、起步依賴-->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
  • 注意這里我們不需要指定版本的信息划乖,因為SpringBoot的父工程已經(jīng)對版本進行管理了
  1. 創(chuàng)建一個啟動類
package com.probuing.self;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author wangxin
 * @date 2020/1/11 17:24
 * @description: TODO
 * GOOD LUCK贬养!
 */
@SpringBootApplication
public class ApplicationRun {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationRun.class, args);
    }
}

4.1 創(chuàng)建一個Controller

package com.probuing.self.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wangxin
 * @date 2020/1/11 17:26
 * @description: TODO
 * GOOD LUCK!
 */
@RestController
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String helloController() {
        return "hello,SpringBoot";
    }
}

@RestController 包含@Controller 還有@ResponseBody
返回的就是json數(shù)據(jù)

  1. 啟動測試


    啟動
  • 啟動測試后我們可以看到監(jiān)聽的端口(紅框內(nèi))
  1. 訪問Controller
    http://localhost:8080/hello

Springboot配置文件

4.1 配置文件介紹

properties:鍵值對配置
yml:可以跨應用
yaml:和yml一樣
yml和yaml比properties強大的是可以在配置文件中定義一個數(shù)組或集合

server:
  port:8082
  • 前綴需要兩個或多個空格琴庵,不能使用制表符
  • 不同等級用:隔開
  • 冒號之后如果有值误算,那么冒號和值之間至少有一個空格,不能緊貼著

配置文件優(yōu)先級

  • properties->yml->yaml
  • 優(yōu)先級:properties大于yml yum大于yaml

使用配置文件

  • yml文件內(nèi)容 applicaiton.yml
server:
  port:8090

# 常量
name: 和平精英

# 對象
game:
  name: wow
  age: 10
  
# 數(shù)組
games: 
  - wow
  - cod
  - ps4

使用@Value讀取配置文件

  • HelloController.java
package com.probuing.sb_config.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @author wangxin
 * @date 2020/1/11 17:48
 * @description: TODO
 * GOOD LUCK迷殿!
 */
@RestController
public class ConfigController {

    @Value("$(name)")
    private String name;

    //定義對象屬性
    @Value("$(game.name)")
    private String gameName;

    //數(shù)組屬性

    @Value("$(games[2])")
    private String getArrEl;
    @RequestMapping(value = "/config")
    public Map configMap() {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("name", name);
        map.put("game_name", gameName);
        map.put("getArrEl", getArrEl);
        return map;
    }
}

  • 啟動類
/**
 * @author wangxin
 * @date 2020/1/11 17:58
 * @description: TODO
 * GOOD LUCK儿礼!
 */
@SpringBootApplication
public class ApplicationRun {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationRun.class, args);
    }
}

Application啟動類要放在最外側,要在所有的子包外面
Spring-boot 會自動加載啟動類所在包下及其子包下的所有組件

  • 輸出

game_name "wow"
name "和平精英"
getArrEl "ps4"

Environment獲取配置文件信息

  • 注入Environment
    @Autowired
    private Environment env;
  • 通過Environment.getProperty獲取配置文件信息
 @RequestMapping(value = "/config", method = RequestMethod.GET)
    public Map configMap() {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("name", name);
        map.put("game_name", gameName);
        map.put("getArrEl", getArrEl);
        return map;
    }

@ConfigurationProperties注解

  • Springboot官方使用的配置server:port
  1. 創(chuàng)建配置類
    Game.java
package com.probuing.sb_config.configbean;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author wangxin
 * @date 2020/1/11 18:45
 * @description: TODO
 * GOOD LUCK庆寺!
 * Game配置類
 */
@Configuration
@ConfigurationProperties(prefix = "game")
@Data
public class GameConfig {
    private String name;
    private String age;

}

  • 使用配置類
 //配置類注入
    @Autowired
    private GameConfig gameConfig;
    @RequestMapping(value = "/configConfig")
    public String configureConfig() {
        String config = gameConfig.getName() + gameConfig.getAge();
        return config;
    }

注解解釋

SpringBoot 自動配置的原理

我們了解了SpringBoot能夠使得無比繁雜的工程變的簡單蚊夫,并且讓很多繁雜的配置都消失了,我們來探究一下Spring是如何做到的
我們先從SpringBoot的啟動類開始:
Spring的啟動類中包括@SpringBootApplication 注解懦尝,和SpringApplication.run方法
我們跟進@SpringBootApplication注解中


image.png

我們看到這里重點的注解有三個:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

我們繼續(xù)看@SpringBootConfiguration源碼

image.png

在這個源碼中 我們看到了@Configuration注解知纷,這個注解的作用就是聲明當前類是一個配置類,然后Spring會自動掃描到添加了@Configuration的類陵霉,會讀取其中的配置信息屈扎。@SpringBootConfiguration是來聲明當前類是SpringBoot應用的配置類,項目中只能有一個撩匕。 @EnableAutoConfiguration這個注解的作用是告訴SpringBoot基于所添加的依賴鹰晨,去了解如何配置Spring。就是這個注解幫我們完成了默認的配置,所以模蜡,我們使用SpringBoot構建一個項目漠趁,只需要引入所需框架的依賴,默認配置就可以交給SpringBoot處理了 比如我們添加了spring-boot-start-web`忍疾,而這個啟動器中幫我們添加了tomcat闯传、SpringMVC的依賴,此時Spring自動配置就知道需要開發(fā)一個web應用卤妒,然后就完成了SpringMVC的配置了
SpringBoot內(nèi)部對大量的第三方庫或Spring內(nèi)部庫進行了默認配置甥绿,這些配置是否生效,取決于我們是否引入了對應庫所需的依賴则披,如果有所需的對應的依賴那么默認配置就會生效共缕。
所以,我們使用SpringBoot構建一個項目士复,只需要引入所需框架的依賴图谷,配置就可以交給SpringBoot處理了,如果不希望使用默認配置阱洪,則可以通過自定義配置進行配置

@ComponentScan 這個是配置組件掃描的指令便贵,提供了類似與<context:component-scan>標簽的作用

image.png

這里看到通過basePackageClasses屬性來指定要掃描的包,而我們的@SpringBootApplication注解聲明的類就是main函數(shù)所在的啟動類冗荸,因此掃描的包是該類所在包及其子包承璃,因此,一般啟動類會放在一個比較前的包目錄中

SpringBoot默認配置原理

在SpringApplication類構建的時候蚌本,我們可以看到這樣一段初始化代碼


image.png

進入setInitializers中


image.png

這里可以看到 通過SpringFactoriesLoader.loadFactoryNames(type, classLoader)加載一些FactoryName,然后利用createSpringFactoiesInstance將這些加載到的類名進行實例化
然后繼續(xù)跟進loadFactoryNames方法:
image.png

可以看到利用類加載器加載某個文件:

    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

我們可以發(fā)現(xiàn)SpringBoot會在初始化的時候绸硕,加載所有classpath:META-INF/spring.factories文件,包括jar包當中魂毁。我們看到在Spring的一個依賴包:spring-boot-autoconfigure中玻佩,就可以看到這樣的文件spring.factories
以后我們引入的任何第三方容器,只要實現(xiàn)自動配置席楚,都會有類似的文件

自動配置總結

SprongBoot為我們提供了默認配置咬崔,而默認配置生效的步驟:

  1. @EnableAutoConfiguration注解會去尋找META-INF/spring.factories文件,讀取其中以EnableAutoConfiguration為key的所有類的名稱烦秩,這些類就是提前寫好的自動配置類
  2. 這些配置類都聲明了@Configuration注解垮斯,并且通過@Bean注解提前配置了我們所需要的一切實例。完成自動配置
  3. 會有@Conditionalon注解只祠,來決定配置是否會生效兜蠕,如果我們自己配置了相關Bean,那么就會覆蓋默認的自動配置的Bean
  4. 我們還可以通過配置application.properties文件抛寝,來覆蓋自動配置中的屬性
  • 啟動器:
    我們?nèi)绻幌肱渲茫恍枰胍蕾嚰纯晒瘐铮蕾嚨陌姹疚覀円矡o需關心,只要引入了SpringBoot提供的starter川陆,就會自動管理依賴及版本了
  • 全局配置:
    SpringBoot的默認配置,都會讀取默認屬性鳞绕,這些屬性可以通過自定義application.properties文件來進行覆蓋。這樣雖然使用的還是默認配置尸曼,但是配置中的值以及改成了我們自定義的
    當我們需要自定義屬性時们何,就需要覆蓋application.properties指定key來覆蓋

SpringBoot實戰(zhàn)

整合Mybatis

引入依賴

  • 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">
    <parent>
        <artifactId>SpringBoot</artifactId>
        <groupId>com.probuing</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springboot_mybatis</artifactId>
    <dependencies>
        <!--起步依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--jdbc應用于事務管理-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--mysql數(shù)據(jù)庫驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>
  • 啟動類 SpringBootMybatisRunner.java
/**
 * @author wangxin
 * @date 2020/1/11 20:27
 * @description: TODO
 * GOOD LUCK楷扬!
 */
@SpringBootApplication
public class SpringBootMybatisRunner {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMybatisRunner.class, args);
    }
}
  • 數(shù)據(jù)庫表
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(100) DEFAULT NULL COMMENT '密碼',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` int(10) DEFAULT NULL COMMENT '年齡',
  `sex` tinyint(1) DEFAULT NULL COMMENT '性別烘苹,1男性,2女性',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `note` varchar(255) DEFAULT NULL COMMENT '備注',
  `created` datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
  `updated` datetime DEFAULT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'zhangsan1', '1234567', '張三', '25', '1', '1964-08-08', '張三同學在學Java', '2014-09-19 16:56:04', '2014-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', 'lisi11', '123456777', '李四', '21', '1', '1995-01-01', '李四同學在傳智學Java', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '1', '1994-01-01', '王五同學在學php', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '張偉', '20', '1', '1996-09-01', '張偉同學在傳智播客學Java', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '0', '1988-01-01', '李娜同學在傳智播客學Java', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'lilei', '123456', '李磊', '23', '1', '1993-08-08', '李磊同學在傳智播客學Java', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('7', 'hanmeimei', '123456', '韓梅梅', '24', '0', '1992-08-08', '韓梅梅同學在傳智播客學php', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('8', 'liuyan', '123456', '柳巖', '21', '0', '1995-08-08', '柳巖同學在傳智播客學表演', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('9', 'liuyifei', '123456', '劉亦菲', '18', '0', '1998-08-08', '劉亦菲同學在傳智播客學唱歌', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('10', 'fanbingbing', '123456', '范冰冰', '25', '0', '1991-08-08', '范冰冰同學在傳智播客學表演', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('11', 'zhengshuang', '123456', '鄭爽', '23', '0', '1993-08-08', '鄭爽同學在傳智播客學習如何裝純', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('12', 'tangyan', '123456', '唐嫣', '26', '0', '1990-08-08', '鄭爽同學在傳智播客學習如何耍酷', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
  • 實體類 User.java
@Data
public class User {

    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private Integer sex;
    private Date birthday;
    private String note;
    private Date created;
    private Date updated;
}
  • dao層
public interface IUserDao {

    //根據(jù)id進行查詢
    User findById(Long id);
}

  • 映射文件 mapper.xml


    image.png

    這里mapper的路徑為自定義路徑

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.probuing.sb.dao.IUserDao">

    <resultMap id="baseResultMap" type="User">
        <id column="id" property="id"></id>
        <result column="user_name" property="userName"></result>
        <result column="password" property="password"></result>
        <result column="name" property="name"></result>
        <result column="age" property="age"></result>
        <result column="sex" property="sex"></result>
        <result column="birthday" property="birthday"></result>
        <result column="note" property="note"></result>
        <result column="created" property="created"></result>
        <result column="updated" property="updated"></result>
    </resultMap>
    <select id="findById" parameterType="long" resultMap="baseResultMap">
        SELECT * FROM tb_user WHERE id = #{id}
    </select>
</mapper>
  • 配置文件application.yml

# 服務器地址
server:
  port: 8099
#數(shù)據(jù)庫連接:
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///springboot
    username: root
    password: xml123xml

#mybatis掃描:
mybatis:
  mapper-locations: classpath:mappers/*.xml
  type-aliases-package: com.probuing.sb.domain
  • service層
    IUserService.java
public interface UserService {

    User findById(Long id);
}

實現(xiàn)類
IUserServiceImpl.java

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserDao userDao;

    @Override
    public User findById(Long id) {
        return userDao.findById(id);
    }
}
  • Controller
@RestController
public class UserController {

    @Autowired
    private IUserService userService;
    @RequestMapping(value = "/toUpdate/{id}")
    public User toUpdate(@PathVariable Long id) {//@PathVariable 表示取路徑上的變量
        return userService.findById(id);
    }
}
  • 啟動類 啟動時需要掃描dao
@SpringBootApplication
@MapperScan("cn.itcast.dao")   //掃描dao
public class MybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisApplication.class, args);
    }
}

注意

  • 映射文件的路徑和接口IUserDao的路徑不一致惰说,在配置文件application.yml中吆视,配置了mybatis的掃描
  • 在啟動類中添加MapperScan掃描dao

整合通用Mapper

我們在開發(fā)中發(fā)現(xiàn),dao層的技術您觉,都是通用的琳水,所以我們可以引入通用Mapper來實現(xiàn)減少映射文件mapper的編寫

  • maven坐標 添加依賴
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        
        <!-- 通用mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
  • 配置文件
    application.yml
server:
  port: 8091

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///springboot
    username: root
    password: xml123xml
  • 實體類
    User.java
package com.probuing.sb_mapper.domain;

import lombok.Data;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Data
@Table(name = "tb_user")
public class User {
    @Id
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private Integer sex;
    private Date birthday;
    private String note;
    private Date created;
    private Date updated;
}

注意
實體類中:

  • 要有表對應 使用@Table(name=表明)指定實體類對應的表名
  • 實體類中要有主鍵對應擎宝,使用@Id定義在屬性上表明定義的屬性映射主鍵
  • dao層
    創(chuàng)建一個空的Dao接口 繼承Mapper
    注意:這里導入的包是 tk.mybatis.mapper.common.Mapper
    IUserDao.java
public interface IUSerDao extends Mapper<User> {
}
  • service層
    IUserService.java
public interface IUserService {
    User findById(Long id);
}

實現(xiàn)類
UserServiceImpl.java

@Service
public class UserServiceImpl implements IUserService {
    //注入IUserDao
    @Autowired
    private IUSerDao iuSerDao;

    public User findById(Long id) {
        return iuSerDao.selectByPrimaryKey(id);
    }
}

注意
這里Service的實現(xiàn)類中的dao已經(jīng)繼承了各種dao方法 包括select update insert delete 和條件的example

  • Controller層
    UserController.java
@RestController
public class UserController {
    @Autowired
    private IUserService userService;

    //    @RequestMapping(value = "/findUser/{id}")
    @GetMapping(value = "/findUser/{id}")
    public User findUser(@PathVariable("id") Long id) {
        return userService.findById(id);
    }
}

注意
這里的Controller的RequestMapping中,寫法:
@RequestMapping(value="/findUser/{id}",method=RequestMethod.GET)等價于
@GetMapping("/findUser/{id}")

  • 啟動類(需要掃描dao)
    ApplicationMapperRunner.java
    注意
    這里的MapperScan引入的包一定是tk包下的
@SpringBootApplication
@MapperScan("com.probuing.dao")
public class ApplicationRunner {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationRunner.class, args);
    }
}

  • 測試
    通過Mapper自定義接口實現(xiàn)查詢
    IUserDao.java
public interface IUSerDao extends Mapper<User> {
    @Select("SELECT * FROM tb_user where user_name = #{userName}")
    User selectByUserName(String userName);
}
  • 通過Example條件查詢
 @Test
    public void findUserNameExample() {
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("userName", "lina");
        List<User> list = userDao.selectByExample(example);
        for (User user : list) {
            System.out.println(user.toString());
        }
    }

SpringBoot整合mybatisPlus

Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變极阅,為簡化開發(fā)涨享、提高效率而生

引入依賴

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

    <groupId>cn.itcast</groupId>
    <artifactId>springboot_plus</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <!--管理事務厕隧,@Transtional-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>


        <!-- mybatis plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
  • 配置文件
    application.yml
server:
  port: 8092

#數(shù)據(jù)庫連接:
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///springboot
    username: root
    password: xml123xml
  • 實體類
    User.java
package com.probuing.mp.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.util.Date;

/**
 * @author wangxin
 * @date 2020/1/12 00:19
 * @description: TODO
 * GOOD LUCK髓迎!
 */
@Data
@TableName(value = "tb_user")
public class User {

    @TableId(type = IdType.AUTO)//表示自增 UUID表示UUID
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private Integer sex;
    private Date birthday;
    private String note;
    private Date created;
    private Date updated;
}

注意
實體類中必須定義表名(TableName)建丧,定義主鍵(TableId)

  • dao層
    IUserDao.java
public interface IUserDao extends BaseMapper<User> {
}

注意
mybatisPlus提供的是BaseMapper

  • service層
    IUserService.java
@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    private IUserDao userDao;
    public User findById(Long id) {
        return userDao.selectById(id);
    }
}

注意
MybatisPlus 提供的是selectById

  • Controller
    UserController.java
@RestController
public class UserController {
    @Autowired
    private IUserService userService;

    @GetMapping(value = "/findById/{id}")
    public User findById(@PathVariable("id") Long id) {
        return userService.findById(id);
    }
}
  • 啟動類掃描
    ApplicaitonMPRunner.java
@SpringBootApplication
@MapperScan("com.probuing.mp.dao")
public class ApplicationMPRunner {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationMPRunner.class, args);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翎朱,一起剝皮案震驚了整個濱河市拴曲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竞川,老刑警劉巖蕉汪,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件者疤,死亡現(xiàn)場離奇詭異驹马,居然都是意外死亡除秀,警方通過查閱死者的電腦和手機册踩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門效拭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缎患,“玉大人挤渔,你說我怎么就攤上這事〖蹈福” “怎么了眼刃?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵鸟整,是天一觀的道長篮条。 經(jīng)常有香客問我吩抓,道長疹娶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任钳垮,我火速辦了婚禮额港,結果婚禮上,老公的妹妹穿的比我還像新娘肚医。我一直安慰自己肠套,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布瓷耙。 她就那樣靜靜地躺著刁赖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪落追。 梳的紋絲不亂的頭發(fā)上涯肩,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天病苗,我揣著相機與錄音硫朦,去河邊找鬼。 笑死泽裳,一個胖子當著我的面吹牛涮总,可吹牛的內(nèi)容都是我干的祷舀。 我是一名探鬼主播裳扯,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼饰豺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狡门?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤凤跑,失蹤者是張志新(化名)和其女友劉穎仔引,沒想到半個月后咖耘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撬码,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡呜笑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年叫胁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片微谓。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡豺型,死狀恐怖触创,靈堂內(nèi)的尸體忽然破棺而出为牍,到底是詐尸還是另有隱情碉咆,我是刑警寧澤蛀恩,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布双谆,位于F島的核電站,受9級特大地震影響谓厘,放射性物質發(fā)生泄漏竟稳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诊笤。 院中可真熱鬧讨跟,春花似錦、人聲如沸止喷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咳胃。三九已至展懈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冻记,已是汗流浹背冗栗。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钠至,地道東北人棕洋。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓掰盘,卻偏偏與公主長得像赞季,于是被迫代替她去往敵國和親申钩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 參考引用: https://www.nosuchfield.com/2017/10/15/Spring-Boot-...
    沉淪2014閱讀 425評論 0 1
  • springboot 概述 SpringBoot能夠快速開發(fā),簡化部署禾进,適用于微服務 參考嘟嘟大神SpringBo...
    一紙硯白閱讀 5,403評論 2 20
  • SpringBoot基礎 學習目標: 能夠理解Spring的優(yōu)缺點 能夠理解SpringBoot的特點 能夠理解S...
    dwwl閱讀 5,444評論 4 81
  • 1、做了讀書會的宣傳海報狐蜕,很有成就感层释。第一次趕時間的小嘗試,下次還想能夠做得更加靈動一些廉白。 2蒙秒、準備逐字稿宵统,很踏實...
    星空夢旅人Beverly閱讀 63評論 0 0
  • 玉瀾堂是一個四合院建筑马澈,東接仁壽殿痊班,西臨昆明湖,由玉瀾堂馒胆、霞芬室和藕香榭組成凝果,向北連廊串起夕佳樓和宜蕓館器净,...
    博物館學文化閱讀 1,872評論 0 2