百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

10《Spring Boot 入门教程》使用 JdbcTemplate

lipiwang 2024-10-22 15:45 5 浏览 0 评论

1. 前言

如果我们的项目非常简单,仅仅是对数据库几张表进行简单的增删改查操作,那么实际上直接使用 JDBC 操作数据库就可以了。

由于 JDBC 中有很多模板代码,每次都是加载驱动-建立数据库连接-查询或操作数据库-关闭数据库连接这样的模板代码, Spring 提供了 JdbcTemplate 对原生 JDBC 进行了简单的封装。

本篇文章,我们来实现一个完整的、基于 Spring Boot + JdbcTemplate + MySQL 的商品管理项目实例。

2. 技术选型

数据库使用 MySQL ,商品信息存储到商品表内即可。

后端项目使用 Spring Boot ,通过控制器暴露 RESTful 风格的接口供前端调用,通过 JdbcTemplate 实现对数据库的操作。

前端项目使用 Bootstrap 开发,通过 jQuery 提供的 $.ajax 方法访问后端接口。

3. 数据库模块实现

只需要一张商品表,保存商品相关的信息即可。我们使用 Navicat 新建数据库 shop ,并在其中新建数据表 goods 。

实例:

CREATE TABLE `goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一编号',
  `name` varchar(255) DEFAULT '' COMMENT '商品名称',
  `price` decimal(10,2) DEFAULT '0.00' COMMENT '商品价格',
  `pic` varchar(255) DEFAULT '' COMMENT '图片文件名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Tips: 默认值最好不要采用 NULL , NULL 会影响索引的效率,而且在查询时需要用 is null 或 is not null 筛选,容易被忽略。

4. Spring Boot 后端实现

我们新建一个 Spring Boot 项目,通过 JdbcTemplate 访问数据库,同时接口依旧采用 RESTful 风格。

4.1 使用 Spring Initializr 创建项目

Spring Boot 版本选择 2.2.5 ,Group 为 com.imooc , Artifact 为 spring-boot-jdbctemplate ,生成项目后导入 Eclipse 开发环境。

4.2 引入项目依赖

我们引入 Web 项目依赖、热部署依赖。由于本项目需要访问数据库,所以引入 spring-boot-starter-jdbc 依赖和 mysql-connector-java 依赖。 pom.xml 文件中依赖项如下:

实例:

        <!-- 热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- jdbc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- myql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

4.3 建立项目结构

依次新建以下类结构

  • GoodsDo:商品类,对应 goods 商品表;
  • GoodsDao:商品数据访问类,用于访问数据库;
  • GoodsService:商品服务类,用于封装对商品的操作;
  • GoodsController:商品控制器类,用于对外提供 HTTP 接口;
  • CorsConfig:跨域配置类,允许前端页面跨域访问后端接口。

此时项目目录如下:

4.4 开发商品类

开发商品类 GoodsDo ,代码如下:

实例:

/**
 * 商品类
 */
public class GoodsDo {
    /**
     * 商品id
     */
    private Long id;
    /**
     * 商品名称
     */
    private String name;
    /**
     * 商品价格
     */
    private String price;
    /**
     * 商品图片
     */
    private String pic;
    // 省略get set方法

4.5 开发商品数据访问类

商品数据访问类 GoodsDao 是本篇的重点,通过注入 JdbcTemplate 类型的组件,实现数据库操作。注入代码如下:

实例:

/**
 * 商品数据库访问类
 */
@Repository // 标注数据访问类
public class GoodsDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
}

由于我们已经引入了 spring-boot-starter-jdbc 依赖,所以 Spring Boot 项目已经为我们自动配置了 JdbcTemplate 组件,我们拿来即用即可,这就是 Spring Boot 的强大之处!

此时我们启动应用,发现报错信息:

***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class

此处我们可以再度体会 Spring Boot 强大之处, Spring Boot 在为我们自动配置了 JdbcTemplate 之余,还在尝试自动为我们配置数据源 DataSource ,即 JdbcTemplate 要操作的真实数据库信息。报错信息已经提示我们,没有合适的数据库驱动、也没有合适的 URL 属性。

4.6 配置数据源信息

我们只需要通过配置文件指定数据源信息, Spring Boot 就可以识别配置,并加载到数据源组件中。 JdbcTemplate 也可以自动识别该数据源,从而实现对数据库的操作。配置文件信息如下:

实例:

# 配置数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置数据库url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
# 配置数据库用户名
spring.datasource.username=root
# 配置数据库密码
spring.datasource.password=123456

需要注意的是,我们在 URL 配置中指定了编码方式,这样可以防止出现数据库中文乱码情况。同时指定了时区为北京时间所在的东八区(GMT%2B8),避免因时区问题导致错误。

此时再次启动 Spring Boot 应用,正常运行,说明我们的数据源配置生效了。

4.7 通过 JdbcTemplate 操作数据库

通过 JdbcTemplate 进行增删改查操作非常简洁, Spring 官方封装了原生 JDBC 中冗余的模板代码,使数据库访问操作更加简洁,代码如下:

实例:

/**
 * 商品数据库访问类
 */
@Repository // 标注数据访问类
public class GoodsDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 新增
     */
    public void insert(GoodsDo goods) {
        jdbcTemplate.update("insert into goods(name,price,pic)values(?,?,?)", goods.getName(), goods.getPrice(),
                goods.getPic());
    }

    /**
     * 删除
     */
    public void delete(Long id) {
        jdbcTemplate.update("delete from goods where id =?", id);
    }

    /**
     * 更新
     */
    public void update(GoodsDo goods) {
        jdbcTemplate.update("update goods set name=?,price=?,pic=? where id=?", goods.getName(), goods.getPrice(),
                goods.getPic(), goods.getId());
    }

    /**
     * 按id查询
     */
    public GoodsDo getById(Long id) {
        return jdbcTemplate.queryForObject("select * from goods where id=?", new RowMapper<GoodsDo>() {
            @Override
            public GoodsDo mapRow(ResultSet rs, int rowNum) throws SQLException {
                GoodsDo goods = new GoodsDo();
                goods.setId(rs.getLong("id"));
                goods.setName(rs.getString("name"));
                goods.setPrice(rs.getString("price"));
                goods.setPic(rs.getString("pic"));
                return goods;
            }
        }, id);
    }

    /**
     * 查询商品列表
     */
    public List<GoodsDo> getList() {
        return jdbcTemplate.query("select * from goods", new RowMapper<GoodsDo>() {
            @Override
            public GoodsDo mapRow(ResultSet rs, int rowNum) throws SQLException {
                GoodsDo goods = new GoodsDo();
                goods.setId(rs.getLong("id"));
                goods.setName(rs.getString("name"));
                goods.setPrice(rs.getString("price"));
                goods.setPic(rs.getString("pic"));
                return goods;
            }
        });
    }
}

getById 和 getList 方法中使用了匿名内部类,如果不了解的可以先去学习下相关知识。

4.8 开发商品服务类

商品服务类比较简单,直接调用 GoodsDao 完成商品服务方法封装即可。

实例:

/**
 * 商品服务类
 */
 @Service
public class GoodsService {
    @Autowired
    private GoodsDao goodsDao;
  
    /**
     * 新增商品
     */
    public void add(GoodsDo goods) {
        goodsDao.insert(goods);
    }
    
    /**
     * 删除商品
     */
     public void remove(Long id) {
        goodsDao.delete(id);
     }
     
    /**
     * 编辑商品信息
     */
    public void edit(GoodsDo goods) {
        goodsDao.update(goods);
    }

    /**
     * 按id获取商品信息
     */
    public GoodsDo getById(Long id) {
        return goodsDao.getById(id);
    }

    /**
     * 获取商品信息列表
     */
    public List<GoodsDo> getList() {
        return goodsDao.getList();
    }
}

4.9 开发商品控制器类

我们还是遵循之前的 RESTful 风格,制定后端访问接口如下:

动词

接口含义

接口地址

GET

查询商品(id=1)信息

http://127.0.0.1:8080/goods/1

GET

查询商品列表信息

http://127.0.0.1:8080/goods

POST

新增商品

http://127.0.0.1:8080/goods

PUT

修改商品(id=1)信息

http://127.0.0.1:8080/goods/1

DELETE

删除商品(id=1)

http://127.0.0.1:8080/goods/1

我们根据上面的接口列表,实现控制器类代码如下:

实例:

/**
 * 商品控制器类
 */
@RestController
public class GoodsController {
    @Autowired
    private GoodsService goodsService;
    /**
     * 按id获取商品信息
     */
    @GetMapping("/goods/{id}")
    public GoodsDo getOne(@PathVariable("id") long id) {
        return goodsService.getById(id);
    }
    /**
     * 获取商品列表
     */
    @GetMapping("/goods")
    public List<GoodsDo> getList() {
        return goodsService.getList();
    }
    /**
     * 新增商品
     */
    @PostMapping("/goods")
    public void add(@RequestBody GoodsDo goods) {
        goodsService.add(goods);
    }
    /**
     * 编辑商品
     */
    @PutMapping("/goods/{id}")
    public void update(@PathVariable("id") long id, @RequestBody GoodsDo goods) {
        // 修改指定id的博客信息
        goods.setId(id);
        goodsService.edit(goods);
    }
    /**
     * 移除商品
     */
    @DeleteMapping("/goods/{id}")
    public void delete(@PathVariable("id") long id) {
        goodsService.remove(id);
    }
}

4.10 开发跨域配置类

由于我们是前后端分离的项目开发方式,所以需要为 Spring Boot 添加跨域配置类:

实例:

/**
 * 跨域配置类
 */
@Configuration
public class CorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")// 对所有请求路径
                        .allowedOrigins("*")// 允许所有域名
                        .allowCredentials(true)// 允许cookie等凭证
                        .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH")// 允许所有方法
                        .maxAge(3600);
            }
        };
    }
}

5. 前端页面开发

本节主要介绍 Spring Boot 中 JdbcTemplate 的用法,所以前端页面仅给出代码和注释,不再进行详细介绍了。

前端只有一个页面,使用 Bootstrap 的样式和插件,通过 jQuery 的 $.ajax 方法访问后端接口,逻辑并不复杂。

此处简单展示下浏览商品部分的前端代码,感兴趣的同学可以从 Git仓库 查看完整代码。

实例:

    //浏览商品
    function viewGoods() {
      var row = "";
      //先清空表格
      $('#GoodsTable').find("tr:gt(0)").remove();
      $.ajax({
        type: "GET",
        url: "http://127.0.0.1:8080/goods",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (res) {
          console.log(res);
          $.each(res, function (i, v) {
            row = "<tr>";
            row += "<td>" + v.id + "</td>";
            row += "<td>" + v.name + "</td>";
            row += "<td>" + v.price + "</td>";
            row += "<td>" + v.pic + "</td>";
            row +=
              "<td><a class='btn btn-primary btn-sm' href='javascript:editGoods(" + v.id + ")' >编辑</a>";
            row +=
              "<a class='btn btn-danger btn-sm' href='javascript:removeGoods(" + v.id + ")' >删除</a></td>";
            row += "</tr>";
            console.log(row);
            $("#GoodsTable").append(row);
          });
        },
        error: function (err) {
          console.log(err);
        }
      });
    }
 

6. 项目效果

直接使用浏览器打开前端页面,效果如下:

浏览商品

新增商品

编辑商品

7. 小结

本篇重点演示了 Spring Boot 中使用 JdbcTemplate 的方法。

基于 Spring Boot 自动装配的功能,我们只需要引入相应的依赖,编写必要的数据库参数配置,即可直接使用 JdbcTemplate 。所谓开箱即用,就是只需必要的操作,就可以直接到达可用的境界。

相关推荐

ubuntu单机安装open-falcon极度详细操作

备注:以下操作均由本人实际操作并得到验证,喜欢的同学可尝试操作安装。步骤一1.1环境准备(使用系统:ubuntu18.04)1.1.1安装redisubuntu下安装(参考借鉴:https://...

Linux搭建promtail、loki、grafana轻量日志监控系统

一:简介日志监控告警系统,较为主流的是ELK(Elasticsearch、Logstash和Kibana核心套件构成),虽然优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,...

一文搞懂,WAF阻止恶意攻击的8种方法

WAF(Web应用程序防火墙)是应用程序和互联网流量之间的第一道防线,它监视和过滤Internet流量以阻止不良流量和恶意请求,WAF是确保Web服务的可用性和完整性的重要安全解决方案。它...

14配置appvolume(ios14.6配置文件)

使用AppVolumes应用程序功能,您可以管理应用程序的整个生命周期,包括打包、更新和停用应用程序。您还可以自定义应用程序分配,以向最终用户提供应用程序的特定版本14.1安装appvolume...

目前流行的缺陷管理工具(缺陷管理方式存在的优缺点)

摘自:https://blog.csdn.net/jasonteststudy/article/details/7090127?utm_medium=distribute.pc_relevant.no...

开源数字货币交易所开发学习笔记(2)——SpringCloud

前言码云(Gitee)上开源数字货币交易所源码CoinExchange的整体架构用了SpringCloud,对于经验丰富的Java程序员来说,可能很简单,但是对于我这种入门级程序员,还是有学习的必要的...

开发JAX-RPC Web Services for WebSphere(下)

在开发JAX-RPCWebServicesforWebSphere(上)一文中,小编为大家介绍了如何创建一个Web服务项目、如何创建一个服务类和Web服务,以及部署项目等内容。接下来小编将为大...

CXF学习笔记1(cxf client)

webservice是发布服务的简单并实用的一种技术了,个人学习了CXF这个框架,也比较简单,发布了一些笔记,希望对笔友收藏并有些作用哦1.什么是webServicewebService让一个程序可...

分布式RPC最全详解(图文全面总结)

分布式通信RPC是非常重要的分布式系统组件,大厂经常考察的Dubbo等RPC框架,下面我就全面来详解分布式通信RPC@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》...

Oracle WebLogic远程命令执行0day漏洞(CVE-2019-2725补丁绕过)预警

概述近日,奇安信天眼与安服团队通过数据监控发现,野外出现OracleWebLogic远程命令执行漏洞最新利用代码,此攻击利用绕过了厂商今年4月底所发布的最新安全补丁(CVE-2019-2725)。由...

Spring IoC Container 原理解析(spring中ioc三种实现原理)

IoC、DI基础概念关于IoC和DI大家都不陌生,我们直接上martinfowler的原文,里面已经有DI的例子和spring的使用示例《InversionofControlContainer...

Arthas线上服务器问题排查(arthas部署)

1Arthas(阿尔萨斯)能为你做什么?这个类从哪个jar包加载的?为什么会报各种类相关的Exception?我改的代码为什么没有执行到?难道是我没commit?分支搞错了?遇到问题无法在...

工具篇之IDEA功能插件HTTP_CLENT(idea2021插件)

工具描述:Java开发人员通用的开发者工具IDEA集成了HTTPClient功能,之后可以无需单独安装使用PostMan用来模拟http请求。创建方式:1)简易模式Tools->HTTPCl...

RPC、Web Service等几种远程监控通信方式对比

几种远程监控通信方式的介绍一.RPCRPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.meth...

《github精选系列》——SpringBoot 全家桶

1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...

取消回复欢迎 发表评论: