【Spring】通过JdbcTemplate实现CRUD操作

news2024/11/14 21:55:28

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述

通过JdbcTemplate实现 增删查改

  • 一、添加相关依赖
  • 二、jdbc.properties配置文件
  • 三、创建数据源对象,配置JdbcTemplate(XML配置文件)
  • 四、实现CRUD操作
    • ①添加操作
    • ②删除操作
    • ③修改操作
    • ④查询操作



一、添加相关依赖


maven依赖

    <dependencies>
        <!--spring jdbc  Spring 持久化层支持jar包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>
        <!-- 数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>
        <!--junit5测试-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.0</version>
        </dependency>
        <!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!--spring对junit的支持相关依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
注意:MySQL驱动的版本需要与下载使用的MySQL版本一致...




二、jdbc.properties配置文件


在这里插入图片描述

配置文件内容:

①用户 ②密码 ③url ④驱动

jdbc.user=root
jdbc.password=abc123
jdbc.url=jdbc:mysql://localhost:3306/spring?characterEncoding=utf8&useSSL=false
jdbc.driver=com.mysql.cj.jdbc.Driver




三、创建数据源对象,配置JdbcTemplate(XML配置文件)


这里通过XML配置文件的方式,读取外部属性文件jdbc.properties,根据读取的信息来获取数据源对象。

这样做的好处是,当我们需要更换数据库账用户,或者是修改数据库地址时,只需要对外部配置文件进行修改即可。

配置jdbcTemplate对象时,id = jdbcTemplate ; class = org.springframework.jdbc.core.JdbcTemplate

<?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:property-placeholder location="classpath:jdbc.properties" />

    <!-- 创建数据源对象 -->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
    </bean>

    <!-- 配置jdbcTemplate对象,注入数据源 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="druidDataSource"/>
    </bean>
</beans>




四、实现CRUD操作


无论是增删改操作,还是查询操作,第一步都是先编写SQL语句。

  • 增删改操作时,调用jdbcTemplate.update()方法
  • 查询操作时,可调用jdbcTemplate.queryForObject()jdbcTemplate.query()等方法

①添加操作

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

/**
 * @author .29.
 * @create 2023-02-06 19:34
 */

@SpringJUnitConfig(locations = "classpath:beans.xml")
public class JDBCTemplateTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testUpdate(){
        //1、添加操作
        //第一步 编写sql语句
        String sql = "insert into t_emp values(NULL,?,?,?);";

        //第二步 调用jdbcTemplate的方法完成更新
        int rows = jdbcTemplate.update(sql, "高启兰", 20, "女");//按顺序传入参数
        /*也可通过数组传入参数
        * Object[] params = {"高启强", 27, "男"}
        * int rows = jdbcTemplate.update(sql,params);
        * */
        System.out.println("影响行数: "+rows);



    }
}


②删除操作

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

/**
 * @author .29.
 * @create 2023-02-06 19:34
 */

@SpringJUnitConfig(locations = "classpath:beans.xml")
public class JDBCTemplateTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testUpdate(){

        //2.删除操作
        String sql = "delete from t_emp where id = ?";
        int rows = jdbcTemplate.update(sql,2);
        System.out.println(rows);
    }
}


③修改操作

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

/**
 * @author .29.
 * @create 2023-02-06 19:34
 */

@SpringJUnitConfig(locations = "classpath:beans.xml")
public class JDBCTemplateTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testUpdate(){
        //3.修改操作
        String sql = "update t_emp set name = ? where id = ?";
        int rows = jdbcTemplate.update(sql,"强盛集团老总",1);
        System.out.println(rows);

    }
}



④查询操作

查询操作,可以查询对象,查询集合,查询单个值等...
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import java.util.List;

/**
 * @author .29.
 * @create 2023-02-06 19:34
 */

@SpringJUnitConfig(locations = "classpath:beans.xml")
public class JDBCTemplateTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    //一、查询,返回对象
    @Test
    public void testSelectObject(){
        String sql = "select * from t_emp where id = ?";


        //方法一,手动封装对象(不推荐,麻烦)
        Emp empResult = jdbcTemplate.queryForObject(sql,((resultSet, i) -> {
            Emp emp = new Emp();
            emp.setId(resultSet.getInt("id"));
            emp.setName(resultSet.getString("name"));
            emp.setAge(resultSet.getInt("age"));
            emp.setSex(resultSet.getString("sex"));
            return emp;
        }),1);
        System.out.println(empResult);

        //方法二,直接调用方法封装对象 (new BeanPropertyRowMapper<>(Emp.class))
        Emp empResult2 = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(Emp.class),1);
        System.out.println(empResult2);
    }

    //二、查询,返回List集合
    @Test
    public void testSelectList(){
        String sql = "select * from t_emp";
        List<Emp> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Emp.class));
        System.out.println(list);
    }


    //三、查询,返回单个值
    @Test
    public void testSelectSingle(){
        String sql = "select count(*) from t_emp";
        Integer count = jdbcTemplate.queryForObject(sql,Integer.class);
        System.out.println(count);
    }

在这里插入图片描述

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

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

相关文章

python-下载某短视频平台视频(高清无水印)

python-下载某短视频平台音视频&#xff08;高清无水印&#xff09;前言1、获取视频 url2、发送请求3、数据解析4、本地保存5、完整代码前言 1、Cookie中文名称为小型文本文件&#xff0c;指某些网站为了辨别用户身份而储存在用户本地终端&#xff08;Client Side&#xff09;…

RTMP的工作原理及优缺点

一.什么是RTMP&#xff1f;RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;实时消息传输协议&#xff09;是一种用于低延迟、实时音视频和数据传输的双向互联网通信协议&#xff0c;由Macromedia&#xff08;后被Adobe收购&#xff09;开发。RTMP的工作原理是&#…

Windows 11 网卡MAC地址 | 机器地址 | 网络地址 为 0 | 00-00-00-00-00-00?手动修复……

一位同事反映&#xff0c;他的电脑今天上班开机无法上网&#xff0c;上周末还正常&#xff0c;请我帮忙检修。该同事的电脑安装的是Windows 11&#xff0c;检查网络连接的详细信息&#xff0c;发现IP地址、网关、DNS参数都正常&#xff0c;但物理地址为00-00-00-00-00-00。另外…

力扣每日一题(2023年2月)

2023年2月期每日一题第一天 &#xff08;2325. 解密消息&#xff09;第十六天&#xff08;2341. 数组能形成多少数对&#xff09;第十七天 &#xff08;1139. 最大的以 1 为边界的正方形&#xff09;第十八天 &#xff08;1237. 找出给定方程的正整数解&#xff09;第十九天 &a…

再度盈利,搜狐稳了?

2016年在宣布要用3年时间回归互联网舞台中心之后&#xff0c;很长一段时间内张朝阳积极活跃在各种社交媒体上&#xff0c;完全是一派“积极出山”的姿态。而后畅游从美股退市&#xff0c;搜狗“卖身”腾讯&#xff0c;一系列的收缩动作又似乎是在逐渐远离喧嚣。而在最近三年&am…

Zilliz @ GAIDC |Milvus:生产级 AI 数据库探索

2月26日&#xff0c;全球人工智能开发者先锋大会— AI 数据与开源论坛在上海举行&#xff0c;Zilliz 主任工程师刘力在现场发表了名为《Milvus&#xff1a;生产级 AI 数据库探索》的演讲。刘力开篇便提到&#xff0c;Milvus 致力于打造更为完善的 AI 生态体系。随后&#xff0c…

阿赵的MaxScript学习笔记分享五《UI组件使用篇》

大家好&#xff0c;我是阿赵。这个专题的内容比较多&#xff0c;所以抓紧时间更新。这是第五篇&#xff0c;UI组件使用篇。 这里主要是把maxscript的rollout窗体支持的UI组件列举一下&#xff0c;并每个组件写一个使用范例&#xff0c;以方便理解和查看。 1、位图bitmap 可以指…

Java中常用的七种队列你了解多少?

文章目录Java中常用的七种队列你了解多少?ArrayBlockingQueue队列如何使用&#xff1f;添加元素到队列获取队列中的元素遍历队列LinkedBlockingQueue队列如何使用&#xff1f;1. 创建SynchronousQueue对象2. 添加元素到队列3. 获取队列中的元素4. 遍历队列SynchronousQueue队列…

Unity Lighting -- Unity的光源简介

在主菜单栏中&#xff0c;点击Window -> Rendering -> Light Explorer打开光源管理器&#xff0c;这个标签页可以看到场景中所有的光源&#xff0c;包括每个光源的类型&#xff0c;形状&#xff0c;模式&#xff0c;颜色&#xff0c;强度&#xff0c;阴影等信息。 在主菜…

android unit test mock框架使用记录

写在前面 之前上班时&#xff0c;开发一个功能之后&#xff0c;还需要编写测试用例&#xff0c;使用的框架是mock。 为什么防止以后用到时忘了&#xff0c;在这里记录一下。 由于团队没有人使用Espresso进行unit test&#xff0c;所以本人对该框架并不熟悉。想了解该框架的使用…

WPF布局控件之DockPanel

DockPanel DockPanel&#xff0c;英文释义为停靠面板&#xff0c;那是怎么个停靠法呢&#xff1f;如下&#xff1a; <Window x:Class"LearnLayout.DockPanelWin"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http:/…

数字图像处理

文章目录图像复原上升阶跃边缘、下降阶跃边缘、脉冲状边缘和屋顶状边缘曲线及其一阶导数和二阶导数有哪些特征&#xff1f;Hough变换的基本思想是什么&#xff1f;基本概念图像增强灰度变换直方图&#xff1a;直方图特点matlab代码空间域滤波平滑空间滤波均值滤波器&#xff1a…

python如何实现多线程

今天本来打算学习学习多进程的&#xff0c;但是由于我现在的电脑没有Linux系统&#xff0c;无法通过Linux系统编辑一些多进程的程序&#xff0c;因此我打算从多线程入手。 多线程 我们的程序一般都是多任务的&#xff0c;如果你没有好好的利用好&#xff0c;运行时就会出现卡…

【读论文】TCL: an ANN-to-SNN Conversion with Trainable Clipping Layers

DAC 2021 背景 通过ANN2SNN的方法得到的SNN中&#xff0c;存在准确性和延迟之间的一种权衡关系&#xff0c;在较大的数据集&#xff08;如ImageNet&#xff09;上可能会有较高的延迟。 主要贡献 分析了转换后SNN精度与延迟之间存在权衡关系的原因&#xff0c;并指出了如何缓…

6587: 计算分段函数

描述本题目要求计算下列分段函数f(x)的值&#xff1a;输入输入在一行中给出实数x。输出在一行中按“f(x) result”的格式输出&#xff0c;其中x与result都保留两位小数。样例输入10样例输出f(10.00) 3.16提示C/C可在头文件中包含math.h&#xff0c;并调用sqrt函数求平方根&am…

JAVA入门教程||Java Scanner 类||Java 异常处理

Java Scanner 类 java.util.Scanner是Java5的新特征&#xff0c;我们可以通过 Scanner 类来获取用户的输入。 下面是创建 Scanner 对象的基本语法&#xff1a; Scanner s new Scanner(System.in); 接下来我们演示一个最简单的的数据输入&#xff0c;并通过 Scanner 类的 nex…

产品分析丨豆瓣APP

本文将从以下几个方面进行分析&#xff1a;1. 产品功能结构2. 竞品分析3. 用户分析4. 用户调研5. 功能分析与优化方案6. 总结01 产品功能结构产品架构由豆瓣的产品架构图可看出&#xff0c;豆瓣是兼具书影音的评分系统和兴趣社区&#xff0c;以广告、知识付费和电商业务作为商业…

图解LeetCode——剑指 Offer 52. 两个链表的第一个公共节点

一、题目 输入两个链表&#xff0c;找出它们的第一个公共节点。 二、示例 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 注意&#xff1a; 如果两个链表没有交点&#xff0c;返回 null.在返回结果后&#xff0c;两个链表仍须保持原有的结构。可假定整个链表结构中没…

代码质量与安全 | ChatGPT能帮到你什么还有待探索,但人工智能真的可以帮你做自动化测试

当听到“人工智能”&#xff08;AI&#xff09;时&#xff0c;你会想到什么&#xff1f; 你可能会开始想象科幻电影中的先进的人形机器人或者未来科技&#xff0c;但是&#xff0c;人工智能聊天机器人程序Chat GPT的爆火已经证明&#xff0c;这种“未来主义”技术已经融入了我…

三个月自学自动化测试,薪资15K直接翻倍,鬼知道我经历了什么····

学习软件测试是迫不得已&#xff0c;幸好最后通过自己的付出&#xff0c;得到了满意的回报。希望大家能通过我的经历得到一些帮助和思路。 零基础自学遇到的第一个难题就是需要怎么学&#xff0c;刚开始一头雾水&#xff0c;只能先从网上买些书来看&#xff0c;但是收效甚微。…