spring 手动配置数据源

    在《记一次搭建自己的java开发框架》中,已经实现基础框架搭建,实现连接数据库查询数据,但是数据源配置和数据库连接查询都是基于系统自动配置的。下面是另一种 通过手动配置数据源实现数据库连接和数据查询 : 

    1.在原有的《记一次搭建自己的java开发框架》的基础上,我们修改了 application.properties 文件为application.yml文件 ,文件内容如下 : 

#服务端口  
server:
  port: 8090
#数据库配置
datasource:
  driverClassName: com.mysql.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/testmvc?useSSL=true
  username: root
  password: root
  mybatis:
    mapperLocations: classpath*:/mapper/*-mapper.xml
    typeAliasesPackage: com.test.mybatis.dal.dataobject

#静态资源地址
statics:
  path: D:/workspaces/test.mybatis/src/main/resources/statics/
#velocity模板配置
velocity:
  templates:
    path: D:/workspaces/test.mybatis/src/main/resources/templates/

  2. 新增数据源配置文件 DataSourceConfiguration 和 获取 SqlSession连接的文件 BaseMapper

其中 DataSourceConfiguration  配置如下:

@Configuration
public class DataSourceConfiguration {

    @Autowired
    private Environment                  env;

    /** dataSource 类名称 */
    public static final String           datasource_name          = "dataSource";
    /** sqlSessionFactory 类名称 */
    public static final String           sqlsessionfactory_name   = "sqlSessionFactory";
    /** transactionManager 类名称 */
    public static final String           transactionmanager_name  = "transactionManager";
    /** transactionTemplate 类名称 */
    public static final String           transactiontemplate_name = "transactionTemplate";

    /** 数据源 */
    private DataSource                   dataSource;
    /** sqlSessionFactory */
    private SqlSessionFactory            sqlSessionFactory;
    /** 事务管理器 */
    private DataSourceTransactionManager dataSourceTransactionManager;
    /** 事务模板 */
    private TransactionTemplate          transactionTemplate;

    @PostConstruct
    public void init() {
        try {
            String driver = env.getProperty("datasource.driverClassName");
            String url = env.getProperty("datasource.url");
            String username = env.getProperty("datasource.username");
            String password = env.getProperty("datasource.password");

            String mapperLocations = env.getProperty("datasource.mybatis.mapperLocations");
            String typeAliasesPackage = env.getProperty("datasource.mybatis.typeAliasesPackage");

            Properties properties = new Properties();
            properties.setProperty("driverClassName", driver);
            properties.setProperty("url", url);
            properties.setProperty("username", username);
            properties.setProperty("password", password);

            //加载数据源
            dataSource = BasicDataSourceFactory.createDataSource(properties);

            //加载sqlSessionFactoryBean
            SqlSessionFactoryBean sqlBean = new SqlSessionFactoryBean();
            sqlBean.setDataSource(dataSource);
            sqlBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(mapperLocations));
            sqlBean.setTypeAliasesPackage(typeAliasesPackage);
            sqlSessionFactory = sqlBean.getObject();

            dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);

            transactionTemplate = new TransactionTemplate();
            transactionTemplate.setTransactionManager(dataSourceTransactionManager);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Bean(name = datasource_name)
    public DataSource createDataSourceBean() throws Exception {
        return getDataSource();
    }

    @Bean(name = sqlsessionfactory_name)
    public SqlSessionFactory createSqlSessionFactoryBean() throws Exception {
        return getSqlSessionFactory();
    }

    @Bean(name = transactionmanager_name)
    public DataSourceTransactionManager createTransactionManagerBean() throws Exception {
        return getDataSourceTransactionManager();
    }

    @Bean(name = transactiontemplate_name)
    public TransactionTemplate createTransactionTemplateBean() throws Exception {
        return getTransactionTemplate();
    }

    public DataSource getDataSource() {
        return dataSource;
    }

    public SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }

    public DataSourceTransactionManager getDataSourceTransactionManager() {
        return dataSourceTransactionManager;
    }

    public TransactionTemplate getTransactionTemplate() {
        return transactionTemplate;
    }

}

BaseMapper配置如下: 

public class BaseMapper {

    private SqlSessionFactory sqlSessionFactory;

    @Autowired
 public void setSqlsession(@Qualifier(DataSourceConfiguration.sqlsessionfactory_name) SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public SqlSession getSqlsession() {
        return sqlSessionFactory.openSession();
    }

}
 以上就实现了数据源配置 以及获取sqlsession 连接

3. 修改xml 的 namespace 为自定义 名称

4.  修改 sampleMapper ,NAME_SPACE 为我们刚才自定义的名称

5. 测试  。。。。哇。。。竟然出错了。

    

 于是,一顿百度 ,终于找到了问题所在 :

 Spring Boot的MVC默认配置中使用的 ViewResolver 为 ContentNegotiatingViewResolver,该视图解析器的功能是根据要请求的文档类型,来查找不同的视图以返回对应格式的文档。请求的文档类型即可以从请求头中的Accept中获取,也可以通过URI后缀名得到,如/querySample.htm即为请求HTML格式的文档,这两种方式分别对应着两种不同的Strategy(策略),默认为根据URI后缀名

因此,当请求 /querySample.htm 时,spring会查找/querySample对应的控制器,并得到其返回的文档类型为application/json, 然后判断它与后缀名.htm文档类型是否匹配,如果不匹配,就报HttpMediaTypeNotAcceptableException了。 

修改后重新测试 : 

    

成功查出数据 !

猜你喜欢

转载自my.oschina.net/u/3820486/blog/1812274