springboot2.0整合mybatis

1.springboot 目前的推荐版是2.1.2.RELEASE,我们就以当前最新的推荐版为例;

2.创建项目,引入对应的jar包,我是以maven的形式,我这边的数据源以阿里的druid为例 详细查看《springboot2.0整合druid,以及springboot自动装配DataSource原理》

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
<!-- mysql服务端版本匹配 -->
<properties>
        <java.version>1.8</java.version>
        <mysql.version>5.1.6</mysql.version>
    </properties>
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

3.配置文件,更新详细的配置 请参考 阿里的github查看,网址;里面介绍了更详细的属性含义,以及多数据源的配置方式

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 613814
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 8
      min-idle: 1
      max-active: 20
      max-wait: 60000
      time-between-eviction-runsMillis: 60000
      min-evictable-idle-timeMillis: 300000
      validation-query: select 'x' FROM DUAL
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 20
      max-pool-prepared-statement-per-connection-size: 20
      filters: stat
      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      use-global-data-source-stat: true

4.使用

表结构如下,一个简单的城市的表

实体类

public class City implements Serializable {

    private static final long serialVersionUID = 6955023150002543273L;

    private String id;

    private String name;

    private Integer level;

    private String parentId;
    //省略get set
}

mapper接口

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import com.badger.model.City;

@Mapper
public interface CityMapper {

    @Select("SELECT * FROM t_city WHERE parent_id = #{parentId}")
    List<City> selectByParentId(@Param("parentId") String parentId);

}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class BadgerMybatisApplicationTests {
    @Autowired
    CityMapper cityMapper;

    @Test
    public void contextLoads() {
        List<City> list = cityMapper.selectByParentId("-1");
        for (City city : list) {
            System.out.println(city);
        }
    }
}

测试结果如下,可以看到,parentId字段,没有映射成功,可以使用 在sql中,为字段取别名,或者开始驼峰命名映射

 在yml配置文件中,新加mapUnderscoreToCamelCase属性为true,开始驼峰命名,在运行测试类就正常了;

mybatis:
  type-aliases-package: com.badger.model
  #指定全局配置文件的位置,全部配置文件跟configuration是互斥,同时配置会报错
  #config-location: classpath:mybatis/mybatis-config.xml 
  #指定sql映射文件的位置
  mapper-locations: classpath:mybatis/mapper/*.xml  
  configuration:
    map-underscore-to-camel-case: true
    default-fetch-size: 100
    default-statement-timeout: 30

另外mybatis可以配置其他的一些属性例如,xml配置文件的路径,一些configuration的参数等,具体可以参看自动配置类,或者《官方文档》

特别需要说明:我们在使用mybtais的时候,mybatis自动的扫入mapper的接口,需要在接口上标注@org.apache.ibatis.annotations.Mapper注解,或者在springboot的主类上,

标注@org.mybatis.spring.annotation.MapperScan(value = "com.badger.mapper"),指定扫描mapper的路径

5.我们看一下mybatis-spring-boot-autoconfigure-1.3.2.jar,mybatis官方提供的自动装配类,太多了,我就只贴sqlSessionFactory的装配,在mybatis中,也是最主要的一个类

@Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setVfs(SpringBootVFS.class);
    if (StringUtils.hasText(this.properties.getConfigLocation())) {
      factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
    }
    Configuration configuration = this.properties.getConfiguration();
    if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
      configuration = new Configuration();
    }
    if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
      for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
        customizer.customize(configuration);
      }
    }
    factory.setConfiguration(configuration);
    if (this.properties.getConfigurationProperties() != null) {
      factory.setConfigurationProperties(this.properties.getConfigurationProperties());
    }
    if (!ObjectUtils.isEmpty(this.interceptors)) {
      factory.setPlugins(this.interceptors);
    }
    if (this.databaseIdProvider != null) {
      factory.setDatabaseIdProvider(this.databaseIdProvider);
    }
    if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
      factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
    }
    if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
      factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
    }
    if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
      factory.setMapperLocations(this.properties.resolveMapperLocations());
    }

    return factory.getObject();
  }

可以看到,这个类实例化的时候,也只是把配置文件的中的一些属性初始化到sqlSessionFactory里,我们重点来看第二个和第三个if判断这里Configuration

 Configuration configuration = this.properties.getConfiguration();
    if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
      configuration = new Configuration();
    }
    if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
      for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
        customizer.customize(configuration);
      }
    }

首先,我们在配置文件里,没有配置configuration的属性,会默认创建一个;下面,遍历拿到已经注入的ConfigurationCustomizer的,并且执行configuration属性;那么我们在配置configuration的属性的属性的时候,就有三种方式;前两种,已经看到了,就在yml中指定configLocation,或者配置configuration属性;还有一种,我们创建一个配置类,实现ConfigurationCustomizer接口,在Configuration 参数里,配置上对应的属性

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="useGeneratedKeys" value="true" />
    </settings>
</configuration>

 

import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class MyBatisConfig {

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return new ConfigurationCustomizer() {

            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
            }
        };
    }
}

1:xml配置文件形式跟yml配置文件,是互斥的;同时配置,会报错

2:xml配置跟实现org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer,同时配置,ConfigurationCustomizer会不生效(暂时测试的是这个结果,还没有深入研究,应该还是跟第一个差不多,xml配置和类或者yml配置,只能二选一)

3:yml的configuration配置跟实现org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer,同时配置,会互补,从sqlSessionFactory配置,就可以看出来

 

好了,关于springboot2.0集成mybatis的,差不多就是这些,关于configuration配置,建议还是拒绝使用xml的配置形式,毕竟springboot,就不建议使用xml配置的形式的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值