IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

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

相关推荐
ZVAyIVqt0UFji32 分钟前
go-zero负载均衡实现原理
运维·开发语言·后端·golang·负载均衡
SomeB1oody1 小时前
【Rust自学】4.1. 所有权:栈内存 vs. 堆内存
开发语言·后端·rust
AI人H哥会Java3 小时前
【Spring】Spring的模块架构与生态圈—Spring MVC与Spring WebFlux
java·开发语言·后端·spring·架构
毕设资源大全4 小时前
基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】
java·数据库·vue.js·spring boot·后端·mysql·html
Watermelon_Mr4 小时前
Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器
java·后端·spring
唐墨1234 小时前
golang自定义MarshalJSON、UnmarshalJSON 原理和技巧
开发语言·后端·golang
凡人的AI工具箱4 小时前
每天40分玩转Django:Django测试
数据库·人工智能·后端·python·django·sqlite
qyq14 小时前
Django框架与ORM框架
后端·python·django
无奈ieq5 小时前
Scala快速入门+示例
开发语言·后端·scala
阿Q说代码6 小时前
合合信息:视觉内容安全技术的前沿进展与应用
后端·安全