1. 程式人生 > >SpringBoot 2.X整合Mybatis

SpringBoot 2.X整合Mybatis

1、建立工程環境

勾選Web、Mybatis、MySQL,如下

依賴如下

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

建立完成之後注意,MyBatis依賴的命名和其他庫的命名不太一樣,是的這個整合jar包並不是springboot自己的,這表示該starter是由第三方提供的,就像Druid資料來源一樣,也是第三方的。

方便閱讀,先貼出下面操作編寫的類位置資訊,如下圖:

2、配置資料庫連線資訊

這裡使用yml方式

spring:
  datasource:
    username: root
    url: jdbc:mysql://localhost:3306/ufida?serverTimezone=UTC
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
#如果要使用Druid資料來源就要匯入相應jar包,當然也可以不指定type
    type: com.alibaba.druid.pool.DruidDataSource

配置完成後,MyBatis就可以建立實體類來使用。

3、編寫實體類

實體類:dao包下的Userdao

public class Userdao {
    private int user_id;
    private String userName;
    private String passWord;
    private int usertypeid;

    getXXX...
    setXXX...
    toString...
}

4、編寫Mapper介面類

Mapper介面類:mapper包下的UserMapper

@Mapper
@Repository   
public interface UserMapper {
   //只是整合測試,為了可讀性,只寫了一個方法
    List<Userdao> queryUserList();
}

這裡要注意一下@Mapper註解,@Mapper註解新增位置在介面類上面它的作用是在編譯之後會生成相應的介面實現類,這種方法也是官方推薦使用的!這裡只是測試整合mybatis編寫一個Mapper介面即可,如果有需求要很多介面都要變成實現類,那麼需要在每個介面類上加上@Mapper註解,比較麻煩,解決這個問題用@MapperScan註解。簡單點說@MapperScan註解就相當於直接掃描指定包,上面的程式碼所在包是com.yichunnnn.jdbcboot.mapper包下,如果要用@MapperScan註解,就相當於如下即可

@MapperScan("com.yichunnnn.jdbcboot.mapper")  //相當於@Mapper
@SpringBootApplication
public class JdbcbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(JdbcbootApplication.class, args);
    }
}

5、編寫Mapper對映檔案

Mapper對映檔案編寫的位置以及名字為:classpath:mybatis/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.yichunnnn.jdbcboot.mapper.UserMapper">

    <select id="queryUserList" resultType="Userdao">
        select * from user
    </select>
</mapper>

考慮到可讀性,這裡只編寫一個查詢的方法,同時特別注意

只要錯了一處都會報錯!

6、SpringBoot 整合Mybatis

實際上Mybatis的整合過程像極了我們程式設計師的一生。

在SpringBoot 整合Mybatis之前,我們回憶回憶以前 MyBatis 單獨使用時,myBatis 核心配置檔案要配置資料來源、事務、連線資料庫賬號、密碼....是的全是這貨一個人幹,都要親力親為。這就是我們的低谷期

myBatis 與 spring 整合的時候,配置資料來源、事務、連線資料庫的賬號什麼的都交由 spring 管理就行,就不用什麼都自己管理自己去幹。這就是我們春風得意的時候,事業有著落...

再後來,SpringBoot 整合Mybatis的時候,資料來源什麼的,springboot都默認準備好了,甚至不使用mybatis配置檔案也沒問題,如果我們自己已經編寫了 myBatis 的對映配置檔案,則只要告訴 spring boot 這些檔案的位置的好了,如下(yml寫法),這簡直是事業有成,迎娶白富美,走上人生巔峰...

#整合Mybatis   #指定myBatis的核心配置檔案與Mapper對映檔案
mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml
#注意:對應實體類的路徑
  type-aliases-package: com.yichunnnn.jdbcboot.dao


故事是美好的,然而事實卻是骨感的.....

最後的配置檔案也就如上圖效果所示,如果需要完全理解配置檔案可以從 org.mybatis.spring.boot.autoconfigure.MybatisProperties 類中檢視(滑鼠點選屬性就可以進入),當然也可以從官方文件中查閱:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

7、編寫controller層程式碼

@RestController
public class MybatisController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/selectUser")
    public String selectUser(){
        List<Userdao> userdaos = userMapper.queryUserList();
        for (Userdao user : userdaos) {
            System.out.println(user);
        }
        return "select success == SpringBoot 2.X整合Mybatis成功!";
    }
}

執行測試

效果如上,則整合成功!

8、SpringBoot 2.X整合Mybatis原理

SpringBoot 2.X整合Mybatis原理實際上就隱含在org.mybatis.spring.boot.autoconfigure 包中,這裡面蘊含著SpringBoot 整合Mybatis的精華原理所在,具體位置如下

在myBatis 與 spring 整合的時候,開發者需要自己提供兩個Bean,一個SqlSessionFactoryBean,還有一個是MapperScannerConfigurer,在Spring Boot中,這兩個東西雖然不用開發者自己提供了,但是並不意味著這兩個Bean不需要了,在org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration類中,我們可以看到Spring Boot提供了這兩個Bean,關鍵原始碼如下:

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration implements InitializingBean {

  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    return factory.getObject();
  }
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    ExecutorType executorType = this.properties.getExecutorType();
    if (executorType != null) {
      return new SqlSessionTemplate(sqlSessionFactory, executorType);
    } else {
      return new SqlSessionTemplate(sqlSessionFactory);
    }
  }
  @org.springframework.context.annotation.Configuration
  @Import({ AutoConfiguredMapperScannerRegistrar.class })
  @ConditionalOnMissingBean(MapperFactoryBean.class)
  public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {

    @Override
    public void afterPropertiesSet() {
      logger.debug("No {} found.", MapperFactoryBean.class.getName());
    }
  }
}

從類上的註解可以看出,噹噹前類路徑下存在SqlSessionFactorySqlSessionFactoryBean以及DataSource時,這裡的配置才會生效,SqlSessionFactorySqlTemplate都被提供了。這段程式碼的意義就在於Spring BootMyBatis多資料來源的配置時做了重要的參考!

當然如果對mybatis的配置屬性感興趣的也可以參考MybatisProperties類,要探索更多原理主要以org.mybatis.spring.boot.autoconfigure 包為中心進行參考!

如果本文對你有一點點幫助,那麼請點個讚唄,謝謝~

最後,若有不足或者不正之處,歡迎指正批評,感激不盡!如果有疑問歡迎留言,絕對第一時間回覆!

歡迎各位關注我的公眾號,裡面有一些java學習資料和一大波java電子書籍,比如說周志明老師的深入java虛擬機器、java程式設計思想、核心技術卷、大話設計模式、java併發程式設計實戰.....都是java的聖經,不說了快上Tomcat車,咋們走!最主要的是一起探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...


參考:
http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

https://blog.csdn.net/u012702547/article/details/88643