Spring Boot + tk-mybatis使用单数据源模式
**
Spring Boot + tk-mybatis使用单数据源模式
**
看了很多人关于spring boot + tk-mybatis的例子,总结一个清晰的流程吧,这篇是单数据源的说明,后面再处理多数据源及动态切换(如一个固定数据源,登录时根据选择不同,将进入不同数据库时的数据处理)
a) 引用包(无须多讲,网上一堆说明)
<!-- 阿里巴巴连接池Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
b) 配制application.properties
**
c) 项目架构
**
d) 建立baseMapper
package test.base.mapper;
import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.ExampleMapper;
import tk.mybatis.mapper.common.IdsMapper;
/**
*
* @author
* @date create in 上午10:14 08/28/2018
* @Description 通用Mapper接口
* @param <T> Entity
*/
public interface BaseLibMapper<T>
extends tk.mybatis.mapper.common.BaseMapper<T>,
IdsMapper<T>, ConditionMapper<T>,ExampleMapper<T>{
}
e) 项目启动入口:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
//import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* * @author jason
*如果使用spring boot来管理datasource,就在入口加以**解
*@SpringBootApplication
* @MapperScan(basePackages = {"test.mapper"} ) //指定数据源对就mapper所在包
* 如果多数据源或人工配制datasource,需要禁用sp的自动配制,按以**解
* @EnableTransactionManagement
* @SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
*/
//禁用SPB自动配制datasource
@EnableTransactionManagement
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
public class TestApplication {
private static Logger logger = LoggerFactory.getLogger(TestApplication.class);
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
logger.info("服务成功启动");
}
}
f) 人工配制DataSource类来解决DS配制(如果单数据源可以使用SPB自动配制,就不需要这两个类开配制了)
i. 配制datasource
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
//import test.utils.multidatasource.MultiDynamicDataSource;
@Configuration
//@ConfigurationProperties(value = "classpath:db.properties",ignoreUnknownFields = false )//指定自己的配制文件
@ConfigurationProperties( prefix = "spring.datasource" ) //指定使用application.properties文件
public class DbCtlDataSourceConfig {
// static final String MAPPER_LOCATION = "classpath:mapper/dbCtl/*.xml";
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String dbUser;
@Value("${spring.datasource.password}")
private String dbPassword;
@Value("${spring.datasource.driver-class-name}")
private String dbDriverClass;
@Bean(name = "dbCtlDataSource")
@Primary
public DataSource DbCtlDataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(dbUrl);
datasource.setUsername(dbUser);
datasource.setPassword(dbPassword);
datasource.setDriverClassName(dbDriverClass);
//设置动态数据源的默认数据源
/* MultiDynamicDataSource multiDataSource = MultiDynamicDataSource.getSingleton();
multiDataSource.setDefaultDataSource(datasource);*/
return datasource;
}
}
ii. 设置扫描
package test.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;
@AutoConfigureAfter(DbCtlDataSourceConfig.class) // 一定要在DS配制之后装载
@MapperScan(basePackages = { "test.mapper" }) // 指定当前数据源扫描对应mapper包所在路径
public class DbCtlMyBatisConfig {
private static final String dbCtlEntity = "test.entity"; // 指定实体包所在位置
// private static final String dbCtlXmlUrl =
// "classpath:ctl_mapper/*.xml";//使用传统mybatis就需要XML文件
// 注入数据源
@Autowired
@Qualifier("dbCtlDataSource")
private DataSource ctlDbDataSource;
//建立sessionfactory,作为SPB主数据
@Bean(name = "dbCtlSessionFactory")
@Primary
public SqlSessionFactory dbCtlSqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(ctlDbDataSource);
sessionFactory.setTypeAliasesPackage(dbCtlEntity); //指定表实体
try {
// 基于注解扫描Mapper,不需配置xml路径,传统mybatis的使用需要XML
// sessionFactory.setMapperLocations(new
// PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));
return sessionFactory.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean(name = "dbCtlTransactionManager")
@Primary
public DataSourceTransactionManager dbCtlTransactionManager() {
return new DataSourceTransactionManager(ctlDbDataSource);
}
@Bean
public SqlSessionTemplate sqlSessionTemplate() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(dbCtlSqlSessionFactory());
return template;
}
}
g) 实体类
h) mapper
i) controller前端测试
package test.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.extern.slf4j.Slf4j;
import test.entity.CtlUser;
import test.mapper.CtlUserMapper;
@Slf4j
@RestController
public class CtlUserController {
Logger log = LoggerFactory.getLogger(CtlUserController.class);
@Autowired
private CtlUserMapper ctlUserMapper;
@RequestMapping("users/{id}")
CtlUser getUserByUserNo(@PathVariable("id") String userNo){
CtlUser ctluser = new CtlUser();
ctluser.setSuserno(userNo);
return ctlUserMapper.selectOne(ctluser);
}
@RequestMapping("/getall")
public List<CtlUser> getall1(){
List<CtlUser> lsl = ctlUserMapper.selectAll();
log.debug(lsl.toString());
return lsl;
}
}
i) 测试
打开浏览器,输入 127.0.0.1/getall