在《记一次搭建自己的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
了。
修改后重新测试 :
成功查出数据 !
最后加上 pom 依赖
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.0</version> </dependency>