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

devtools/2024/11/20 14:37:45/

       对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplate进行数据库开发。另外不管用那种开发方式,都需要进行数据库链接的配置。

       本文数据库链接采用的阿里的druid数据源,数据库采用Mysql数据库。首先我们在application-dev.yml中配置数据库链接,这里定义了两个数据源,不过为了演示,两个数据源都指向的同一个数据库,下面是openjweb-sys工程下的application-dev.yml:

server:port: 8001spring:datasource:ds1:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/erpusername: rootpassword: rootds2:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/erpusername: rootpassword: 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;

@Configurationpublic 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){//查询countInteger 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);}}//如果结果集顶多一条记录,查询一条记录可使用queryForMapMap<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/mastericon-default.png?t=O83Ahttps://github.com/openjweb/cloud/tree/master


http://www.ppmy.cn/devtools/135503.html

相关文章

Java策略模式应用实战

Java策略模式应用实战 推送内容并预检 import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger;// DTO class class DataDTO {private String type;…

【大数据学习 | flume】flume的概述与组件的介绍

1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 Flume两个版本区别&#xff1a; ​ 1&…

Flink新版Source接口源码解析

目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…

内存、显存和GPU在Transformer架构中承担什么计算任务

目录 内存、显存和GPU在Transformer架构中承担什么计算任务 一、内存、显存和GPU的区别 二、在Transformer架构中的计算任务 内存、显存和GPU在Transformer架构中承担什么计算任务 是计算机系统中重要的组成部分,它们在Transformer架构中承担着不同的计算任务。以下是对这…

单片机学习笔记 5. 数码管静态显示

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~ 目录 0、实现的功能 1、Keil工程 1-1 数码管显示原理 1-2 静态与动态显示 1-3 74HC573锁存器的工作原理 1-…

【GNU】反汇编工具objdump

1、什么是 objdump objdump 是 GNU Binutils 工具集中的一个命令行工具&#xff0c;用于分析和显示目标文件&#xff08;如二进制文件、目标文件、静态库和可执行文件&#xff09;的详细信息。它是开发调试、优化和逆向工程的利器。他可以做到&#xff1a; 反汇编功能&#x…

01_MinIO部署(Windows单节点部署/Docker化部署)

单节点-Windows环境安装部署 在Windows环境安装MinIO&#xff0c;主要包含两个东西&#xff1a; MinIO Server&#xff08;minio.exe&#xff09;&#xff1a;应用服务本身MinIO Client&#xff08;mc.exe&#xff09;&#xff1a;MinIO客户端工具&#xff08;mc&#xff09;…

linux中的SIGPIPE信号有什么用?

信号概述 SIGPIPE是一种信号&#xff0c;信号是Unix和类Unix系统中用于进程间通信的一种机制&#xff0c;用于通知进程发生了某个特定的事件。当一个进程接收到SIGPIPE信号时&#xff0c;它表明在管道或者套接字的写入操作出现了问题。 在管道中的应用 管道原理简介&#xff1…