除了几个平常使用的依赖之外,还需要两个用于 Spring 操作数据库和整合 MyBatis 的依赖:spring-jdbc 和 mybatis-spring,如下
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.2.10.RELEASEversion>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>2.0.7version>
dependency>
@Configuration // Spring 配置类注解
@ComponentScan("com.xxx") // 扫描 dao(Mapper 接口) 和 service
@PropertySource("classpath:jdbc.properties") // jdbc 相关配置文件
@Import({JdbcConfig.class, MybatisConfig.class}) // 引入另外两个配置类
public class SpringConfig {
}
获取 DataSource 的 bean,用于配置 MyBatis 的 SqlSessionFactoryBean,这里用阿里的 DruidDataSource 做示例
public class JdbcConfig {
// Value 中的值来自于 jdbc.properties 文件
@Value("${jdbc.driver}")
String driver;
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
MybatisConfig 中需要配置两个 Bean,SqlSessionFactoryBean 用于生成 SqlSessionFactory,MapperScannerConfigurer 用于扫描 Mapper 映射接口
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
// 对应 xml 配置中的 内的 标签
ssfb.setTypeAliasesPackage("com.xxx.domain");
// 对应 xml 配置中的 标签
ssfb.setDataSource(dataSource);
return ssfb;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
// 对应 xml 配置中的 内的 标签
msc.setBasePackage("com.xxx.dao");
return msc;
}
}
在 dao(Mapper 接口) 和 service 类上添加 @Component 注解即可通过 ApplicationContext 获取实例
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
// 按类型获取 dao
AccountDao accountDao = ctx.getBean(AccountDao.class);
System.out.println(accountDao.findById(1));
// 按类型获取 service
AccountService accountService = ctx.getBean(AccountService.class);
System.out.println(accountService.findById(2));
}
}