Spring:JDBCTemplate

news2024/11/17 15:47:21

JDBCTemplate

  • 概述

在这里插入图片描述

概述

JDBC(Java DataBase Connectivity,Java 数据库连接), 一 种用于执行 SQL 语句的 Java API(Application Programming Interface , 应用程序设计接口 ),可以为多种关系数据库提供统一访问,由一组用 Java 语言编写的类和接口组成。

JDBCTemplate ,是一个 JDBC 的模板,Spring 封装了 JDBC 常用的操作,简化了 JDBC API 的使用和开发人员的工作,提供了便捷、安全和高效的访问数据库的方式。

简单示例:
首先在 pom.xml 文件中添加以下配置:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.25</version>
</dependency>

然后创建一个带有 id 和 name 属性的 JDBC 表:
在这里插入图片描述

再根据 JDBC 表定义一个与之相映射的 JDBC 类:

package cn.edu.springdemo.jdbc;

public class JDBC {
    public int id;
    public String name;

    public JDBC() {
        super();
    }

    public JDBC(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "JDBC{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

接着,定义一个接口 JDBCDao ,声明一系列常用访问数据库的方法:

package cn.edu.springdemo.jdbc;

import java.util.List;

public interface JDBCDao {
    public void add(JDBC jdbc);
    public void delete(int id);
    public void update(JDBC jdbc);
    public JDBC select(int id);
    public List<JDBC> selectAll();
}

再创建该接口的实现类 JDBCDaoImpl :

package cn.edu.springdemo.jdbc;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository("JDBCDao")
public class JDBCDaoImpl implements JDBCDao {
    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    //增添
    public void add(JDBC jdbc){
        String sql = "INSERT INTO `jdbc` (`name`) VALUES (:name);";
        SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(jdbc);
        namedParameterJdbcTemplate.update(sql,sqlParameterSource);
    }
    /**
     *     增添或者使用如下方法
     *     public void add(JDBC jdbc){
     *         String sql = "INSERT INTO `jdbc` (`name`) VALUES (?);";
     *         Object[] args = {jdbc.getName()};
     *         jdbcTemplate.update(sql,args);
     *     }
     */

    //删除
    public void delete(int id){
        String sql = "DELETE FROM `jdbc` WHERE `id`=?;";
        jdbcTemplate.update(sql,id);
    }

    //修改
    public void update(JDBC jdbc){
        String sql = "UPDATE `jdbc` SET `name`=? WHERE `id`=?;";
        Object[] args = {jdbc.getName(),jdbc.getId()};
        jdbcTemplate.update(sql,args);
    }

    //id查询
    public JDBC select(int id){
        String sql = "SELECT `id`,`name` FROM `jdbc` WHERE `id`=?;";
        RowMapper<JDBC> list = new BeanPropertyRowMapper<>(JDBC.class);
        return jdbcTemplate.queryForObject(sql,list,id);
    }

    //查询
    public List<JDBC> selectAll(){
        String sql = "SELECT `id`,`name` FROM `jdbc`;";
        RowMapper<JDBC> rowMapper = new BeanPropertyRowMapper<>(JDBC.class);
        List<JDBC> list = jdbcTemplate.query(sql,rowMapper);
        return list;
    }
}

另外在 resources 目录下创建 jdbc.properties ,添加以下内容:

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC
jdbc.user=root
jdbc.password=0123
acquireIncrement=5
initialPoolSize=10
minPoolSize=5
maxPoolSize=100
maxStatements=2
maxStatementsPerConnection=5

xml配置:

<?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
       https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="cn.edu.springdemo.jdbc" />

    <!-- 在 Bean 的外部属性文件的使用中有所提及 -->
    <!-- 使用context命名空间,通过 location 属性指定 properties 文件位置 -->
    <context:property-placeholder location="classpath:jdbc.properties" />
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 连接MySQL数据库的基本信息的配置 -->
        <!-- 驱动程序类名:com.mysql.jdbc.Driver -->
        <property name="driverClass" value="${jdbc.driverClass}" />
        <!-- JDBC URL:jdbc:mysql://<host>:<port>/<database_name> -->
        <property name="jdbcUrl" value="${jdbc.url}" />
        <!-- 数据库用户名 -->
        <property name="user" value="${jdbc.user}" />
        <!-- 数据库用户密码 -->
        <property name="password" value="${jdbc.password}" />
        <!-- 若数据库中的连接数量不足时,向数据库申请的连接数量 -->
        <property name="acquireIncrement" value="${acquireIncrement}" />
        <!-- 初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize" value="${initialPoolSize}" />
        <!-- 数据库连接池最小的数据库连接数 -->
        <property name="minPoolSize" value="${minPoolSize}" />
        <!-- 数据库连接池最大的数据库连接数 -->
        <property name="maxPoolSize" value="${maxPoolSize}" />
        <!-- C3P0数据库连接池可以维护的Statement数量 -->
        <property name="maxStatements" value="${maxStatements}" />
        <!-- 每个连接同时可以使用Statement的数量 -->
        <property name="maxStatementsPerConnection" value="${maxStatementsPerConnection}" />
    </bean>

    <!-- 配置jdbcTemplate,注入dataSource -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 配置namedParameterJdbcTemplate,注入dataSource -->
    <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg type="javax.sql.DataSource" ref="dataSource"/>
    </bean>
</beans>

最后测试结果:

package cn.edu.springdemo.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class JDBCTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jdbc.xml");
        JDBCDao jdbcDao = (JDBCDao) applicationContext.getBean("JDBCDao");
        System.out.println("第一次查询:" + jdbcDao.selectAll());

        JDBC jdbc = new JDBC();
        jdbc.setName("赵子龙");
        jdbcDao.add(jdbc); //新增

        jdbc.setId(10106);
        jdbc.setName("赵云");
        jdbcDao.update(jdbc); //修改

        System.out.println("第二次查询:" + jdbcDao.selectAll());
        System.out.println("id查询:" + jdbcDao.select(10101));

        jdbcDao.delete(10104); //删除
    }
}

结果如图:
在这里插入图片描述

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

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

相关文章

【每日一题】—— C. Mocha and Hiking(Codeforces Round 738 (Div. 2))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

IO流【笔记】

1. IO概述 1.1 什么是IO 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&a…

软件开发过程中前后端联调相关问题

一、接口调用三步曲 1. uniapp接口调用 data中定义 onload中调用 例如&#xff1a;this.getSwiperList()//调用获取轮播图数据的方法 method中定义获取方法 2. 微信小程序接口调用 reques.js中接口封装 如&#xff1a;ScenicspotInfo &#xff08;data&#xff09;> re…

高级web前端开发工程师的岗位职责最新(合集)

高级web前端开发工程师的岗位职责最新1 职责&#xff1a; 1.主导公司前端开发的技术方向&#xff0c;指导其他前端开发人员工作 2.负责产品的Web前端开发及用户交互体验设计; 3.基于HTML、CSS、JavaScript标准进行页面制作&#xff0c;编写界面组件; 4.协同后台开发工程师&…

8.4 day05软件学习

文章目录 微服务的概念微服务的原则微服务的特征&#xff1a;集群介绍 spring aop 在家学习效率真不高&#xff0c;下午好兄弟喊出去玩&#xff0c;一直到晚上才回来&#xff0c;赶紧总结一下早上学习的内容。 继续看java基础进阶的思想&#xff0c;之前学的很多都忘了。 微服…

网工内推 | 实施、售后工程师,厂商认证优先

01 安井食品集团股份有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责集团组网的网络规划、实施、维护工作&#xff1b; 2.负责公司局域网的网络规划、实施、维护工作&#xff1b; 3.负责公司企业安全系统规划、实施、维护工作&#xff1b; 4、负责公…

百度UEditor编辑器如何关闭抓取远程图片功能

百度UEditor编辑器如何关闭抓取远程图片功能 这个坑娘的功能&#xff0c;开始时居然不知道如何触发&#xff0c;以为有个按钮&#xff0c;点击一下触发&#xff0c;翻阅了文档&#xff0c;没有发现&#xff0c;然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发&a…

LT6711A 是一款HDMI 2.0转DP 1.2/EDP 1.4的芯片,实用于AR或者PC以及PAD

LT6711A 1.概述&#xff1a; Lontium LT6711A是HDMI2.0到DP1.2转换器&#xff0c;内部有c型替代模式开关和PD控制器。对于HDMI输入&#xff0c;LT6711A具有一个HDMI2.0接收器&#xff0c;有1个时钟通道和3个数据通道&#xff0c;每个数据通道最大运行6Gb/s&#xff0c;最大输…

DAY02_Spring第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

智能汽车驾驶演进:虚拟ECU种类与优劣分析

现代汽车更安全、更舒适、更智能的代价是车载ECU&#xff08;Electronic Control Unit&#xff09;数量的迅速增长&#xff0c;与之相对应的是ECU上规模软件越来越大、软件开发成本在整车制造成本中的占比越来越高。车企可以从规则与方法两个角度入手来解决上述问题&#xff1a…

ES6新增的语法

ES6实际上是一个泛指&#xff0c;泛指 ES2015 及后续的版本 1&#xff0c;let用于声明变量的关键字 let 声明的变量只在所处于的代码块内有效 if (true) { let a 10 } console.log(a) // a is not defined 2, let 不存在变量提升 console.log(a) // a is not deined let a 1…

元素2D转3D 椭圆形旋转实现

椭圆旋转功能展示 transform-style: preserve-3d;&#xff08;主要css代码&#xff09; gif示例&#xff08;背景图可插入透明以此实现边框线的旋转&#xff09; 导致的无法点击遮挡问题可以参考我的另一个文章 穿透属性-----------------------css穿透属性 实时代码展示

如何与 Boot Barn 建立 EDI 连接?

Boot Barn 专注于提供各种高品质的靴子、鞋类和西部服饰。其经营范围广泛&#xff0c;为广大顾客提供最新潮流和经典款式的选择。 Boot Barn 的使命是成为顾客在西部风格时尚领域的首选购物地点。多年来&#xff0c;Boot Barn 凭借卓越的服务和优质的产品赢得了众多客户的信赖和…

LabVIEW使用DSA技术从X射线图像测量肺气容量

LabVIEW使用DSA技术从X射线图像测量肺气容量 相衬X射线&#xff08;PCX&#xff09;成像技术利用相邻介质之间折射率的微小差异来增强传统X射线成像通常不可见的物体的边界。事实证明&#xff0c;这一进展在一系列生物医学和材料科学中非常有益于材料表征、疾病检测以及解剖形…

Hive 中把一行记录拆分为多行记录

背景 业务场景&#xff1a;统计每个小时视频同时在线观看人数&#xff0c;因后台的业务数据是汇总之后的&#xff0c;只有开始时间、结束时间&#xff0c;没有每小时的详细日志数据&#xff0c;无法直接进行统计&#xff0c;所以需要对每条业务数据进行拆分&#xff0c;来统计…

【redis】能ping通虚拟机但是telnet不通

问题 虚拟机上有redis&#xff0c;能ping通虚拟机的ip&#xff0c;但是telnet已启动的redis6379端口失败 基本情况 虚拟机网络模式是NAT模式&#xff0c;linux防火墙firewalld已关闭&#xff0c;没有iptables&#xff0c;主机和虚拟机能互相Ping通&#xff0c;主机telnet re…

后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

鸿蒙的初项目

经过这几天的了解&#xff0c;我还是决定挑战一下自己用ets语言去写一个鸿蒙的程序&#xff01; 先创建了一个ets的项目&#xff0c;然后我发现这里面有一个组件叫Flex&#xff0c;跟css里面的弹性布局好像差不多&#xff0c;但是用法略有差异&#xff0c;这个Flex是在&#xf…

Python---Numpy

文章目录 1.Numpy是什么&#xff1f;2.ndarray2.1 什么是ndarray?2.2 ndarray的属性2.3 ndarray的类型 3.Numpy基本操作3.1 生成0或1的数组3.2 从现有数组生成数组拓展&#xff1a;浅拷贝和深拷贝 3.3 生成固定范围的数组3.4 生成随机数组3.4.1 正态分布3.4.2 均匀分布 3.5 形…

网络安全(黑客)工具篇

大家好&#xff0c;我是白菜。这篇文章给大家盘点那些年&#xff0c;我们一起玩过的网络安全工具。 一、反恶意代码软件 1.Malwarebytes 这是一个检测和删除恶意的软件&#xff0c;包括蠕虫&#xff0c;木马&#xff0c;后门&#xff0c;流氓&#xff0c;拨号器&#xff0c;…