盡覽Springboot從入門到精通的泣血心酸

一、基礎理論 

1、產生背景
    SSM開發web應用配置複雜,springboot極大地簡化了配置,讓開發人員更多關注與業務邏輯的實現。

2、Springboot特性
    A。能夠快速創建基於spring的應用程序。
    B。java main方法可啓動內嵌的tomcat服務器來運行springboot程序,不需要部署war包文件。
    C。起步依賴簡化maven配置。
    D。根據maven依賴自動配置spring、springmvc。
    E。完全棄用XML配置,採用註解配置。

3、Springboot四大核心
    自動配置:自動配置spring、springmvc。
    起步依賴:起簡化maven配置。
    Actutor:健康檢查,檢測程序運行狀況,一般用不到。
    命令化界面:一般也用不到。

    一般只用得到前兩種。

4、springboot零碎知識點
resources目錄下:
    static:存放圖片、js、cs等靜態資源。
    templates:存放前端模板。
    application.properties:springboot核心配置文件。

  SpringBootApplication:
        springboot項目入口類中的核心註解,沒有該註解,該入口類就是普通的java類。
    注意:
        springboot項目的所有代碼類必須在入口類同級或下一級的目錄位置。

5、springboot核心配置文件
    可以是*.properties文件,也可以是*.yml(*.ymal)文件,都是鍵值對形式
    兩個同時存在,以*.properties爲準
    *.yml雖然也是鍵值對形式,但是書寫格式還是有不同的,用到的時候百度
    配置文件常用做法:
        application-dev.properties:開發環境配置文件
        application-tes.properties:測試環境配置文件
        application-pro.properties:生產環境配置文件
        然後在application.properties中設置:
            spring.profiles.active=dev   //表明當前生效的是開發環境的配置文件

6、自定義配置
A、將自定義配置映射到屬性
aplication.properties中:
    #自定義配置,將配置的屬性自動注入到屬性中
    name=lily
    age=18
代碼中:
    @Value("${name}")  //自動注入配置文件的中name的值
    private String name;
    @Value("${age}") //自動注入配置文件的中age的值
    private  int age;

    //獲取自動注入的屬性值,打印在前臺
    @RequestMapping(value="intro")
    @ResponseBody
    public String intro(){
        return "I'm "+name+","+age+" years old!!";
    }
    
B、將自定義配置映射到對象
aplication.properties中:
    #自定義配置,將配置的對象屬性自動注入到屬性中
    school.name=CAUC
    school.address=Tianjin
對應配置類:
    @Component  //將此類交給Spring容器進行管理,方便諸如對象
    @ConfigurationProperties(prefix = "school") //本類只讀取配置文件中前綴爲school的屬性
    public class School {
        private String name;
        private String address;

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAddress() {
        return address;
        }
        public void setAddress(String address) {
        this.address = address;
        }
}
代碼中:
    @Autowired //自動注入對象
    private School school;

    //獲取自動注入的對象的屬性值,打印在前臺
    @RequestMapping(value="intro2")
    @ResponseBody
    public String intro2(){
        return school.getName()+" is a university in "+school.getAddress();
    } 



7、注意事項
ConfigurationProperties警告:
    
    在使用@ConfigurationProperties註解時,會報一個警告:
        Spring Boot Configuration Annotation Processor not Configured。算該警告不影響運行,但看着煩,如何解決??
    解決方式,在pom.xml文件中添加如下依賴即可:
        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
         </dependency>


application.properties中文亂碼問題 :
    見圖片A

二、Springboot集成jsp

1、前置設置:
  main-->new-->directory-->webapp(創建web資源文件夾)
  file-->project structure-->modules-->找到該項目-->web-->將剛剛創建的webapp設置爲web資源文件路徑
    具體見圖B 

2、添加jsp依賴
        <!--引入springboot內嵌tomcat對jsp的解析依賴,不引入不能解析jsp-->
        <!--如果要使用jstl\el還需要引入其他的依賴纔行-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

3、指定jsp編譯文件路徑
在<build>標籤中添加:
        <!--執行jsp文件編譯路徑-->
        <resources>
            <resource>
                <!--源文件夾-->
                <directory>src/main/webapp</directory>
                <!--目標文件夾-->
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <!--源文件夾所有內容均要被編譯-->
                    <include>*.*</include>
                </includes>
            </resource>
        </resources>

4、設置SpringMC的視圖解析器
aplication.properties中:
    #配置springmvc的視圖解析器
    spring.mvc.view.prefix=/
    spring.mvc.view.suffix=.jsp
webapp/show1.jsp文件:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>show1.jsp</title>
    </head>
    <body>
        <H1>${message}</H1>
    </body>
webapp/show2.jsp文件:
    </html>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>show2.jsp</title>
    </head>
    <body>
        <H1>${message}</H1>
    </body>
    </html>
代碼中:
    /*
    視圖解析器
     */
    @RequestMapping(value="show1")
    public ModelAndView show1(){//ModelAndView可以返回一個jsp頁面,且可用來設置jsp內容
        ModelAndView model=new ModelAndView();
        model.addObject("message","hello,springboot");
        model.setViewName("show1");
        return model;
    }
    @RequestMapping(value="show2")
    public String show2(Model model){
        model.addAttribute("message","hello2,springboot");
        return "show2";
    }


三、springboot集成mybatis

1、修改pom.xml文件
        <!--集成mybatis,需要添加mysql依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--springboot集成mybatis的起步依賴,版本號自己加-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

2、利用mybatis的逆向工程對單表生成實體bean、映射文件、mapper接口
在項目根目錄新建文件GeneratorMapper.xml,添加如下內容:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!--dtd文件報紅沒關係-->
<generatorConfiguration>


    <!-- 指定連接數據庫的JDBC驅動包所在位置,指定到你本機的完整路徑 -->
    <classPathEntry location="G:\SoftwareInstall\maven\apache-maven-3.3.9\repository\mysql-connector-java-5.1.38.jar"/>

    <!-- 配置table表信息內容體,targetRuntime指定採用MyBatis3的版本 -->
    <context id="tables" targetRuntime="MyBatis3">
    <!-- 抑制生成註釋,由於生成的註釋都是英文的,可以不讓它生成 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 配置數據庫連接信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/d_student"
                        userId="root"
                        password="123456">
        </jdbcConnection>
    <!--三個重要的生成器-->
        <!-- 生成model類(實體類),targetPackage指定model類的包名, targetProject指定生成的model放在eclipse的哪個工程下面-->
        <javaModelGenerator targetPackage="com.farben.springboot.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="false" />
        </javaModelGenerator>

        <!-- 生成MyBatis的Mapper.xml文件,targetPackage指定mapper.xml文件的包名, targetProject指定生成的mapper.xml放在eclipse的哪個工程下面 -->
        <sqlMapGenerator targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- 生成MyBatis的Mapper接口類文件,targetPackage指定Mapper接口類的包名, targetProject指定生成的Mapper接口放在eclipse的哪個工程下面 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!--表名和實體類名 -->
        <table tableName="t_student"
               domainObjectName="Student"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"/>
        </context>
</generatorConfiguration>

在pom.xml文件中添加插件依賴:
            <!--mybatis逆向工程需要的插件:自動生成代碼-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!--配置文件的位置-->
                    <configurationFile>GeneratorMapper.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>

3、配置完成後在maven的plugins中找到mybatis-generator:generate並雙擊,即可生成實體類、映射文件和mapper接口。
        見圖3.1
   


4、生成的實體bean、mapper接口和映射文件
實體bean:
import java.util.Date;
public class Student {
    private Integer sid;
    private String sname;
    private Date sage;
    private String ssex;
    public Integer getSid() {return sid;}
    public void setSid(Integer sid) {this.sid = sid; }
    public String getSname() {return sname;}
    public void setSname(String sname) {this.sname = sname;}
    public Date getSage() {return sage;}
    public void setSage(Date sage) {this.sage = sage;}
    public String getSsex() { return ssex;}
    public void setSsex(String ssex) {this.ssex = ssex;}
}

mapper接口:
public interface StudentMapper {
    int deleteByPrimaryKey(Integer sid);

    /**
     * 傳入對象進行
     *  修改和選擇性修改
     * 
     * @param record
     * @return
     */
    int insert(Student record);
    int insertSelective(Student record);

    Student selectByPrimaryKey(Integer sid);

    /**
     * 傳入對象進行
     *      更新和選擇性更新
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(Student record);
    int updateByPrimaryKey(Student record);
}


映射文件StudentMapper.xml:

<?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.farben.springboot.mapper.StudentMapper">
  <!--
      數據庫與實體類映射關係
      resultMap:
          1、數據庫字段與實體類屬性不一致,可以轉換
          2、查詢結果不對應表時,可以映射出一個結果集(比如多表聯查)
  -->
  <resultMap id="BaseResultMap" type="com.farben.springboot.model.Student">
    <!--
        id爲主鍵,result爲主鍵外其他字段
        column:數據庫字段
        jdbcType:數據庫字段類型,可不寫
        property:對應的實體類屬性
       注意:如果mysql中字段爲多個單詞,則必須使用“_”連接,這樣生成的實體類字段以駝峯原則命名
    -->
    <id column="sid" jdbcType="INTEGER" property="sid" />
    <result column="sname" jdbcType="VARCHAR" property="sname" />
    <result column="sage" jdbcType="DATE" property="sage" />
    <result column="ssex" jdbcType="CHAR" property="ssex" />
  </resultMap>
  <!--公共的sql片段-->
  <sql id="Base_Column_List">
    sid, sname, sage, ssex
  </sql>
  <!--
      通過主鍵查詢
      id:方法名
      parameterType:參數類型,可不寫
      resultMap:返回值類型
  -->
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from t_student
    where sid = #{sid,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from t_student
    where sid = #{sid,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.farben.springboot.model.Student">
    insert into t_student (sid, sname, sage, 
      ssex)
    values (#{sid,jdbcType=INTEGER}, #{sname,jdbcType=VARCHAR}, #{sage,jdbcType=DATE}, 
      #{ssex,jdbcType=CHAR})
  </insert>
  <!--
      選擇性插入,可以控制哪些字段有值,哪些沒值
      prefix:前綴
      suffix:後綴
      suffixOverrides:去除多餘逗號
  -->
  <insert id="insertSelective" parameterType="com.farben.springboot.model.Student">
    insert into t_student
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="sid != null">
        sid,
      </if>
      <if test="sname != null">
        sname,
      </if>
      <if test="sage != null">
        sage,
      </if>
      <if test="ssex != null">
        ssex,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="sid != null">
        #{sid,jdbcType=INTEGER},
      </if>
      <if test="sname != null">
        #{sname,jdbcType=VARCHAR},
      </if>
      <if test="sage != null">
        #{sage,jdbcType=DATE},
      </if>
      <if test="ssex != null">
        #{ssex,jdbcType=CHAR},
      </if>
    </trim>
  </insert>
  <!--
    選擇性更新,可以控制哪些字段有值,哪些沒值
    prefix:前綴
    suffix:後綴
    suffixOverrides:去除多餘逗號
-->
  <update id="updateByPrimaryKeySelective" parameterType="com.farben.springboot.model.Student">
    update t_student
    <set>
      <if test="sname != null">
        sname = #{sname,jdbcType=VARCHAR},
      </if>
      <if test="sage != null">
        sage = #{sage,jdbcType=DATE},
      </if>
      <if test="ssex != null">
        ssex = #{ssex,jdbcType=CHAR},
      </if>
    </set>
    where sid = #{sid,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.farben.springboot.model.Student">
    update t_student
    set sname = #{sname,jdbcType=VARCHAR},
      sage = #{sage,jdbcType=DATE},
      ssex = #{ssex,jdbcType=CHAR}
    where sid = #{sid,jdbcType=INTEGER}
  </update>
</mapper>


5、注意事項
    在java文件夾只能編譯java文件,而mapper包下的mapper映射文件是配置文件,無法編譯!

解決方案一:在pom.xml文件中的<build>標籤的子標籤<resources>標籤中添加:
            <!--
                java文件下只編譯java文件,無法編譯mapper包下的xml映射文件,這兒將其定義爲資源文件夾就行
            -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <!--
                    **代表子文件夾
                    **.*.xml代表子文件夾下的以xml結尾的文件
                    -->
                    <include>**/*.xml</include>
                </includes>
            </resource>


解決方案二:
    在項目的resources下新建mapper文件夾並剪切移入所有的映射文件
    然後再*.properties中配置:
         mybatis.mapper-locations=classpath:mapper/*.xml
    

兩種方式都很常用

四、SpringBoot集成Mybatis示例 

1、pom.xml文件

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.farben.unit</groupId>
    <artifactId>springunit</artifactId>
    <version>0.0.1-SNAPSHOT</version>


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

    <dependencies>
        <!--springboot web項目起步依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--springboot web項目測試起步依賴,沒什麼用-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--
            以下依賴均爲手動添加
        -->

        <!--解決@ConfigurationProperties註解報警告的依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!--引入springboot內嵌tomcat對jsp的解析依賴,不引入不能解析jsp-->
        <!--如果要使用jstl\el還需要引入其他的依賴纔行-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <!--集成mybatis,需要添加mysql依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--springboot集成mybatis的起步依賴-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <!--
                java文件下只編譯java文件,無法編譯mapper包下的xml映射文件,這兒將其定義爲資源文件夾就行
            -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <!--
                    **代表子文件夾
                    **.*.xml代表子文件夾下的以xml結尾的文件
                    -->
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <!--執行jsp文件編譯路徑-->
            <resource>
                <!--源文件夾-->
                <directory>src/main/webapp</directory>
                <!--目標文件夾-->
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <!--源文件夾所有內容均要被編譯-->
                    <include>*.*</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <!--編譯打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--mybatis逆向工程需要的插件:自動生成代碼-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!--配置文件的位置-->
                    <configurationFile>GeneratorMapper.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2、application.properties文件

#給內置tomcat配置端口
server.port=8090

#設置上下文根,訪問servlet別名前需加/s
server.servlet.context-path=/s

#配置數據庫連接   mysql8的驅動名稱變了,是com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/d_student?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

3、GeneratorMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>


    <!-- 指定連接數據庫的JDBC驅動包所在位置,指定到你本機的完整路徑 -->
    <classPathEntry location="G:\SoftwareInstall\maven\apache-maven-3.3.9\repository\mysql-connector-java-5.1.38.jar"/>

    <!-- 配置table表信息內容體,targetRuntime指定採用MyBatis3的版本 -->
    <context id="tables" targetRuntime="MyBatis3">
    <!-- 抑制生成註釋,由於生成的註釋都是英文的,可以不讓它生成 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 配置數據庫連接信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/d_student"
                        userId="root"
                        password="123456">
        </jdbcConnection>
    <!--三個重要的生成器-->
        <!-- 生成model類(實體類),targetPackage指定model類的包名, targetProject指定生成的model放在eclipse的哪個工程下面-->
        <javaModelGenerator targetPackage="com.farben.springboot.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="false" />
        </javaModelGenerator>

        <!-- 生成MyBatis的Mapper.xml文件,targetPackage指定mapper.xml文件的包名, targetProject指定生成的mapper.xml放在eclipse的哪個工程下面 -->
        <sqlMapGenerator targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- 生成MyBatis的Mapper接口類文件,targetPackage指定Mapper接口類的包名, targetProject指定生成的Mapper接口放在eclipse的哪個工程下面 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!--表名和實體類名 -->
        <table tableName="t_student"
               domainObjectName="Student"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"/>
        </context>
</generatorConfiguration>

4、代碼

控制層Controller

@Controller
public class StudentController {

    @Autowired  //注入service層對象
    private StudentService service;

    @RequestMapping(value="stu")
    @ResponseBody
    public Object getOneStudent(Integer id){
        Student student=service.getStudentById(id);
        return student;
    }
}


業務層service

public interface StudentService {
    Student getStudentById(Integer id);
}

@Service //掃描service到spring容器,便於自動注入對象
public class StudentServiceImpl implements StudentService {

    @Autowired  //自動注入mapper層對象
    private StudentMapper mapper;

    @Override
    public Student getStudentById(Integer id) {
        return mapper.selectByPrimaryKey(id);
    }
}


model層:自動生成

mapper層:自動生成

只是mapper接口需要添加@Mapper註解即可
如下圖:
    @Mapper  //掃描mapper接口到spring容器,便於自動注入對象
    public interface StudentMapper {
        int deleteByPrimaryKey(Integer sid);
        int insert(Student record);
        int insertSelective(Student record);
        Student selectByPrimaryKey(Integer sid);
        int updateByPrimaryKeySelective(Student record);
        int updateByPrimaryKey(Student record);
    }

注意:
    mapper層註解卸載接口上,service層註解卸載實現類上。



注意事項:
    如果是多表查詢,則必然有多個mapper接口,每個mapper接口都手動添加@Mapper註解,很繁瑣
    
解決:
    所有mapper接口均不需要添加@Mapper註解
    改爲在springboot啓動入口程序類上添加:
        @MapperScan(basePackages = "com.farben.springboot.mapper")
    指定需要掃描的mapper包的具體路徑,此後該mapper包下所有類都可以使用註解@Autowired自動注入對象。
        
    

5、補充springboot事務

只需要在Service實現類的增刪改方法上增加一個@Transactional註解即可。

注意:
    在springboot2.0版本之前,還需要在入口類上添加@EnableTransactionManagement註解來開啓事務。


示例:

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentMapper mapper;

    @Override
    @Transactional  //  開啓事務並自動提交   10/0失敗,則查詢也會失敗
    public Integer updateByid(Student student) {
        Integer result=mapper.updateByPrimaryKeySelective(student);

        Integer i=10/0;
        return result;
    }



}

五、SpringBoot集成SpringMVC

1、新建好一個springboot項目,其實就集成好了SpringMVC。

2、SpringMVC自定義視圖解析器,見SpringBoot集成JSP。

3、SpringMVC核心註解

@Controller:
    表名該類是控制層,用於處理http請求。
@ResponseBody:
    表名該方法返回一個json字符串。
@RestController:
    表名該controller類下所有方法都返回一個json字符串。

@RequestMapping:
    表名該方法可用來處理GET和post請求。用來給servlet起別名。
@GetMapping:
    表名該方法可用來處理GET請求。用來給servlet起別名。
@PostMapping:
    表名該方法可用來處理POST請求。用來給servlet起別名。

    
注意:
    從瀏覽器地址欄發的請求都是GET請求,要發post請求可以使用postman客戶端。

還有兩個用得不多的註解:
    @DeleteMapping:
        表名該方法可用來處理DELETE請求。用來給servlet起別名。
    @PutMapping:
        表名該方法可用來處理PUT請求。用來給servlet起別名。

六、Springboot實現RESTful

1、RESTful是一種軟件設計風格,一個架構只要符合RESTful原則,責成其爲RESTful架構。
    說白了就是在瀏覽器地址欄以路徑的方式傳參。

2、示例
       訪問一個接口的HTTP地址:http://localhost:8090/s/stu?id=3
       RESTful風格的HTTP地址:http://localhost:8090/s/stu/3

    而在Controller層的servlet方法中:

    /**
     * RESTful
     * 原則一:
     *  新增用PostMapping,刪除用DeleteMapping,修改用PutMapping,查詢用GetMappring
     *  這樣的話如果增刪改都要傳sid和sname參數
     *      當都通過http://localhost:8090/s/stu/info/1/趙雷  訪問,可以通過請求方式加以區別
     *      當然,如果有兩個相同的刪除方法,所需要的參數也一致,則可以調整參數位置加以區別
     *      如下:
     *          stu/info/{sid}/{sname}
     *          stu/{sid}/info/{sname}
     *原則二:
     *  RESTful方式訪問時參數最好都是數據庫表字段,非數據庫表字段用傳統問號拼接即可
     *
     */
    @GetMapping(value="stu/info/{sid}/{sname}")
    @ResponseBody
    public Object getName(@PathVariable("sid") Integer sid,@PathVariable("sname") String sname){
        return "sid:"+sid+"-sname:"+sname;
    }
        

七、Springboot集成Redis

1、在pom.xml中添加redis依賴
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、在*.properties中添加redis配置信息
    spring.redis.host=localhost
    spring.redis.port=6379
    spring.redis.password=123456

3、插入獲取redis數據示例
    見圖11.1、11.2

八、SpringBoot集成Dubbo

1、需要三個modual,一個爲接口工程,一個爲服務提供者,一個爲服務消費者。
    接口工程:存放實體bean和業務接口。
            maven工程:dubbo-interfaces
    服務提供者:存放業務接口的實現類,並將服務註冊到服務中心,調用數據持久層。
            springboot web工程:dubbo-providers
    服務消費者:從註冊中心調用服務提供者提供的服務,來處理瀏覽器發出的請求。 springboot web工程
            springboot web工程:dubbo-consumers

2、配置
A、添加依賴(服務者和消費者都需要添加)
       <!--dubbo集成springboot依賴-->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!--註冊中心,zookeeper-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.11</version>
        </dependency>
        <!--接口工程-->
        <dependency>
            <groupId>com.farben.springboot</groupId>
            <artifactId>dubbo-interfaces</artifactId>
            <version>1.0.0</version>
        </dependency>

B、修改application.properties配置文件
服務提供者:

#內置tomcat端口
server.port=8091   #別和服務消費者一樣
#設置上下文根
server.servlet.context-path=/s

#dubbo的配置
spring.application.name=dubbo-providers
#聲明當前項目是服務提供者
spring.dubbo.server=true
spring.dubbo.registry=zookeeper://127.0.0.1:2181

服務消費者:

#內置tomcat端口
server.port=8090
#設置上下文根
server.servlet.context-path=/s

#dubbo的配置
spring.application.name=dubbo-consumers
#註冊中心
spring.dubbo.registry=zookeeper://127.0.0.1:2181

C、註冊中心
    一般使用zookeeper,可以在windows上搭建一個單節點的即可。
    下載地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
    解壓後,拷貝配置文件爲zoo.cfg,並修改dataDir屬性爲自定義的目錄,然後在bin下情動zkServer.cmd即可。


3、代碼書寫
dubbo-consumers:
Controller:

@Controller
public class StudentController {
    /**
     *  Reference註解是dubbo的註解,別導錯了
     * 表明要從註冊中心引用已經暴露的服務,即StudentService.class
     */
    @Reference(interfaceClass = StudentService.class,version="1.0.0",check=false)
    private StudentService service;

    @RequestMapping(value="dubbo/{id}")
    @ResponseBody
    public Object getOneStudent(@PathVariable("id") Integer id){
        return service.getOneStudent(id);
    }
}


dubbo-interfaces:
Service:
public interface StudentService {
    Object getOneStudent(Integer id);
}


dubbo-providers:
Service.impl

@Component  //將類加入spring容器
//將服務暴露給註冊中心。這是dubbo的註解,別導錯了
@Service(interfaceClass = StudentService.class,version = "1.0.0",timeout = 10000)
//父接口類對象、版本、超時時間
public class StudentServiceImpl implements StudentService {
    @Override
    public Object getOneStudent(Integer id) {
        return 12;
    }
}

3、三個註解
@EnableDubboConfiguration  在服務提供者和服務消費者的入口程序上添加,表明開啓dubbo配置。
@Service   dubbo的註解,別導錯了。在業務接口上添加,將服務暴露給註冊中心。
@Reference dubbo的註解,別導錯了。在控制層上使用表明從註冊中心引用服務。


4、注意事項:
    在dubbo-providers和dubbo-consumers的springboot入口類上都需要加入@EnableDubboConfiguration註解來開啓dubbo的配置
    啓動時zkServer.cmd,再啓動dubbo-providers,最後啓動dubbo-consumers。
    Dubbo要求實體類bean需要實現序列化接口。

九、SpringBoot創建java工程

1、和springboot web工程區別
創建時:勾選web後不要勾選spring web。
創建後:resources下沒有static、templates等靜態資源文件夾,且pom文件在的web工程起步依賴變成了非web工程起步依賴。

2、獲取容器內對象
因爲沒有web工程的依賴,那麼如何獲取通過@Service、@Component等註解加入Spring容器的對象?
有兩種方式,見以下示例:

第一種方式:
@SpringBootApplication
public class SpringbootJavaApplication {

    public static void main(String[] args) {
        /**
         * 入口類啓動後返回一個ConfigurableApplicationContext對象,該對象也是spring的容器
         * 可以通過該對象的getBean("對象所屬類名首字母小寫")來獲取
         * 通過@Service、@Component等註解spring容器對象。        
         */
        ConfigurableApplicationContext cac= SpringApplication.run(SpringbootJavaApplication.class, args);
        StudentServiceImpl service=(StudentServiceImpl) cac.getBean("studentServiceImpl");
        System.out.println(service.welcomeSpringbootJava("welcome to springboot java application!"));

        Student student=(Student) cac.getBean("student");
        student.setSname("張三");
        System.out.println(student.getSname());
    }
}



第二種方式:
@SpringBootApplication
public class SpringbootJava2Application implements CommandLineRunner { //第一步,實現CommandLineRunner接口
 
    //第二步,在注入對象上加入@Autowired註解
    @Autowired
    private StudentService service;
    @Autowired
    private Student student;

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

    @Override
    public void run(String... args) throws Exception { //重寫run方法
        System.out.println(service.welcomeSpringbootJava("welcome to springboot java application!"));

        student.setSname("張三");
        System.out.println(student.getSname());
    }
}



3、其實springboot創建非web應用沒什麼軟用,不如直接創建maven java工程呢。
    所以這一部分僅作了解即可。

十、關閉/修改springboot工程啓動logo

1、關閉logo

直接上代碼
@SpringBootApplication 
public class SpringbootApplication {

    public static void main(String[] args) {
        /**
         * 關閉springboot 啓動logo
         */
        SpringApplication spring=new SpringApplication(SpringbootApplication.class);
        spring.setBannerMode(Banner.Mode.OFF);
        spring.run(args);
    }

}




2、修改logo
A、訪問
    https://www.bootschool.net/ascii
    或
    http://patorjk.com/software/taag/
    
    輸入文字,獲得想要更改的logo圖樣,拷貝下來。

B、在resources文件夾下創建banner.txt文件
    將複製下來的logo拷貝到該文件保存啓動程序即可看到自定義的logo。
    
文件名必須叫banner.txt

十一、Springboot使用攔截器

1、攔截器和過濾器
過濾器攔截的是servlet,而在springmvc之後,只剩下一個公有的servlet,原本的多個servlet已有多個單元
方法替代,而攔截器攔截的就是這些單元方法。

過濾器在servlet之前,而攔截器在servlet之後,單元方法之前。

2、攔截器配置
A、自定義的攔截器類需要實現HandlerInterceptor接口,重寫preHandle方法,在方法中定義攔截器規則。
B、需要一個配置類,配置類使用@Configuration聲明,並實現WebMvcConfigurer接口,重寫
addInterceptors方法,在方法中定義攔截器攔截範圍。

3、代碼示例
model:

@Component
public class User {
    private String name;
    private Integer age;

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



interceptor:

/**
 * 攔截器,定義攔截器規則
 * 實現HandlerInterceptor接口,重寫preHandle
 * 並在preHandle方法中定義
 * session中有user,則返回true。直接訪問
 * 沒有user,則重定向/user/error,返回false
 */
public class UserLoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       User user=(User)request.getSession().getAttribute("user");
       if(user==null){
           response.sendRedirect(request.getContextPath()+"/user/error");
           return false;
       }
        return true;
    }
}



config:

/**
 * 攔截器配置類,定義攔截器攔截範圍
 * addPathPatterns表明攔截的範圍 假設爲爲【1,5】
 * excludePathPatterns表名在要攔截的範圍中排除的範圍 假設爲2,3
 * 則真正攔截範圍爲1,4,5
 *  /user/**  代表只要開頭爲/user,後面隨便是什麼,隨便有多少級子目錄
 *  /user/*   代表只要開頭爲/user,後面隨便是什麼,只有一級子目錄
 */
@Configuration
public class UserConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        String [] addPathPatterns={
                "/user/**"
        };
        String [] excludePathPatterns={
                "/user/login","/user/error"
        };
        registry.addInterceptor(new UserLoginInterceptor()).
                addPathPatterns(addPathPatterns).
                excludePathPatterns(excludePathPatterns);
    }
}



controller:

@Controller
@RequestMapping(value="/user")
public class UserLoginInterceptorTest {

    @Autowired
    private User user;

    //登陸的方法,不登陸也可訪問
    @RequestMapping(value="/login")
    public @ResponseBody String login(HttpServletRequest req){
        req.getSession().setAttribute("user",user);
        return "login succeed!";
    }
    //登陸後才能訪問的方法
    @RequestMapping(value="/center")
    public @ResponseBody String center(){
        return "after login succeed,you can enter the center area!";
    }
    //登陸失敗跳轉的方法,不登陸也可訪問
    @RequestMapping(value="/error")
    public @ResponseBody String error(){
        return "you must login first!!";
    }
}

十二、springboot使用過濾器

1、過濾器配置

第一種方式:
    A、自定義過濾器用@WebFilter(urlPatterns = "過濾路徑") 標註,實現Filter接口,複寫doFilter方法。
    B、入口類用@ServletComponentScan(basePackages = "com.farben.springboot.filter")標準,配置被掃描的過濾器路徑。


第二種方式:
    A、自定義過濾器實現Filter接口,複寫doFilter方法。
    B、自定義配置類,加@Configuration標註,在類中自定義方法,方法中註冊過濾器,添加過濾路徑,並返回這個過濾器。


2、第一種方式代碼
filter:

@WebFilter(urlPatterns = "/user")  //過濾掉“/user”
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("進入自定義過濾器");
        chain.doFilter(request,response);
    }
}


controller:

@Controller
public class MyFilterTest {

    @RequestMapping(value="/user")
    public @ResponseBody String user(){
        return "user info show over!!";
    }

    @RequestMapping(value="/stu")
    public @ResponseBody String stu(){
        return "can't come in filter";
    }
}


入口類:

@SpringBootApplication
@ServletComponentScan(basePackages = "com.farben.springboot.filter")   //servlet掃描路徑
public class SpringbootFilterApplication {

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




3、第二種方式代碼

filter:

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("歡迎進入過濾器");
        chain.doFilter(request,response);
    }
}

配置類config

@Configuration //定義爲配置類
public class MyFilterConfig {

    @Bean
    public FilterRegistrationBean myFilterRegistration(){
        //註冊過濾器
        FilterRegistrationBean myFilter = new FilterRegistrationBean(new MyFilter());
        //添加過濾器路徑
        myFilter.addUrlPatterns("/user");
        return myFilter;
    }
}

controller:

@Controller
public class MyFilterTest {

    @RequestMapping(value="/user")
    public @ResponseBody
    String user(){
        return "user info show over!!";
    }

    @RequestMapping(value="/stu")
    public @ResponseBody String stu(){
        return "can't come in filter";
    }
}

入口類:

@SpringBootApplication
public class SpringbootFilter2Application {

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

}

十三、springboot使用servlet

第一步:
    自定義servlet用@WebServlet標註,實現HttpServlet接口,在doGet或doPost方法中實現servlet邏輯。

第二步(有兩種實現方式):
    第一種:
        入口類用@ServletComponentScan標註。
    第二種:
        自定義配置類,在配置類中配置自定義好的servlet。


注意:
    用得不多,用到再百度即可。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章