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

       对于新手学习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 `` 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.mzph.cn/news/885914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5多媒体标签

文章目录 HTML5新增多媒体标签详解&#xff1a;视频标签与音频标签视频标签<video>音频标签<audio>代码案例 HTML5新增多媒体标签详解&#xff1a;视频标签与音频标签 HTML5引入了多项新特性&#xff0c;其中多媒体标签的引入为网页开发带来了革命性的变化。这些标…

12、Linux系统的网络基本设置

查看网络接口信息ifconfig ip addr/ip a #简单查看网络接口信息 ifconfig #表示只显示当前活跃的设备接口信息 ifconfig -a #查看当前主机所有的&#xff08;all&#xff09;网络设备&#xff0c;包括未运行的设备。 如我们查看本机网卡ens33的…

PHP:通往动态Web开发世界的桥梁

PHP&#xff0c;全名为“PHP: Hypertext Preprocessor”&#xff0c;是世界上最流行的服务器端脚本语言之一。它是动态网站开发的中流砥柱&#xff0c;用于构建从简单博客到复杂企业级应用的各种网络平台。在这篇文章中&#xff0c;我们将详细探讨PHP的起源、核心功能、开发流程…

react 中 FC 模块作用

React.FC 是一个泛型类型&#xff0c;用于定义函数组件的类型 一、类型定义和代码可读性 1. 明确组件类型 使用React.FC定义一个组件时&#xff0c;使得组件的输入&#xff08;props&#xff09;和输出&#xff08;返回的 React 元素&#xff09;都有明确的类型定义。 impo…

【Qt 蓝牙服务器实现】

在 Qt 中实现一个蓝牙服务器可以使用 Qt Bluetooth 模块。下面是一个基本的蓝牙服务器示例,它能够接受来自客户端的连接。 首先,请确保你已经安装了 Qt Bluetooth 模块并在项目文件中包含了相关库。 1. 项目文件 (.pro) 配置 在项目文件中添加以下行,以确保包含 Qt Bluet…

RabbitMQ高效的消息队列中间件原理及实践

RabbitMQ&#xff1a;高效的消息队列中间件及其 PHP 实现 一、什么是 RabbitMQ&#xff1f; RabbitMQ 是一个开源的消息队列中间件&#xff0c;使用 Erlang 编写&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议。它的主要功能是提供一种…

JDK1.8升级JDK不生效

最近因为项目原因&#xff0c;需要将jdk1.8升级到JDK11.升级发生了一个纠结的问题&#xff0c;就是cmd不生效。在此记录&#xff01; 项目中指定jdk 如果在android studio项目&#xff0c;可以单独指定该项目的jdk&#xff0c;而不用全局升级&#xff0c;可以做如下配置&#…

如何抓住鸿蒙生态崛起的机遇,解决开发挑战,创造更好的应用体验?

一、抓住鸿蒙生态崛起的机遇 深入了解鸿蒙系统的特性和优势 鸿蒙系统采用了全新的技术框架和编程语言ArkTS&#xff0c;具备高性能、高安全性和高弹性等特点。开发者需要熟悉这些特性&#xff0c;以便在开发过程中充分利用鸿蒙系统的优势。鸿蒙系统支持全场景打通、资源能力共享…

AI电商的创新应用

在AI技术的加持下&#xff0c;电商平台可以在购物推荐、会员分类、商品定价等方面实现创新应用&#xff0c;从而显著提高销售效率和用户体验。以下是如何具体运用AI技术来达成这些目标的详细阐述&#xff0c;以及为电商行业数字化转型提供的新思路和方法。 一、AI在购物推荐方…

八 Bean的生命周期

八、Bean的生命周期 8.1 什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负责对象的创建&#xff0c;对象的销毁等。 所谓的生命周期就是&#xff1a;对象从创建开始到最终销毁的整个过程。 什么时候创建Bean对象&#xff1f; 创建Bean对象的前后会调用什…

Javascript 笔记(二):闭包(2)与map知识点

需求 要写一个闹钟控件&#xff0c;分为小时和分钟两个部分。两个部分的逻辑是一样的&#xff0c;只有域不同所以为了提高代码利用率&#xff0c;就使用闭包来完成。 问题 function loop_tuple(){let index 0return function(tuple){index(index1)%3return tuple[index]} }…

RK3568硬解码并与Qt界面融合显示深入探究

1. 最近实在头疼&#xff0c;因为项目换了平台。折腾来折腾去&#xff0c;到今天算是把很多坑踩完了。 RK上实现硬解码方案一共有一下几种方式 1&#xff09;opencvgstreamer插件&#xff0c;采用硬解码&#xff0c;只能解码出图像&#xff0c;无法解出声音 2&#xff09;ff…

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview&#xff0c;在回顾复习一次webview相…

django博客项目实现站内搜索功能

Django博客站内搜索功能实现 1. 准备工作 确保Django项目已经创建好&#xff0c;并且有一个用于存储博客文章的模型&#xff08;例如Post&#xff09;。 2. 定义搜索表单 在应用目录下创建一个forms.py文件&#xff0c;定义一个搜索表单。 from django import formsclass …

OpenGL ES 共享上下文实现多线程渲染

OpenGL ES 共享上下文时,可以共享哪些资源? 共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenGL ES 和…

0087__DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区

DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区-CSDN博客

09C++结构体

/*结构体属于用户自定义的数据类型&#xff0c; 允许用户存储不同的数据类型, 语法:struct 结构体名{结构体成员列表} ;*/ //struct 结构体名 变量名 #include <iostream> #include <string> using namespace std; struct student { string name; int age;int s…

python第七次作业

01.设计一个函数&#xff0c;可以传入一个或多个单词的字符串&#xff0c;并返回该字符串&#xff0c;但所有五个或更多字母的单词都前后颠倒 a input("输入:") print(a) #将一句话以空格为分界拆分为单个单词 b a.split(" ") ls_1 [] ls_2 []for i i…

C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信

1. 前言 RabbitMQ是一个流行的开源消息队列系统&#xff0c;支持多种消息协议&#xff0c;广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中&#xff0c;我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…

【蓝桥杯 2021 省 B2】特殊年份

题目描述&#xff1a; 今年是 2021 年&#xff0c;2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1&#xff0c;我们称满足这样条件的年份为特殊年份。 输入 5 个年份&#xff0c;请计算这里面有多少个特殊年份。 输入格式 输入 5 行&#xff0c;每行一个 4 位十…