对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplate进行数据库开发。另外不管用那种开发方式,都需要进行数据库链接的配置。
本文数据库链接采用的阿里的druid数据源,数据库采用Mysql数据库。首先我们在application-dev.yml中配置数据库链接,这里定义了两个数据源,不过为了演示,两个数据源都指向的同一个数据库,下面是openjweb-sys工程下的application-dev.yml:
server:
port: 8001
spring:
datasource:
ds1:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/erp
username: root
password: root
ds2:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/erp
username: root
password: root
在主工程的pom.xml中引入了druid依赖和springframework的jdbc依赖:
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
因为考虑到不是每个子工程都需要链接mysql数据库,所以mysql的依赖放在openjweb-sys的pom.xml中,不过考虑到配置类的都放到starter模块里,所以openjweb-sys里配置了依赖datasource-openjweb-starter:
<dependency>
<groupId>org.openjweb</groupId>
<artifactId>datasource-openjweb-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
而在datasource-openjweb-starter的pom.xml里引入了mysql依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.version}</version>
<scope>runtime</scope>
</dependency>
其中${mysql.connector.version}在主工程的pom.xml中的配置:
<mysql.connector.version>8.0.27</mysql.connector.version>
接下来就可以开发数据库配置类和调用示例,首先在openjweb-sys的org.openjweb.sys.config下面开发一个DataSourceConfig类:
package org.openjweb.sys.config;
import javax.sql.DataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.pool.DruidDataSource;
@Slf4j
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "dsOne")
@ConfigurationProperties("spring.datasource.ds1")
DataSource dsOne() {
DruidDataSource ds1 = new DruidDataSource();
return ds1;
}
//@Bean
@Bean(name = "dsTwo")
@ConfigurationProperties("spring.datasource.ds2")
DataSource dsTwo() {
DruidDataSource ds2 = new DruidDataSource();
return ds2;
}
//为第一个数据源绑定一个事务管理器
@Bean(name = "transactionManager1")
public DataSourceTransactionManager dataSourceTransactionManagerOne(@Qualifier("dsOne") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "transactionManager2")
public DataSourceTransactionManager dataSourceTransactionManagerTwo(@Qualifier("dsTwo") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
其中@ConfigurationProperties("spring.datasource.ds1")是自动从application-dev.yml的配置中读取ds1的设置注入到组件中,ds2同理。
然后开发JdbcTemplateConfig类:
package org.openjweb.sys.config;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
public class JdbcTemplateConfig {
private static JdbcTemplate defaultJdbcTemplate = null;
public static JdbcTemplate getDefaultJdbcTemplate()
{
return defaultJdbcTemplate;
}
@Bean(name = "jdbcTemplateOne")
JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
this.defaultJdbcTemplate = jdbcTemplate;
return jdbcTemplate;
//return new JdbcTemplate(dataSource);
}
@Bean(name = "jdbcTemplateTwo")
JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
在上面的类中定义了2个Bean,分别指向了dsOne和dsTwo两个数据源。
接下来可以利用这2个JdbcTemplate开发接口应用。
现在在openjweb-sys模块的org.openjweb.sys.api下创建一个演示接口类为DemoDBApi:
package org.openjweb.sys.api;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* http://localhost:8001/demo/queryParam?parmName=version
* */
@RestController
@RequestMapping("/demo")
@Slf4j
public class DemoDBApi {
@Resource(name = "jdbcTemplateOne")
private JdbcTemplate service;
@Resource(name = "jdbcTemplateTwo")
private JdbcTemplate service2;
@GetMapping("queryParam")
public JSONObject queryParam(@RequestParam(value = "parmName")String parmName){
//查询count
Integer count = service.queryForObject("select count(*) from comm_system_parms",Integer.class);
JSONObject json = new JSONObject();
json.put("num",count);
//下面按查询条件查询--查单个值
parmName = "version";//因为是演示程序,这里不从请求中获取参数
String sql = "select parm_value from comm_system_parms where parm_name=?";
String parmValue = service.queryForObject(sql,new Object[]{parmName},String.class);
log.info(parmValue);//使用log.info需要在类前面加@Slf4j 注解
//查询列表
JSONArray jsonArray = new JSONArray();
String parmLike ="version%";
String sql1 = "select parm_name,parm_value from comm_system_parms where parm_name like ?";
List<Map<String,Object>> list = service.queryForList(sql1,new Object[]{parmLike});
if(list!=null&&list.size()>0){
for (Map<String,Object> data:list ) {
JSONObject dataJson = new JSONObject();
dataJson.put("parmName",data.get("parm_name")==null?"":data.get("parm_name").toString());
dataJson.put("parmValue",data.get("parm_value")==null?"":data.get("parm_value").toString());
jsonArray.add(dataJson);
}
}
//如果结果集顶多一条记录,查询一条记录可使用queryForMap
Map<String,Object> map = null;
//这次使用第二个数据源(为了演示方便,链接配置实际指向一个数据库)
map = service2.queryForMap("select * from comm_system_parms where parm_name=?",new Object[]{parmName});
if(map!=null){
log.info("map查到数据:");
log.info(map.get("parm_value")==null?"":map.get("parm_value").toString());
}
json.put("count",count);
json.put("data",jsonArray);
return json;
}
}
在上面的例子中分别演示了select count(*)、查询结果为单一字符串、查询结果为数据列表(queryForList)、查询结果为一条记录多个字段(queryForMap)等。查看演示效果可启动SpringBoot后访问:
http://localhost:8001/demo/queryParam?parmName=version
对于新手如果还不了解mybatis或mybatis-plus可使用jdbcTemplate进行快速开发,当然如果在生产环境中使用的话还要考虑到接口调用的权限。下面给出本示例的comm_system_parm表结构以方便大家使用:
CREATE TABLE `comm_system_parms` (
`pk_id` varchar(40) NOT NULL,
`row_id` varchar(40) NOT NULL,
`sort_no` bigint(20) DEFAULT NULL,
`create_dt` varchar(23) DEFAULT NULL,
`update_dt` varchar(23) DEFAULT NULL,
`create_uid` varchar(32) DEFAULT NULL,
`update_uid` varchar(32) DEFAULT NULL,
`data_flg` varchar(6) DEFAULT NULL,
`flow_status` varchar(16) DEFAULT NULL,
`obj_name` varchar(40) DEFAULT NULL,
`master_row_id` varchar(40) DEFAULT NULL,
`flow_trans_id` varchar(40) DEFAULT NULL,
`parm_old_values` varchar(255) DEFAULT NULL,
`parm_name` varchar(40) NOT NULL,
`parm_desc` varchar(255) DEFAULT NULL,
`parm_value` varchar(2000) DEFAULT NULL,
PRIMARY KEY (`pk_id`),
UNIQUE KEY `parm_name` (`parm_name`),
KEY `idx_1730778572260000923` (`parm_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `` VALUES ('85', '61a31b6fae8c4cb5a3ff2e343e7402b1', NULL, '2012-05-01 18:32:59', '2016-05-25 09:35:01', 'admin', 'admin', NULL, '00', NULL, NULL, '1335868379171000735', NULL, 'version', '平台版本号', '3.6');
项目实例地址见github:https://github.com/openjweb/cloud/tree/masterhttps://github.com/openjweb/cloud/tree/master