当前位置: 首页 > news >正文

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.mrgr.cn/news/71187.html

相关文章:

  • React diff算法和Vue diff算法的主要区别
  • 丹摩征文活动 | 0基础带你上手经典目标检测模型 Faster-Rcnn
  • JMeter基础篇
  • Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别
  • 网络技术-OpenFlow协议介绍和OVS之间的关系
  • VMware虚拟机安装Windows11保姆级教程(最新步骤+踩坑)
  • 【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-小蓝的目标
  • 国标GB28181-2022平台EasyGBS国标GB28181软件在GB/T28181协议中的加密措施
  • 2024要如何对公司CAD图纸进行加密?十种方法加密保护图纸!
  • GitHub4.2k Java开源神器一个免费的基于JNA的Java操作系统和硬件信息库
  • 重磅!Pubmed停止更新了?
  • 反沙箱 反虚拟机的一些笔记
  • 【Linux实践2】实验三:死锁的避免
  • 系统架构师-考点梳理
  • uniapp vuex的使用
  • Transformer(三):论文 Attention Is All You Need
  • 【2024最新】渗透测试工具大全(超详细),收藏这一篇就够了!
  • 【comfyui教程】comfyui攻略:故障报错应对指南!
  • 神经网络算法
  • 基于51单片机俄罗斯方块游戏—可暂停
  • 安卓全屏实现
  • 【锁】聊一聊ReentrantLock 和 Synchronized 的区别
  • 丹摩征文活动|CogVideoX-2b:从安装到上线,轻松搞定全过程!
  • QML —— 圆形波浪进度条控件(附上源码)
  • docker save 和 docker load介绍