SpringBoot與整合其他技術

SpringBoot整合SpringMVC

雖然默認配置已經可以使用SpringMVC了,不過我們有時候需要進行自定義配置。

修改端口

# 映射端口
server.port=80

訪問靜態資源

現在,我們的項目是一個jar工程,那麼就沒有webapp,我們的靜態資源該放哪裏呢?

回顧我們上面看的源碼,有一個叫做ResourceProperties的類,裏面就定義了靜態資源的默認查找路徑:

默認的靜態資源路徑爲:

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public

只要靜態資源放在這些目錄中任何一個,SpringMVC都會幫我們處理。

我們習慣會把靜態資源放在classpath:/static/目錄下。我們創建目錄,並且添加一些靜態資源:

添加攔截器

如果你想要完全自定義SpringMVC,不保留SpringBoot提供的一切特徵,你可以自己定義類並且添加@Configuration註解和@EnableWebMvc註解

首先我們定義一個攔截器:

@Slf4j
public class Myinterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle method is running");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle method is running");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion method is running");
    }
}

然後,我們定義配置類,註冊攔截器:

@Configuration
public class MvcConfig implements WebMvcConfigurer{
    /**
     * 通過@Bean註解,將我們定義的攔截器註冊到Spring容器
     * @return
     */
    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }

    /**
     * 重寫接口中的addInterceptors方法,添加自定義攔截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 通過registry來註冊攔截器,通過addPathPatterns來添加攔截路徑
        registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
    }
}

SpringBoot整合Mybatis

添加Mybatis的起步依賴

<!--mybatis起步依賴-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>

添加數據庫驅動座標

<!-- MySQL連接驅動 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

添加數據庫連接信息

在application.properties中添加數據量的連接信息

#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

創建user表

在test數據庫中創建user表

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '張三');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');

創建實體Bean

public class User {
    // 主鍵
    private Long id;
    // 用戶名
    private String username;
    // 密碼
    private String password;
    // 姓名
    private String name;
  
    //此處省略getter和setter方法 .. ..
    
}

編寫Mapper

@Mapper
public interface UserMapper {
	public List<User> queryUserList();
}

注意:@Mapper標記該類是一個mybatis的mapper接口,可以被spring boot自動掃描到spring上下文中

配置Mapper映射文件

在src\main\resources\mapper路徑下加入UserMapper.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.itheima.mapper.UserMapper">
    <select id="queryUserList" resultType="user">
        select * from user
    </select>
</mapper>

在application.properties中添加mybatis的信息

#spring集成Mybatis環境
#pojo別名掃描包
mybatis.type-aliases-package=com.itheima.domain
#加載Mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

編寫測試Controller

@Controller
public class MapperController {

    @Autowired
    private UserMapper userMapper;

    @RequestMapping("/queryUser")
    @ResponseBody
    public List<User> queryUser(){
        List<User> users = userMapper.queryUserList();
        return users;
    }

}

使用純註解配置

@Mapper
@Component
public interface UserMapper {
}

或者可以

@SpringBootApplication
@MapperScan("cn.xzzz2020.mapper")
public class BootApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class,args);
    }
}

通用Mapper

通用Mapper的作者也爲自己的插件編寫了啓動器,我們直接引入即可:

<!-- 通用mapper -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>

不需要做任何配置就可以使用了。

@Mapper
public interface UserMapper extends tk.mybatis.mapper.common.Mapper<User>{
}

SpringBoot整合Junit

添加Junit的起步依賴

<!--測試的起步依賴-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

編寫測試類

package com.itheima.test;

import com.itheima.MySpringBootApplication;
import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MySpringBootApplication.class)
public class MapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void test() {
        List<User> users = userMapper.queryUserList();
        System.out.println(users);
    }

}

其中,

SpringRunner繼承自SpringJUnit4ClassRunner,使用哪一個Spring提供的測試測試引擎都可以

public final class SpringRunner extends SpringJUnit4ClassRunner 

@SpringBootTest的屬性指定的是引導類的字節碼對象

SpringBoot整合Spring Data JPA

添加Spring Data JPA的起步依賴

<!-- springBoot JPA的起步依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

添加數據庫驅動依賴

<!-- MySQL連接驅動 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

在application.properties中配置數據庫和jpa的相關屬性

#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

#JPA Configuration:
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

創建實體配置實體

@Entity
public class User {
    // 主鍵
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // 用戶名
    private String username;
    // 密碼
    private String password;
    // 姓名
    private String name;
 
    //此處省略setter和getter方法... ...
}

編寫UserRepository

public interface UserRepository extends JpaRepository<User,Long>{
    public List<User> findAll();
}

編寫測試類

@RunWith(SpringRunner.class)
@SpringBootTest(classes=MySpringBootApplication.class)
public class JpaTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void test(){
        List<User> users = userRepository.findAll();
        System.out.println(users);
    }

}

控制檯打印信息

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qlMvOJG5-1584534861827)(img\16.png)]

注意:如果是jdk9,執行報錯如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-odoCRfNc-1584534861828)(img\17.png)]

原因:jdk缺少相應的jar

解決方案:手動導入對應的maven座標,如下:

<!--jdk9需要導入如下座標-->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

SpringBoot整合Redis

添加redis的起步依賴

<!-- 配置使用redis啓動器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置redis的連接信息

#Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379

注入RedisTemplate測試redis操作

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJpaApplication.class)
public class RedisTest {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Test
    public void test() throws JsonProcessingException {
        //從redis緩存中獲得指定的數據
        String userListData = redisTemplate.boundValueOps("user.findAll").get();
        //如果redis中沒有數據的話
        if(null==userListData){
            //查詢數據庫獲得數據
            List<User> all = userRepository.findAll();
            //轉換成json格式字符串
            ObjectMapper om = new ObjectMapper();
            userListData = om.writeValueAsString(all);
            //將數據存儲到redis中,下次在查詢直接從redis中獲得數據,不用在查詢數據庫
            redisTemplate.boundValueOps("user.findAll").set(userListData);
            System.out.println("===============從數據庫獲得數據===============");
        }else{
            System.out.println("===============從redis緩存中獲得數據===============");
        }

        System.out.println(userListData);

    }

}

整合jdbc和事務

spring中的jdbc連接和事務是配置中的重要一環,在SpringBoot中該如何處理呢?

答案是不需要處理,我們只要找到SpringBoot提供的啓動器即可:

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

當然,不要忘了數據庫驅動,SpringBoot並不知道我們用的什麼數據庫,這裏我們選擇MySQL:

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

至於事務,SpringBoot中通過註解來控制。就是我們熟知的@Transactional

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryById(Long id){
        return this.userMapper.selectByPrimaryKey(id);
    }

    @Transactional
    public void deleteById(Long id){
        this.userMapper.deleteByPrimaryKey(id);
    }
}

整合連接池

其實,在剛纔引入jdbc啓動器的時候,SpringBoot已經自動幫我們引入了一個連接池:

HikariCP應該是目前速度最快的連接池了,我們看看它與c3p0的對比:

因此,我們只需要指定連接池參數即可:

# 連接四大參數
spring.datasource.url=jdbc:mysql://localhost:3306/heima
spring.datasource.username=root
spring.datasource.password=123
# 可省略,SpringBoot自動推斷
spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10

當然,如果你更喜歡Druid連接池,也可以使用Druid官方提供的啓動器:

<!-- Druid連接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>

而連接信息的配置與上面是類似的,只不過在連接池特有屬性上,方式略有不同:

#初始化連接數
spring.datasource.druid.initial-size=1
#最小空閒連接
spring.datasource.druid.min-idle=1
#最大活動連接
spring.datasource.druid.max-active=20
#獲取連接時測試是否可用
spring.datasource.druid.test-on-borrow=true
#監控頁面啓動
spring.datasource.druid.stat-view-servlet.allow=true

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