Spring框架(五)實戰Spring整合Mybatis

你佳哥發表於2020-12-17

基於:【狂神說Java】Spring5最新完整教程IDEA版通俗易懂

1 Mybatis回顧

可以參考:MyBatis(一)第一個MyBatis程式(idea+maven)

使用原生mybatis的一般性流程:

  1. 使用maven匯入mybatis、mysql依賴包;
  2. 配置mybatis-config.xml檔案,包括資料庫資訊、註冊mapper等;
  3. 編寫一個MybatisUtils類,用來從.xml載入資料來源,返回SqlSession物件;
  4. 編寫業務Mapper介面;
  5. 編寫Mapper配置檔案,編寫相應的SQL業務邏輯;
  6. 測試使用:獲得sqlSession物件,獲得mapper,呼叫mapper方法返回結果;

2 Spring使用Mybatis

由於Spring的IoC功能,所有的物件都交給Spring去管理,所以原生mybatis的物件也需要交給Spring去管理,不再使用new關鍵字去建立物件,而採用bean;

2.1 spring-dao.xml配置

2.1.1 dataSource

<!--資料來源,代替MybatisUtils.java的資料庫連結類-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/datasets?useSSL=false&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=UTC"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

以上程式碼將資料來源註冊為物件,類似於原生的從xml載入資源:
InputStream inputStream = Resources.getResourceAsStream(resource)

2.1.2 sqlSessionFactory

<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!--mybatis配置檔案-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

sqlSessionFactory註冊為物件,類似於原生的建立工廠:
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2.1.3 sqlSession

<!--sqlSession-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

獲得sqlSession,類似於原生的sqlSessionFactory.openSession(),此處的SqlSessionTemplate實現了SqlSession 介面。

2.2 測試使用

和原生mybatis一樣的使用方法:

public void springAllUsersGet(){
    //讀入配置
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
    SqlSession sqlSession = context.getBean("sqlSessionTemplate",SqlSession.class);
    //建立對映
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    for (User user : mapper.getAllUsers()) {
        logger.debug(user);
    }
}

問題來了,既然Spring的設計理念是IoC,那麼在以上使用的時候mappersqlSession之間的關係,也是屬於依賴注入,mapper例項物件也可以交給Spring去管理,使用者只關心從context拿就行。

2.2.1 Mapper實現類

public class UserMapperImpl implements UserMapper{
    private SqlSessionTemplate sqlSessionTemplate;

    //set進來
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    @Override
    public List<User> getAllUsers() {
        UserMapper mapper=sqlSessionTemplate.getMapper(UserMapper.class);
        return mapper.getAllUsers();
    }
}

2.2.2 Mapper註冊bean

<bean id="userMapper" class="dao.UserMapperImpl">
    <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>

2.2.3 測試使用

@Test
public void springAllUsersGet() {
    //讀入配置
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
    //獲得
    UserMapper mapper = context.getBean("userMapper",UserMapper.class);
    //獲得
    for (User user : mapper.getAllUsers()) {
        logger.debug(user.toString());
    }
}

可以注意到,直接從context上下文就獲得了bean物件,直接使用,耦合性大大降低;
但是注意:設計介面和編寫Mapper對應的sql語句是必須的,這是mybatis的核心,並且需要使用<property name="configLocation" value="classpath:mybatis-config.xml"/>匯入進去,spring-mybatis僅僅是提供了一種優雅的物件管理機制而已。

2.3 使用SqlSessionDaoSupport

2.3.1 介面實現

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public List<User> getAllUsers() {
        return getSqlSession().getMapper(UserMapper.class).getAllUsers();
    }
}

繼承了SqlSessionDaoSupport,可以直接獲得SqlSession,不用在spring中配置SqlSession的bean;

2.3.2 配置註冊Bean

<bean id="userMapper" class="dao.UserMapperImpl2">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

注意:使用sqlSessionFactory注入是UserMapperImpl實現類,跨過了SqlSession

3 總結

使用Spring去整合Mybatis主要就是利用了Spring IoC的思想,把一些配置類直接在Spring配置檔案中進行註冊成Bean,讓程式更多的關注業務邏輯實現,而不是一堆獲取資料庫的操作。

相關文章