spring 的 mybatis基础配置

spring的mybatis配置(没有spring-web和mybatis-spring),主要来做回顾学习
一、配置简介
整个配置过程主要围绕一点,就是SqlSessionFactory,把这个配置成了,主流程就可以打通,相关的几个类如下:
1、SqlSessionFactoryBuilder:功能根据数据源和mybatis的配置信息,来生成SqlSessionFactory实例;
2、SqlSessionFactory:使用它来生成每次数据库操作的会话通道 SqlSession;
3、SqlSession:使用此会话通道可以操作数据库,操作完后关闭。
 
二、案例说明
目录结构

文件pom.xml

第1个主要框架是spring相关的context和test;

第2个主要框架是mybatis。

其它包有测试用的junit、snakeyaml(用于支持yaml配置)、druid(阿里的连接池)、postgresql(PG数据库的jdbc实现,用mysql也一样)。

由于此系统后台编辑器问题,xml数据显示不全,源码最下面有提供

 

先看代码ConfigDBUtils.java

生成SqlSessionFactory主要逻辑,参考了org.mybatis.spring.SqlSessionFactoryBean的部分代码,有兴趣的读者可以看里面的buildSqlSessionFactory方法。

package com.blueinfinite.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.blueinfinite.config.ConfigDBInfo;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.Resource;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.SQLException;

/**
 * 配置工具
 */
public class ConfigDBUtils {
    /**
     * 生成SqlSessionFactory
     * @param sessionFactoryName 工厂名,一个名称对称一个工厂,用于区分多数据源
     * @param mapperPath mapper文件位置
     * @param jdbcTrans
     * @param dataSource 数据源
     * @return
     */
    public static SqlSessionFactory getSqlSessionFactory(String sessionFactoryName, String mapperPath, JdbcTransactionFactory jdbcTrans, DataSource dataSource) {
        //1、创建基于mybatis的配置实例
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        //2、将数据源导入配置
        configuration.setEnvironment(new Environment(sessionFactoryName, jdbcTrans, dataSource));
        //3、获取指定的所有mapper文件
        ApplicationContext ctx = new FileSystemXmlApplicationContext();
        Resource[] mapperResource = null;
        try {
            mapperResource = ctx.getResources(mapperPath);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            //4、解析并将所有mapper导入到配置
            for (Resource res : mapperResource) {
                XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(res.getInputStream(),
                        configuration, res.toString(), configuration.getSqlFragments());
                xmlMapperBuilder.parse();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //5、SqlSessionFactoryBuilder使用配置生成SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        return sqlSessionFactory;
    }

    /**
     * 生成数据源
     * @param info
     * @return
     */
    public static DataSource getDruid(ConfigDBInfo info) {
        System.out.println("Create DruidDataSource:" + info.getUrl());

        DruidDataSource dds = new DruidDataSource();
        dds.setUrl(info.getUrl());
        dds.setUsername(info.getUsername());
        dds.setPassword(info.getPassword());
        dds.setDriverClassName(info.getDriver());
        dds.setInitialSize(0);//初始化连接大小
        dds.setMaxActive(1500);//连接池最大使用连接数量
        dds.setMinIdle(0);//连接池最小空闲
        dds.setMaxWait(60000);//获取连接最大等待时间
        dds.setValidationQuery("select 1");//验证数据库连接有效性,要求查询语句

        //建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
        dds.setTestWhileIdle(true);

        //申请连接时执行validationQuery检测连接是否有效,配置true会降低性能。
        dds.setTestOnBorrow(false);

        //归还连接时执行validationQuery检测连接是否有效,配置true会降低性能
        dds.setTestOnReturn(false);

        //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        dds.setTimeBetweenEvictionRunsMillis(60000);

        //配置一个连接在池中最小生存的时间,单位是毫秒
        dds.setMinEvictableIdleTimeMillis(25200000);

        //对于长时间不使用的连接强制关闭
        dds.setRemoveAbandoned(true);

        //关闭超过30分钟的空闲连接,1800秒,也就是30分钟
        dds.setRemoveAbandonedTimeout(1800);

        //关闭abanded连接时输出错误日志
        dds.setLogAbandoned(true);

        //设置批量更新

        //监控数据库
        //dds.setFilters("mergeStat");
        try {
            dds.setFilters("stat,wall");
        } catch (SQLException e) {
            System.out.println("error:" + e.getMessage());
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return dds;
    }
}

配置代码Config.java

主要包含会话工厂和获取yml配置,使用YamlPropertiesFactoryBean获取yml配置信息,存储到Properties,再将这个属性实例放到PropertySourcesPlaceholderConfigurer实例即可。

package com.blueinfinite.config;

import com.blueinfinite.Service.MessageService;
import com.blueinfinite.utils.ConfigDBUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;

import javax.sql.DataSource;

/**
 * 初始配置
 */
@Configuration
public class Config {
    /**
     * 配置yal支持
     * @return
     */
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        System.out.println("PropertySourcesPlaceholderConfigurer");

        //获取yml文件
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource("application.yml"));

        //使用yml生效
        PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
        p.setProperties(yaml.getObject());

        return p;
    }

    /**
     * spring 注入测试
     * @return
     */
    @Bean
    MessageService mockMessageService() {
        return () -> "hello";
    }

    /**
     * 配置数据源
     * @param info 数据库配置信息
     * @return
     */
    @Bean
    public DataSource dataSource(ConfigDBInfo info) {
        System.out.println(info.toString());
        return ConfigDBUtils.getDruid(info);
    }

    @Bean
    JdbcTransactionFactory jdbcTransactionFactory() {
        return new JdbcTransactionFactory();
    }

    /**
     * mybatis会话工厂
     */
    @Bean
    SqlSessionFactory getSqlSessionFactory(JdbcTransactionFactory jdbcTrans, DataSource dataSource) {
        System.out.println("getSqlSessionFactory");
        return ConfigDBUtils.getSqlSessionFactory("test_mybatis","classpath*:mapper/*.xml",jdbcTrans, dataSource);
    }
}

mapper接口代码:CustomMapper.java

package com.blueinfinite.mapper;

import com.blueinfinite.model.Custom;
import org.springframework.stereotype.Repository;

/**
 * 客户
 */
@Repository
public interface CustomMapper {
    Custom getCustom(int ID);
}

 

最后看测试代码:

import com.blueinfinite.App;
import com.blueinfinite.mapper.CustomMapper;
import com.blueinfinite.mapper.DepartmentMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringJUnitConfig(App.class)
public class TestMybatis1 {

    @Autowired
    SqlSessionFactory sqlSessionFactory;

    @Test
    public void test_mybatis() {
        //1、打开会话通道
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2、关系要查询的mapper接口
        CustomMapper customMapper = sqlSession.getMapper(CustomMapper.class);
        DepartmentMapper departmentMapper = sqlSession.getMapper(DepartmentMapper.class);

        //查询
        System.out.println(customMapper.getCustom(3));
        System.out.println(departmentMapper.getInfo(5));

        //3、关闭会议通道
        sqlSession.close();
    }
}

在使用上都需要三步,打开session、绑定mapper、关闭session等操作,比较麻烦,这个时候我们可以使用mybatis-spring,操作数据库时可以省略这些业务代码。参考spring 的 mybatis基础配置(mybatis-spring)

后续会有spring和spring-mybatis的配置,来简化使用上的复杂度。

需要完整源码可以到:https://github.com/blueinfinite/testmybatis

 

java,mybaties | 2018-05-25 12:44:17