千家信息网

spring boot DAO之Mybatis的示例分析

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要介绍了spring boot DAO之Mybatis的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。依赖
千家信息网最后更新 2025年02月06日spring boot DAO之Mybatis的示例分析

这篇文章主要介绍了spring boot DAO之Mybatis的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

依赖

                    org.springframework.boot            spring-boot-starter-data-jpa                            mysql            mysql-connector-java                            org.mybatis.spring.boot            mybatis-spring-boot-starter            1.3.2        

application-database.properties

#初始化数据库的时候,如果错误,是否继续启动。spring.datasource.continue-on-error=false#jdbc driver.默认通过uri来自动检测。spring.datasource.driver-class-name=com.mysql.jdbc.Driver#jdbc url.连接数据库的urispring.datasource.url=jdbc:mysql://172.28.1.227:3310/fc?useUnicode=true&autoReconnect=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useServerPrepStmts=false#数据库连接用户名spring.datasource.username=fcdev#数据连接密码spring.datasource.password=123456#全限定名,连接池。默认自动检测classpathspring.datasource.type=com.zaxxer.hikari.HikariDataSource#sql脚本字符spring.datasource.sql-script-encoding=UTF-8#mybatis配置mybatis.check-config-location=falsemybatis.configuration.default-fetch-size=1000mybatis.configuration.map-underscore-to-camel-case=true#mybatis.mapper-locations=

源码-MybatisProperties

@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)public class MybatisProperties {  public static final String MYBATIS_PREFIX = "mybatis";  /**   * Location of MyBatis xml config file.   */  private String configLocation;  /**   * Locations of MyBatis mapper files.   */  private String[] mapperLocations;  /**   * Packages to search type aliases. (Package delimiters are ",; \t\n")   */  private String typeAliasesPackage;  /**   * Packages to search for type handlers. (Package delimiters are ",; \t\n")   */  private String typeHandlersPackage;  /**   * Indicates whether perform presence check of the MyBatis xml config file.   */  private boolean checkConfigLocation = false;  /**   * Execution mode for {@link org.mybatis.spring.SqlSessionTemplate}.   */  private ExecutorType executorType;  /**   * Externalized properties for MyBatis configuration.   */  private Properties configurationProperties;  /**   * A Configuration object for customize default settings. If {@link #configLocation}   * is specified, this property is not used.   */  @NestedConfigurationProperty  private Configuration configuration;}

源码-MybatisAutoConfiguration

@org.springframework.context.annotation.Configuration@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })@ConditionalOnBean(DataSource.class)@EnableConfigurationProperties(MybatisProperties.class)@AutoConfigureAfter(DataSourceAutoConfiguration.class)public class MybatisAutoConfiguration {  private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class);  private final MybatisProperties properties;  private final Interceptor[] interceptors;  private final ResourceLoader resourceLoader;  private final DatabaseIdProvider databaseIdProvider;  private final List configurationCustomizers;  public MybatisAutoConfiguration(MybatisProperties properties,                                  ObjectProvider interceptorsProvider,                                  ResourceLoader resourceLoader,                                  ObjectProvider databaseIdProvider,                                  ObjectProvider> configurationCustomizersProvider) {    this.properties = properties;    this.interceptors = interceptorsProvider.getIfAvailable();    this.resourceLoader = resourceLoader;    this.databaseIdProvider = databaseIdProvider.getIfAvailable();    this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable();  }  @PostConstruct  public void checkConfigFileExists() {    if (this.properties.isCheckConfigLocation() && StringUtils.hasText(this.properties.getConfigLocation())) {      Resource resource = this.resourceLoader.getResource(this.properties.getConfigLocation());      Assert.state(resource.exists(), "Cannot find config location: " + resource          + " (please add config file or check your Mybatis configuration)");    }  }  @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();  }  @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);    }  }  /**   * This will just scan the same base package as Spring Boot does. If you want   * more power, you can explicitly use   * {@link org.mybatis.spring.annotation.MapperScan} but this will get typed   * mappers working correctly, out-of-the-box, similar to using Spring Data JPA   * repositories.   */  public static class AutoConfiguredMapperScannerRegistrar      implements BeanFactoryAware, ImportBeanDefinitionRegistrar, ResourceLoaderAware {    private BeanFactory beanFactory;    private ResourceLoader resourceLoader;    @Override    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {      logger.debug("Searching for mappers annotated with @Mapper");      ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);      try {        if (this.resourceLoader != null) {          scanner.setResourceLoader(this.resourceLoader);        }        List packages = AutoConfigurationPackages.get(this.beanFactory);        if (logger.isDebugEnabled()) {          for (String pkg : packages) {            logger.debug("Using auto-configuration base package '{}'", pkg);          }        }        scanner.setAnnotationClass(Mapper.class);        scanner.registerFilters();        scanner.doScan(StringUtils.toStringArray(packages));      } catch (IllegalStateException ex) {        logger.debug("Could not determine auto-configuration package, automatic mapper scanning disabled.", ex);      }    }    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {      this.beanFactory = beanFactory;    }    @Override    public void setResourceLoader(ResourceLoader resourceLoader) {      this.resourceLoader = resourceLoader;    }  }  /**   * {@link org.mybatis.spring.annotation.MapperScan} ultimately ends up   * creating instances of {@link MapperFactoryBean}. If   * {@link org.mybatis.spring.annotation.MapperScan} is used then this   * auto-configuration is not needed. If it is _not_ used, however, then this   * will bring in a bean registrar and automatically register components based   * on the same component-scanning path as Spring Boot itself.   */  @org.springframework.context.annotation.Configuration  @Import({ AutoConfiguredMapperScannerRegistrar.class })  @ConditionalOnMissingBean(MapperFactoryBean.class)  public static class MapperScannerRegistrarNotFoundConfiguration {    @PostConstruct    public void afterPropertiesSet() {      logger.debug("No {} found.", MapperFactoryBean.class.getName());    }  }}

TestMybatisDao

@Repository@Mapperpublic interface TestMybatisDao {    @Select("select id, name from t_sys_menu where id = #{id}")    SysMenu getById(@Param("id") int id);}

springboot启动类

@MapperScan(basePackages="com.example.spring.dao")@SpringBootApplicationpublic class DataDemoApplication {    public static void main(String[] args) {        SpringApplication.run(DataDemoApplication.class, args);    }}

AppContextTest

@RunWith(SpringRunner.class)@SpringBootTestpublic class AppContextTest {    @Autowired    private TestMybatisDao testMybatisDao;    @Test    public void mybatisTest(){        SysMenu sysMenu = testMybatisDao.getById(1);        System.out.println("menuName = " + sysMenu.getName());    }}

注:mybatis-spring-boot-starter既可以使用xml配置也可以使用注解。

感谢你能够认真阅读完这篇文章,希望小编分享的"spring boot DAO之Mybatis的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0