Springboot与Mybatis整合

最近自己用springboot和mybatis做了整合,记录一下:

1.先导入用到的jar包

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.3</version>
        </dependency>
        
        <!-- 阿里数据源 -->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>${druid.version}</version>
        </dependency>
        
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>1.3.0</version>
        </dependency>
        
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>

2.配置配置文件(有些大家用不着的可以不配置)

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

spring.datasource.initialSize=20
spring.datasource.minIdle=50
spring.datasource.maxActive=200

spring.datasource.maxWait=60000

spring.datasource.timeBetweenEvictionRunsMillis=60000

spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false

spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

spring.datasource.filters=stat,log4j

spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

#mybatis
mybatis.mapper-locations=classpath:/com/sxf/**/*Mapper.xml
mybatis.type-aliases-package=com.sxf.**.entity

3.解析数据源

package com.sxf.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

@Configuration
public class DatasourceConfig {

    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDbType(env.getProperty("spring.datasource.type"));
        druidDataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        druidDataSource.setUrl(env.getProperty("spring.datasource.url"));
        druidDataSource.setUsername(env.getProperty("spring.datasource.username"));
        druidDataSource.setPassword(env.getProperty("spring.datasource.password"));

        druidDataSource.setInitialSize(Integer.parseInt(env.getProperty("spring.datasource.initialSize")));
        druidDataSource.setMinIdle(Integer.parseInt(env.getProperty("spring.datasource.minIdle")));
        druidDataSource.setMaxActive(Integer.parseInt(env.getProperty("spring.datasource.maxActive")));
        druidDataSource.setMaxWait(Long.parseLong(env.getProperty("spring.datasource.maxWait")));
        // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        druidDataSource.setTimeBetweenEvictionRunsMillis(
                Long.parseLong(env.getProperty("spring.datasource.timeBetweenEvictionRunsMillis")));
        // 配置一个连接在池中最小生存的时间,单位是毫秒
        druidDataSource.setMinEvictableIdleTimeMillis(
                Long.parseLong(env.getProperty("spring.datasource.minEvictableIdleTimeMillis")));
        druidDataSource.setValidationQuery(env.getProperty("spring.datasource.validationQuery"));
        druidDataSource.setTestWhileIdle(Boolean.getBoolean(env.getProperty("spring.datasource.testWhileIdle")));
        druidDataSource.setTestOnBorrow(Boolean.getBoolean(env.getProperty("spring.datasource.testOnBorrow")));
        druidDataSource.setTestOnReturn(Boolean.getBoolean(env.getProperty("spring.datasource.testOnReturn")));
        // 打开PSCache,并且指定每个连接上PSCache的大小
        druidDataSource.setPoolPreparedStatements(
                Boolean.getBoolean(env.getProperty("spring.datasource.poolPreparedStatements")));
        druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(
                Integer.parseInt(env.getProperty("spring.datasource.maxPoolPreparedStatementPerConnectionSize")));
        // 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙

        // 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        String cpStr = env.getProperty("spring.datasource.connectionProperties");
        if (null != cpStr) {
            Properties pro = new Properties();
            String[] kvArr = cpStr.split("\;");
            if (null != kvArr && kvArr.length > 0) {
                for (String cp : kvArr) {
                    String[] arr = cp.split("\=");
                    if (null != arr && arr.length == 2) {
                        pro.put(arr[0], arr[1]);
                    }
                }
            }
            druidDataSource.setConnectProperties(pro);
        }

        return druidDataSource;
    }

    @Bean
    public ServletRegistrationBean druidServlet() {
        return new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
    }

}

这里配置@MapperScan扫描mybatis接口, 不需要在每个接口里面配置@Mapper

package com.sxf.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages="com.sxf.**.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class MyBatisConfig{

    @Autowired
    private DatasourceConfig dataSource;
    
    @Autowired
    private Environment env;

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean() {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource.dataSource());
        bean.setTypeAliasesPackage(env.getProperty("type-aliases-package"));
       

        //添加XML目录
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
//            bean.setConfigLocation(resolver.getResource(env.getProperty("mybatis.page-plugins-config")));
            bean.setMapperLocations(resolver.getResources(env.getProperty("mybatis.mapper-locations")));
            
            return bean.getObject();
        } catch(IllegalArgumentException e){
            e.printStackTrace();
             throw new RuntimeException(e);
        }catch (Exception e) {
            e.printStackTrace();
            e.getMessage();
            throw new RuntimeException(e);
        }
    }

    @Bean
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource.dataSource());
    }
}

mybatis接口,不需要添加@Mapper

package com.sxf.profit.mapper;

import com.sxf.profit.entity.InviteCode;

public interface InviteCodeMapper {
    int deleteByPrimaryKey(Long id);

    int insert(InviteCode record);

    int insertSelective(InviteCode record);

    InviteCode selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(InviteCode record);

    int updateByPrimaryKey(InviteCode record);
}

4.写个测试controller,测试成功

package com.sxf.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.sxf.profit.entity.InviteCode;
import com.sxf.profit.mapper.InviteCodeMapper;

@RestController
public class InviteCodeController {

    @Autowired
    private InviteCodeMapper inviteCodeMapper;
    
    @GetMapping("/Hello/{id}")
    public InviteCode selectInviteCode(@PathVariable("id") Long id){
        return inviteCodeMapper.selectByPrimaryKey(id);
    }
}

成功!!!

原文地址:https://www.cnblogs.com/sxf2017/p/7262990.html