对于新手学习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 `comm_system_parms` 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