小代學Spring Boot之整合MyBatis

程式碼無止境發表於2019-07-19

想要獲取更多文章可以訪問我的部落格 - 程式碼無止境

上一篇小代同學在Spring Boot專案中配置了資料來源,但是通常來講我們訪問資料庫都會通過一個ORM框架,很少會直接使用JDBC來執行資料庫操作的。這麼多ORM框架,選擇哪個好呢?

小代選ORM框架

小代同學最終選用的ORM框架是MyBatis,他選擇MyBatis的原因主要有以下幾點:

  1. 可以簡化我們運算元據庫的步驟。
  2. 相對來說學習成本較低,Hibernate還需要學習其HQL查詢規範。
  3. 使用相對廣泛。

整合MyBatis

如何整合MyBatis呢?其實很簡單,在我們上一篇文章《小代學Spring Boot之資料來源》的基礎之上,我們只需要在pom.xml檔案中加入以下內容即可。

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

配置MyBatis

整合MyBatis之後我們還需要相關配置才能夠使用它。首先我們需要配置回話工廠和事務管理器,在DruidDatasourceConfig.java類中新增如下內容即可:

@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();
}

然後我們還需要配置Mapper.java檔案和Mapper.xml檔案的地址好讓Spring知道在那裡掃描我們的Mapper檔案。Mapper.java檔案地址,我們可以通過@MapperScan註解來指定。如下所示,我們在DruidDataSourceConfiguration上加了這個註解:

@MapperScan(value = { "cn.itweknow.sbdatasource.mapper" }, sqlSessionFactoryRef = "sqlSessionFactory")

Mapper.xml檔案的地址則需要在初始化會話工廠的過程中指定,如下所示,我們在sqlSessionFactory方法中增加了一些內容:

@Bean(name = "sqlSessionFactory")
@ConditionalOnMissingBean(name = "sqlSessionFactory")
public SqlSessionFactorysqlSessionFactory(@Qualifier("druidDataSource") DruidDataSource druidDataSource) throws Exception {
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(druidDataSource);
    sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:sqlmap/*Mapper.xml"));
    return sessionFactory.getObject();
}

就這樣,我們的Spring Boot專案已經成功的整合了MyBatis了。下面就一起來測試一下看下效果吧。

測試

1.新建一個名為spring_toturial的資料庫,並且新建一張t_user表以及其對應的實體類,具體的資料庫結構指令碼和實體類可以點選這裡獲取
2.新建UserMapper.java介面檔案,並且定義一個名為selectById介面,如下所示:

public interface UserMapper {
    User selectById(@Param("id") Integer id);
}

3.新建UserMapper.xml檔案,並且實現selectById,如下所示:

<?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="cn.itweknow.sbdatasource.mapper.UserMapper">
  <resultMap id="BaseResultMap" type="cn.itweknow.sbdatasource.dao.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
  </resultMap>

  <select id="selectById" resultMap="BaseResultMap">
    select * from t_user where id = #{id}
  </select>
</mapper>

4.新建selectById的Junit測試用例,如下程式碼所示:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SbDatasourceApplication.class})
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelectById() {
        User user = userMapper.selectById(1);
        System.out.println(user);
    }

}

5.執行Junit方法如果控制檯能夠輸出如下結果,那就恭喜你成功整合MyBatis了。

User{id=1, name='abc'}

PS:學習不止,碼不停蹄!如果您喜歡我的文章,就關注我吧!

掃碼關注“程式碼無止境”

相關文章