【Spring5】使用JdbcTemplate操作mysql数据库

news2025/7/17 11:25:52

在这里插入图片描述


文章目录

  • 1 JdbcTemplate简介及操作准备
  • 2 添加操作
  • 3 修改与删除操作
  • 4 数据库查询操作
    • 4.1 返回一个值
    • 4.2 返回对象
    • 4.3 返回集合
  • 5 批量操作
    • 5.1 批量添加与修改
    • 5.2 批量修改与批量删除
  • 写在最后


1 JdbcTemplate简介及操作准备

Spring框架对JDBC进行封装,使用JdbcTemplate方便对数据库的操作。

操作准备:

1.导入相关依赖,文末附下载链接。
在这里插入图片描述

2.创建数据库,便于使用。以在mysql数据库中创建user_db为例。
在这里插入图片描述

3.配置xml文件,添加数据库连接相关信息,如密码用户名等。(连接池的配置)
在这里插入图片描述

4.配置JdbcTemplate对象,注入DataSource。
在这里插入图片描述

5.创建一个Service类,创建Dao类,在Dao类中注入jdbcTemplate对象。需要开启组件扫描,完整的spring配置文件如下:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 组件扫描 -->
    <context:component-scan base-package="com.ithxh.spring5"></context:component-scan>


    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          destroy-method="close">
        <property name="url" value="jdbc:mysql:///user_db"/>
        <property name="username" value="root"/>
        <property name="password" value="111"/>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    </bean>

    <!-- JdbcTemplate对象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 注入dataSource -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

6.在各类上添加对应的注解。
在这里插入图片描述

在这里插入图片描述

至此,准备工作就完成啦!


2 添加操作

1.在user_db数据库中创建t_user表,sql语句如下:

CREATE TABLE t_user(
    user_id BIGINT PRIMARY KEY NOT NULL ,
    username VARCHAR(100) NOT NULL ,
    ustatus VARCHAR(50) NOT NULL
)

2.新建一个包entity用于存放实体类,创建t_user表对应的实体类User,并添加相应的set、get方法。
在这里插入图片描述

3.编写service和dao,在dao中进行数据库的添加操作。 UserDao接口声明add方法,UserService进行添加操作,而 UserDaoImp具体实现数据库的添加操作。 需要使用jdbcTemplate的update方法。
在这里插入图片描述
第一个参数为编写的sql语句,第二个参数为可变参数,用于设置值。

在这里插入图片描述
具体代码如下:
UserDao

import com.ithxh.spring5.entity.User;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 */
public interface UserDao {
    void add(User user);
}

UserDaoImp

import com.ithxh.spring5.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 */
@Repository
public class UserDaoImp implements UserDao{

    //注入JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    //实现添加的方法
    @Override
    public void add(User user) {
        //编写sql语句
        String sql = "insert into t_user values(?,?,?)";
        //调用方法实现
        Object[] args = {user.getUserId(), user.getUsername(), user.getUstatus()};
        int update = jdbcTemplate.update(sql, args);//返回影响行数
        System.out.println("影响的行数: " + update);
    }
}

UserService

import com.ithxh.spring5.dao.UserDao;
import com.ithxh.spring5.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 */
@Service
public class UserService {

    //注入dao
    @Autowired
    private UserDao userDao;

    //添加的方法
    public void addUser(User user){
        userDao.add(user);
    }
}

4.编写测试类,尝试给表添加数据。

    @Test
    public void testJdbcTemplate(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = context.getBean("userService", UserService.class);
        User user = new User();
        user.setUserId("120");
        user.setUsername("黄小黄");
        user.setUstatus("true");
        userService.addUser(user);
    }

在这里插入图片描述
请添加图片描述


3 修改与删除操作

修改与删除操作大体与添加操作一致,只需要修改相应的sql语句。这里对核心代码进行简述:

修改和删除操作

UserDaoImp中实现修改和删除的方法

    //实现修改的方法
    @Override
    public void update(User user) {
        String sql = "update t_user set user_id = ?, username = ?, ustatus = ?";
        Object[] args = {user.getUserId(), user.getUsername(), user.getUstatus()};
        int update = jdbcTemplate.update(sql, args);
        System.out.println("影响的行数: " + update);
    }

    //实现删除的方法
    @Override
    public void delete(String id) {
        String sql = "delete from t_user where user_id = ?";
        int update = jdbcTemplate.update(sql, id);
        System.out.println(update);
    }

需要注意,UserDao应该对修改和删除方法进行声明,UserService中则需要像这样,调用UserDaoImp中的方法:
在这里插入图片描述

测试修改:

    @Test
    public void testJdbcTemplate(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = context.getBean("userService", UserService.class);
        User user = new User();
        user.setUserId("111");
        user.setUsername("懒羊羊");
        user.setUstatus("true");
        userService.updateUser(user);
    }

在这里插入图片描述

测试删除:

    @Test
    public void testJdbcTemplate(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = context.getBean("userService", UserService.class);
        String id = "111";
        userService.deleteUser(id);
    }

在这里插入图片描述


4 数据库查询操作

4.1 返回一个值

示例:查询表中有多少条记录,返回的是一个值,表示表中数据的条数

    //查询有多少条记录
    @Override
    public int findCountUser() {
        String sql = "select count(*) from t_user";
        Integer res = jdbcTemplate.queryForObject(sql, Integer.class);//第二个参数是返回值类型
        return res;
    }

4.2 返回对象

示例:查询用户详细信息。

通过jdbcTemlate中的queryForObject方法实现:
在这里插入图片描述

  • 第一个参数:sql语句;
  • 第二个参数:RowMapper,是一个接口,返回不同类型的数据,使用这个接口的实现类完成数据的封装。
  • 第三个参数:sql语句值。

首先先在数据库中t_user表插入如下信息:

INSERT INTO t_user VALUES (111, '黄小黄', 'true');
INSERT INTO t_user VALUES (222, '懒羊羊', 'true');

在UserDao中声明,UserDaoImp中实现查询方法,UserService使用:

    //查询返回对象
    @Override
    public User findUserInfo(String id) {
        String sql = "select * from t_user where user_id = ?";
        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);
        return user;
    }

查询测试:

    @Test
    public void testJdbcTemplate(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = context.getBean("userService", UserService.class);
        User one = userService.findOne("111");
        System.out.println(one);
    }

在这里插入图片描述

4.3 返回集合

与返回对象类似,这里以查询user信息为例,返回t_user中的所有记录

通过jdbcTemlate中的query方法实现:
在这里插入图片描述

  • 第一个参数:sql语句;
  • 第二个参数:RowMapper,是一个接口,返回不同类型的数据,使用这个接口的实现类完成数据的封装。
  • 第三个参数:sql语句值(没有可以省略)。

在UserDao中声明,UserDaoImp中实现查询方法,UserService使用:

    //查询返回集合
    @Override
    public List<User> findAllUser() {
        String sql = "select * from t_user";
        List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
        return userList;
    }

测试并遍历:

    @Test
    public void testJdbcTemplate(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = context.getBean("userService", UserService.class);
        List<User> userList = userService.findAll();
        for (User user :
                userList) {
            System.out.println(user);
        }
    }

在这里插入图片描述


5 批量操作

对表中多条记录进行操作,批量操作主要通过javaTemplate中的batchUpdate方法实现
在这里插入图片描述

  • 第一个参数:sql语句;
  • 第二个参数:List集合,添加多条记录数据。

5.1 批量添加与修改

UserDaoImp类中批量添加的代码如下:

    //批量添加
    @Override
    public void batchAddUser(List<Object[]> batchArgs) {
        String sql = "insert into t_user values(?,?,?)";
        int[] update = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println("影响的行数: " + update);
    }

测试类中批量添加:

    @Test
    public void testJdbcTemplate(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = context.getBean("userService", UserService.class);
        //向表中添加三条记录
        List<Object[]> batchArgs = new ArrayList<>();
        Object[] o1 = {1, "nezuko", "true"};
        Object[] o2 = {2, "dog", "true"};
        Object[] o3 = {3, "participant", "true"};
        batchArgs.add(o1);
        batchArgs.add(o2);
        batchArgs.add(o3);
        userService.batchAdd(batchArgs);
    }

在这里插入图片描述
在这里插入图片描述

5.2 批量修改与批量删除

批量修改与批量删除与批量添加类似,只需要更改相应的sql语句,这里只展示核心代码:

批量修改

    //批量修改
    @Override
    public void batchUpdate(List<Object[]> batchArgs) {
        String sql = "update t_user set username = ?, ustatus = ? where user_id = ?";
        int[] update = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println("影响的行数: " + Arrays.toString(update));
    }

批量删除

    //批量删除
    @Override
    public void batchDelete(List<Object[]> batchArgs) {
        String sql = "delete from t_user where user_id = ?";
        int[] update = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println("影响的行数: " + Arrays.toString(update));
    }

写在最后

 至此,使用JdbcTemplate进行数据库简单的增删改查操作已经讲解完了,下一节将会继续讲解有关事务的操作,JdbcTemplate实验相关环境依赖已经上传,下载链接附上:druid-1.1.9.jar+mysql-connector-java-8.0.29.jar等JdbcTempate操作资源

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18222.html

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

相关文章

java计算机毕业设计ssm教师贴心宝的设计与实现

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,高校各种管理系统层出不穷。高校作为学习知识和技术的高等学府,信息技术更加的成熟,为教师开发必要的系统,能够有效的提升管理效率。近年来,高校规模不断扩大,同时在…

[附源码]SSM计算机毕业设计中达小区物业管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

c#入参使用引用类型为啥要加ref?

目录 ref修饰入参的常用场景引用类型添加ref的作用是啥&#xff1f;总结那什么是值&#xff0c;什么是引用&#xff1f;大体可以理解为堆栈的区别&#xff0c;在.net中大多数实例存在于托管堆栈中。struct&#xff0c;int32&#xff0c;int64&#xff0c;double&#xff0c;en…

mathtype符号显示不全的问题

目录前言参考问题解决方法补充最后前言 最近在使用Mathtype往Word里插入数学符号时&#xff0c;发现有些符号的间距过大&#xff0c;整个排版不太好看&#xff0c;于是上网查了一下&#xff0c;将方法记录下来。 参考 Word插入数学符号&#xff0c;行间距变大怎么办&#xf…

【408数据结构与算法】—堆排序(二十一)

【408数据结构与算法】—堆排序&#xff08;二十一&#xff09; 一、堆的定义 从堆的定义可以看出&#xff0c;堆实质是满足如下性质的完全二叉树&#xff0c;二叉树中任一非叶子结点均小于&#xff08;大于&#xff09;它的孩子结点 C语言代码实现 #include <stdio.h>…

python零基础入门教程(非常详细),从零基础入门到精通,看完这一篇就够了

前言 本文罗列了了python零基础入门到精通的详细教程&#xff0c;内容均以知识目录的形式展开。 第一章&#xff1a;python基础之markdown Typora软件下载Typora基本使用Typora补充说明编程与编程语言计算机的本质计算机五大组成部分计算机三大核心硬件操作系统 第二章&…

java计算机毕业设计ssm健达企业项目管理系统

项目介绍 随着经济的发展和信息技术的普及,国内许多健达企业都面临了重大的挑战。健达企业的管理流程、战略规划如果不能进行调整,极有可能面临淘汰的风险。特别是企业项目的处理,面对大量的人员信息和业务信息,如果不使用信息系统进行有效的管理和利用,那就会阻碍健达企业的发…

[附源码]SSM计算机毕业设计中华美食网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

gcc和g++的使用

linux编译器-gcc和g的使用 文章目录linux编译器-gcc和g的使用预处理编译汇编链接函数库动态库和静态库file 查看可执行程序ldd 查看可执行程序格式make和makefilestat 查看文件或目录时间在讲gcc和g编译同时&#xff0c;我们复习一下程序翻译的大概过程&#xff0c;并以此为例切…

IntelliJ IDEA 配置启动SprintBoot项目

【原文链接】IntelliJ IDEA 配置启动SprintBoot项目 文章目录一、IDEA 配置maven二、IDEA 配置jdk三、IDEA 启动项目一、IDEA 配置maven &#xff08;1&#xff09; 首先本机配置好maven&#xff0c;具体可参考 Win10系统如何安装配置maven &#xff08;2&#xff09;然后在打…

Windows10中使用VS2022和Cmake编译构建C++开源日志库-spdlog

一、关于C中的开源日志库spdlog Java中有很多日志库&#xff1a;java.util.logging、Log4j、Logback、Log4j2、slf4j、common-logging。C的日志库相对来说就比较少了&#xff0c;比如说glog、log4cpp、spdllog等&#xff0c;目前个人感觉比较好用的C开源日志库当属于spdlog了&…

这次把怎么做好一个PPT讲清-审美篇

要提高审美&#xff0c;主要是靠不断的看优秀的作品来知道什么是美的&#xff0c;这个短时间很难速成&#xff0c;只能靠不断的积累。 如何做出具有高级感的PPT&#xff1f; 已剪辑自: https://zhuanlan.zhihu.com/p/38642831 很多年前&#xff0c;走在大街上的PPT大多长得像…

打破边界,边缘计算有何应用场景?

近年来&#xff0c;随着5G、物联网、人工智能技术的发展&#xff0c;越来越多设备接入到互联网中&#xff0c;数据呈现爆炸式增长&#xff0c;对算力、延时提出更好要求&#xff0c;能够在靠近数据源头位置提供计算服务的边缘计算快速兴起&#xff0c;打破更多的场景边界&#…

火法冶炼高冰镍制电池级硫酸镍除硅

#火法冶炼高冰镍制电池级硫酸镍除硅 从供需角度&#xff0c;红土镍矿为最主要原生镍供应来源&#xff0c;而下游需求中不锈钢占据75%-80%份额&#xff0c;最主要的镍供需路径为红土镍矿火法冶炼-镍铁-不锈钢。 但下游需求中电池对硫酸镍的需求增速显著&#xff0c;红土镍矿火法…

m基于matlab的信息传输系统包括卷积编码,QPSK调制解调以及维特比译码

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 信息传输系统主要包括信号发送&#xff0c;信号传输模块&#xff0c;信号接收模块&#xff0c;其中信号发送包括信号的产生&#xff0c;信源的编码&#xff0c;信号的调制等模块&#xf…

24节气—小雪海报、文案分享。雨凝成雪,万物冬藏。

24节气小雪将至。农谚&#xff1a;“小雪雪满天&#xff0c;来年必丰年。”就是指小雪的时候落雪&#xff0c;雨水充沛&#xff0c;还能冻死地里的病菌和害虫&#xff0c;来年雨水必定均匀&#xff0c;是丰收年。 下面是给大家整理的小雪节气文案及海报&#xff0c;希望大家喜欢…

400Gbps 网络面临的挑战

关于 TCP 与 100Gbps 场景的细说&#xff0c;参见&#xff1a;单流 TCP 100Gbps 难题的直观解释 400Gbps 网络将又是一个 “硬件准备好了&#xff0c;可软件没跟上” 的场景。 把一条 TCP Flow 看作一个操作系统进程&#xff0c;多条 Flow 共享 10Gbps 带宽和多进程被同一个 C…

消息队列RabbitMQ的常见面试题目

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 消息队列 ❤️ 支持我&#xff1a;&#x1f44d;点赞 &#x1…

【数据结构】栈

1.啥是栈 2.栈的使用 3.栈的自定义实现 4.划分栈&#xff0c;虚拟机栈&#xff0c;栈帧概念 &#xff08;1&#xff09;首先咱们来介绍一下什么是栈 Stack就是栈&#xff1a;栈是一种元素先进后出的一种数据结构 你可以把它想象成羽毛球筒&#xff0c;这是最直观的了&#xf…

坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?

分享一个印象深刻的线上问题&#xff0c;希望能够给 xdm 带来一点思考 一个稀松平常的工作日&#xff0c;正准备下班的时候&#xff0c;不巧&#xff0c;突发线上紧急问题&#xff0c;心中一万个不情愿&#xff0c;可还是要硬着头皮去定位问题 简单的表象为微服务之间 gRPC通…