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