# spring 整合 mybatis(注解配置方式) 1、创建标准web maven工程,导入依赖 ```xml 4.0.0 com.heibaiying spring-jdbc 1.0-SNAPSHOT 5.1.3.RELEASE org.springframework spring-context ${spring-base-version} org.springframework spring-beans ${spring-base-version} org.springframework spring-core ${spring-base-version} org.springframework spring-web ${spring-base-version} org.springframework spring-webmvc ${spring-base-version} javax.servlet javax.servlet-api 4.0.1 provided org.projectlombok lombok 1.18.4 provided org.springframework spring-jdbc ${spring-base-version} mysql mysql-connector-java 8.0.13 junit junit 4.12 test org.springframework spring-test ${spring-base-version} test com.oracle ojdbc6 11.2.0.3.0 org.mybatis mybatis-spring 1.3.2 org.mybatis mybatis 3.4.6 ``` 2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 ```java public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class[] getRootConfigClasses() { return new Class[0]; } protected Class[] getServletConfigClasses() { return new Class[]{ServletConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } } ``` 3、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties ```properties # mysql 数据库配置 mysql.driverClassName=com.mysql.jdbc.Driver mysql.url=jdbc:mysql://localhost:3306/mysql mysql.username=root mysql.password=root ``` ```properties # oracle 数据库配置 oracle.driverClassName=oracle.jdbc.driver.OracleDriver oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 oracle.username=用户名 oracle.password=密码 ``` 4、在新建数据库配置映射类DataSourceConfig.java ```java package com.heibaiying.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /** * @author : heibaiying * @description : */ @Configuration @PropertySource(value = "classpath:mysql.properties") @Data public class DataSourceConfig { @Value("${mysql.driverClassName}") private String driverClassName; @Value("${mysql.url}") private String url; @Value("${mysql.username}") private String username; @Value("${mysql.password}") private String password; } ``` 5、新建ServletConfig.java,进行数据库相关配置 ```java package com.heibaiying.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.io.IOException; /** * @author : heibaiying */ @Configuration @EnableTransactionManagement // 开启声明式事务处理 等价于xml中 @ComponentScan(basePackages = {"com.heibaiying.*"}) public class ServletConfig implements WebMvcConfigurer { /* @Autowired * private DataSourceConfig sourceConfig; * 不要采用这种方式注入DataSourceConfig,由于类的加载顺序影响会报空指针异常 * 最好的方式是在DriverManagerDataSource构造中采用参数注入 */ /** * 配置数据源 */ @Bean public DriverManagerDataSource dataSource(DataSourceConfig sourceConfig) { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(sourceConfig.getDriverClassName()); dataSource.setUrl(sourceConfig.getUrl()); dataSource.setUsername(sourceConfig.getUsername()); dataSource.setPassword(sourceConfig.getPassword()); return dataSource; } /** * 配置mybatis 会话工厂 * * @param dataSource 这个参数的名称需要保持和上面方法名一致 才能自动注入,因为 * 采用@Bean注解生成的bean 默认采用方法名为名称,当然也可以在使用@Bean时指定name属性 */ @Bean public SqlSessionFactoryBean sessionFactoryBean(DriverManagerDataSource dataSource) throws IOException { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mappers/**/*.xml")); sessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatisConfig.xml")); return sessionFactoryBean; } /** * 配置mybatis 会话工厂 */ @Bean public MapperScannerConfigurer MapperScannerConfigurer() { MapperScannerConfigurer configurer = new MapperScannerConfigurer(); configurer.setSqlSessionFactoryBeanName("sessionFactoryBean"); configurer.setBasePackage("com.heibaiying.dao"); return configurer; } /** * 定义事务管理器 */ @Bean public DataSourceTransactionManager transactionManager(DriverManagerDataSource dataSource) { DataSourceTransactionManager manager = new DataSourceTransactionManager(); manager.setDataSource(dataSource); return manager; } } ``` 5、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) ```xml ``` 5、新建查询接口及其对应的mapper文件 ```java public interface MysqlDao { List get(); } ``` ```xml ``` ```mysql public interface OracleDao { List queryById(long id); } ``` ```xml ``` 6.新建测试类进行测试 ```java package com.heibaiying.dao; import com.heibaiying.bean.Relation; import com.heibaiying.config.DataSourceConfig; import com.heibaiying.config.DispatcherServletInitializer; import com.heibaiying.config.ServletConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; /** * @author : heibaiying * @description : */ @RunWith(SpringRunner.class) @ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) public class MysqlDaoTest { @Autowired private MysqlDao mysqlDao; @Test public void get() { List relations = mysqlDao.queryById("691"); if (relations != null) { for (Relation relation : relations) { System.out.println(relation.getId() + " " + relation.getName()); } } } } ``` ```java package com.heibaiying.dao; import com.heibaiying.bean.Flow; import com.heibaiying.config.DataSourceConfig; import com.heibaiying.config.DispatcherServletInitializer; import com.heibaiying.config.ServletConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; /** * @author : heibaiying * @description : */ @RunWith(SpringRunner.class) @ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) public class OracleDaoTest { @Autowired private OracleDao oracleDao; @Test public void get() { List flows = oracleDao.queryById(217584603977429772L); if (flows != null) { for (Flow flow : flows) { System.out.println(flow.getId() + " " + flow.getPlugId()); } } } } ```