美文网首页
Spring + MyBatis整合思路

Spring + MyBatis整合思路

作者: Laube | 来源:发表于2018-12-20 14:29 被阅读0次

一开始自己学习ssm框架的时候,花了很多时间看网上的博客,还有自己购买的书籍,但是很少有说明白的,多数原因是因为版本不同导致的一些不兼容问题,使得框架整合失败。故今天自己整理一下SSM整合的思路。虽然这样的文章有很多人写了,但自己还是写一下,算是记录自己的学习路程吧,同时也是我在简书上的第一篇文章。

ssm的整合,其实本质上就是spring与mybatis的整合,因为springmvc就是spring的一部分,一个模块而已,但mybatis并不是,所以关键在于如何集成mybatis到spring。mybatis的初始化工厂是这个类:

org.apache.ibatis.session.SqlSessionFactory

而mybatis-spring项目中,会使用这个类来替代它:

org.mybatis.spring.SqlSessionFactoryBean

通过配置这个类的实例bean就可以将mybatis成功集成到spring当中;由于spring控制反转的思想,我们在spring项目开发过程中都是使用依赖注入来获取dao实例,所以要把dao层接口全部转换为spring的bean,通过这个注解配置就可以实现mapper的自动扫描:

org.mybatis.spring.annotation.MapperScan

也可以通过配置这个bean来实现这个注解的功能:

org.mybatis.spring.mapper.MapperScannerConfigurer

如此便实现了spring与mybatis的集成。

我使用的版本为spring5 + mybatis3。spring的版本会不断变化,一些老旧的语法也会随着版本的更迭不断被新的方式替代,所以我们要掌握的是这个框架的配置思想,而不是照着代码按键盘组合键。

其实现在的新项目大家都开始用spring-boot了,约定大于配置的开发原则使得程序员构建项目非常方便,但其实它的本质就是自己内部约定一套默认配置而已。我们在学习的过程中还是最好学习一下每个框架单独的配置。而且一定要学会看代码的文档注释。idea用ctrl + q而eclipse直接鼠标悬停即可出现方法的文档注释。虽然是英文的不过还是很好懂的,配合上翻译app效果更佳哟。O(∩_∩)O

最后也给出我的ssm集成方式的代码:

  • dbinfo.properties
# 全部采用注解配置,唯一使用到的配置文件就一个dbinfo.properties
datasource.driver = com.mysql.jdbc.Driver
datasource.url = jdbc:mysql://127.0.0.1:3306/chat?useSSL=false
datasource.user = root
datasource.password = root
  • ApplicationInitializer.java
package cn.edu.cqut.chat;

import cn.edu.cqut.chat.config.SpringConfig;
import cn.edu.cqut.chat.config.SpringMvcConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * 通过继承这个抽象类并实现三个抽象方法就可以取代web.xml配置springmvc的方式
 */
public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class[] { SpringConfig.class };
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class[] { SpringMvcConfig.class };
  }

  @Override
  protected String[] getServletMappings() {
    return new String[] { "/" };
  }
}

  • SpringConfig.java
package cn.edu.cqut.chat.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

//
@Configuration
@Import(OrmConfig.class)
@ComponentScan(basePackages = "cn.edu.cqut.chat", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = EnableWebMvc.class))
public class SpringConfig {
}

  • SpringMvcConfig.java
package cn.edu.cqut.chat.config;

import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.ISpringTemplateEngine;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;

import java.nio.charset.Charset;
import java.util.List;

@Configuration
@EnableWebMvc
@ComponentScan("cn.edu.cqut.chat.restful")
public class SpringMvcConfig implements WebMvcConfigurer {

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    converter.setDefaultCharset(Charset.defaultCharset());
    converters.add(converter);
  }

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins("*")
            .allowCredentials(true)
            .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH")
            .maxAge(3600);
  }

  @Bean
  public ViewResolver thymeleafViewResolver(ISpringTemplateEngine engine) {
    ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    resolver.setTemplateEngine(engine);
    resolver.setCharacterEncoding("UTF-8");
    return resolver;
  }

  @Bean
  public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);
    templateEngine.setEnableSpringELCompiler(true);
    return templateEngine;
  }

  @Bean
  public SpringResourceTemplateResolver templateResolver( ) {
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setPrefix("/WEB-INF/views/");
    templateResolver.setSuffix(".html");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setOrder(1);
    templateResolver.setTemplateMode(TemplateMode.HTML);
    templateResolver.setCacheable(false);
    return templateResolver;
  }
}

  • OrmConfig.java
package cn.edu.cqut.chat.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;

@Configuration
@PropertySource(value = "classpath:dbinfo.properties", encoding = "UTF-8")
@MapperScan(basePackages = "cn.edu.cqut.chat.dao", annotationClass = Repository.class)
public class OrmConfig {

  @Value("${datasource.driver}")
  String driver;

  @Value("${datasource.url}")
  String url;

  @Value("${datasource.user}")
  String user;

  @Value("${datasource.password}")
  String password;

  @Bean
  public DataSource dataSource() {
    DruidDataSource ds = new DruidDataSource();
    ds.setDriverClassName(driver);
    ds.setUrl(url);
    ds.setUsername(user);
    ds.setPassword(password);
    return ds;
  }

  @Bean
  public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
    SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    factoryBean.setTypeAliasesPackage("cn.edu.cqut.chat.entity");
    factoryBean.setDataSource(dataSource);
    return factoryBean;
  }
}

为了实现完全的注解配置,我把sql写到了dao的注解上,可以参考一下mybatis的provider注解语法。

以上配置只是基本配置,集成了mybatis + spring + thymeleaf,实际项目开发中需要用到的技术会更多,用spring-boot的话会减少很多工作,但一定要懂原理。

相关文章

网友评论

      本文标题:Spring + MyBatis整合思路

      本文链接:https://www.haomeiwen.com/subject/gdjykqtx.html