SpringBoot整合MyBatis教程Provider進階(Select)

本教程主要詳細講解SpringBoot整合MyBatis項目高級操作模式,主要使用到@Provider高級模式進行MyBatis整合開發,本文主要講解Select查詢數據操作.

基礎環境


技術 版本
Java 1.8+
SpringBoot 2.x.x
MyBatis 3.5.x

創建項目


  • 初始化項目
mvn archetype:generate -DgroupId=com.edurt.sli.slismps -DartifactId=spring-learn-integration-springboot-mybatis-provider-select -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0.0 -DinteractiveMode=false
  • 修改pom.xml增加MyBatis
<?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>spring-learn-integration-springboot-mybatis-provider</artifactId>
        <groupId>com.edurt.sli</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-learn-integration-springboot-mybatis-provider-select</artifactId>
    <name>SpringBoot整合MyBatis教程Provider進階(Select)</name>

    <properties>
        <system.java.version>1.8</system.java.version>
        <plugin.maven.compiler.version>3.3</plugin.maven.compiler.version>
        <springboot.common.version>2.1.3.RELEASE</springboot.common.version>
        <springboot.mybatis.common.version>2.1.1</springboot.mybatis.common.version>
        <mysql.version>5.1.47</mysql.version>
        <lombox.version>1.18.8</lombox.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${springboot.common.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${springboot.common.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${springboot.mybatis.common.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombox.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${springboot.common.version}</version>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${plugin.maven.compiler.version}</version>
                <configuration>
                    <source>${system.java.version}</source>
                    <target>${system.java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

mybatis-spring-boot-starter:該starter是我們使用SpringBoot整合MyBatis的依賴整合包

  • src/main/java目錄下新建com.edurt.sli.slismps目錄並在該目錄下新建SpringBootMyBatisProviderSelectIntegration類文件,在文件輸入以下內容
package com.edurt.sli.slismps;

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

@SpringBootApplication
@Component(value = "com.edurt.sli.slismps")
public class SpringBootMyBatisProviderSelectIntegration {

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

}

構建SQL文件


src/main目錄下新建example.sql文件,鍵入以下內容

create database spring;

use spring;

drop table if exists user;
create table user
(
    id       int(20) auto_increment,
    userName varchar(20),
    title    varchar(20),
    primary key (id)
)
    default charset 'utf8';

insert into user(userName, title)
VALUES ('1', '1'),
       ('2', '2'),
       ('3', '3'),
       ('4', '4'),
       ('5', '5'),
       ('6', '6'),
       ('7', '7'),
       ('8', '8'),
       ('9', '9');

我們運行該sql文件進行創建數據庫/數據表操作.

配置MyBatis


  • /src/main/java/com/edurt/sli/slismps目錄下創建config目錄,並在該目錄下新建MyBatisProviderConfig配置類,鍵入以下代碼
package com.edurt.sli.slismps.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(value = {"com.edurt.sli.slismps.mapper"})
public class MyBatisProviderConfig {

    @Bean(name = "transactionManager")
    public DataSourceTransactionManager transactionManager(
            @Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "sqlSessionFactory")
    @ConditionalOnMissingBean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }

    @Bean
    ConfigurationCustomizer mybatisConfigurationCustomizer() {
        return configuration -> {
            configuration.setMapUnderscoreToCamelCase(Boolean.TRUE);
            configuration.setLogPrefix("com.edurt.sli.slismps");
        };
    }

}

@MapperScan註解用於指定我們Mapper文件所在的位置

  • /src/main/resources資源目錄下創建一個application.properties的配置文件,用於數據庫連接配置,鍵入以下內容
server.port=8989
spring.datasource.url=jdbc:mysql://localhost:3306/spring?useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456

配置數據模型


  • /src/main/java/com/edurt/sli/slismps目錄下創建model目錄,並在該目錄下新建UserModel實體類,鍵入以下代碼
package com.edurt.sli.slismps.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class UserModel {

    private Integer id;
    private String userName;
    private String title;

}

支持數據Select查詢功能


  • /src/main/java/com/edurt/sli/slismps目錄下創建provider目錄,並在該目錄下新建UserSelectProvider類,用於轉換實體與SQL腳本,鍵入以下代碼
package com.edurt.sli.slismps.provider;

import org.apache.ibatis.jdbc.SQL;

public class UserSelectProvider {

    private String tableName = "user";

    public String selectModel() {
        return new SQL() {{
            SELECT("userName", "title");
            FROM(tableName);
        }}.toString();
    }

}

我們在做數據查詢操作的時候使用的是SELECT,在輸入值中可以輸入任意查詢字段,也可以使用*(不建議使用,會影響性能)

  • /src/main/java/com/edurt/sli/slismps目錄下創建mapper目錄,並在該目錄下新建UserSelectMapper數據表操作映射類,鍵入以下內容
package com.edurt.sli.slismps.mapper;

import com.edurt.sli.slismps.model.UserModel;
import com.edurt.sli.slismps.provider.UserSelectProvider;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.SelectProvider;

import java.util.List;

@Mapper
public interface UserSelectMapper {

    @SelectProvider(type = UserSelectProvider.class, method = "selectModel")
    @Results(id = "userInfo", value = {
            @Result(property = "id", column = "id", id = true),
            @Result(property = "userName", column = "userName"),
            @Result(property = "title", column = "title")
    })
    List<UserModel> selectModel();

}

@SelectProvider標記我們使用高級功能type指定Provider類名,method指定的是該類中要使用的哪一個方法

  • 接下來我們在/src/test/java目錄下新建com.edurt.sli.slismps目錄,並在該目錄下新建UserSelectMapperTest測試文件,鍵入以下內容
package com.edurt.sli.slismps;

import com.edurt.sli.slismps.mapper.UserSelectMapper;
import com.edurt.sli.slismps.model.UserModel;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@SpringBootTest(
        classes = SpringBootMyBatisProviderSelectIntegration.class,
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
public class UserSelectMapperTest {

    @Autowired
    private UserSelectMapper userSelectMapper;

    private UserModel user;

    @Before
    public void before() {
        user = new UserModel();
    }

    @Test
    public void testSelectModel() {
        this.userSelectMapper.selectModel().forEach(System.out::println);
    }

}

注意: 在關聯查詢的時候必須要指定關聯關係的字段

支持WHERE條件篩選查詢


  • 修改UserSelectProvider類在該類中鍵入以下代碼
public String selectModelByWhere(@Param(value = "user") UserModel userModel) {
    return new SQL() {{
        SELECT("userName", "title");
        FROM(tableName);
        WHERE("1=1");
        if (!ObjectUtils.isEmpty(userModel) && !ObjectUtils.isEmpty(userModel.getTitle())) {
            WHERE(String.join(".", tableName, "title=" + "#{user.title}"));
        }
    }}.toString();
}
  • 修改UserSelectMapper類在該類中鍵入以下代碼
@ResultMap(value = "userInfo")
@SelectProvider(type = UserSelectProvider.class, method = "selectModelByWhere")
UserModel selectModelByWhere(@Param(value = "user") UserModel userModel);
  • 修改UserSelectMapperTest類在該類中鍵入以下代碼
@Test
public void testSelectModelByWhere() {
    UserModel user = new UserModel();
    user.setTitle("1");
    System.out.println(this.userSelectMapper.selectModelByWhere(user));
}

默認WHERE條件會使用AND操作符號,要想使用OR只需要在WHERE條件後添加OR();即可.
模糊查詢的話只需要將UserSelectProvider中的WHERE條件的=修改爲like注意條件前後要加%,還要注意SQL語句中的空格隔離問題.
當然我們也可以使用StringBuilder進行SQL拼接功能

集成PageHelper


  • 修改pom.xml文件增加PageHelper支持
<pagehelper.version>1.2.5</pagehelper.version>

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>${pagehelper.version}</version>
</dependency>
  • 修改UserSelectMapperTest類在該類中鍵入以下代碼
@Test
public void testSelectModelByPageHelper() {
    Integer pageNo = 1, pageSize = 5;
    PageHelper.startPage(pageNo, pageSize);
    this.userSelectMapper.selectModel().forEach(System.out::println);
}

打包文件部署


  • 打包數據
mvn clean package -Dmaven.test.skip=true -X

運行打包後的文件即可

java -jar target/spring-learn-integration-springboot-mybatis-provider-select-1.0.0.jar

源碼地址


發佈了92 篇原創文章 · 獲贊 10 · 訪問量 178萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章