4 - JdbcTemplate

spring 框架如何处理对数据库的操作呢?

1. 基本介绍

文档:JdbcTemplate APIs : /spring-framework-5.3.8/docs/javadoc-api/index.html

JdbcTemplate 是 Spring 提供的访问数据库的技术。可以将 JDBC 的常用操作封装为模板方法

已经提供了特别多的 API  


2. 使用实例 

2.1 JdbcTemplate 使用准备

1)创建数据库及表

-- 创建数据库
CREATE DATABASE spring
USE spring
-- 创建表 monster
CREATE TABLE monster(
id INT PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT '',
skill VARCHAR(64) NOT NULL DEFAULT ''
)CHARSET=utf8
INSERT INTO monster VALUES(100, '青牛怪', '吐火');
INSERT INTO monster VALUES(200, '黄袍怪', '吐烟');
INSERT INTO monster VALUES(300, '蜘蛛怪', '吐丝');

2)配置 src/jdbc.properties

jdbc.userName=root
jdbc.password=hsp
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring

3)配置文件 src/JdbcTemplate_ioc.xml

<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="${jdbc.userName}"></property>
    <property name="password" value="${jdbc.password}"></property>
    <property name="driverClass" value="${jdbc.driverClass}"></property>
    <property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>

配置 JdbcTemplate_ioc.xml,将数据源分配给 JdbcTemplate bean

<!-- 配置 JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!-- 将上面的数据源分配给 jdbcTemplate -->
    <property name="dataSource" ref="dataSource"/>
</bean>

2.2 测试

1)添加一个新的 monster

@Test
public void addDataByJdbcTemplate() {
    ApplicationContext ioc = new
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 JdbcTemplate bean
    JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
    // 1. 添加方式 1
    // String sql = "INSERT INTO monster VALUES(400, '红孩儿', '枪法厉害')";
    // bean.execute(sql);

    //2. 添加方式 2, 绑定参数
    String sql = "INSERT INTO monster VALUES(?, ?, ?)";
    int affected = bean.update(sql, 700, "红孩儿 2", "枪法厉害 2");
    System.out.println("add ok affected= " + affected);
}

2)更新一个 monster 的 skill

@Test
public void updateDataByJdbcTemplate() {
    ApplicationContext ioc = new 
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 JdbcTemplate bean
    JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
    String sql = "UPDATE monster SET skill = ? WHERE id=?";
    int affected = bean.update(sql, "美女计", 300);
    System.out.println("affected= " + affected);
}

3)批量添加二个 monster

@Test
public void addBatchDataByJdbcTemplate() {
    ApplicationContext ioc = new 
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);//添加..
    String sql = "INSERT INTO monster VALUES(?, ?, ?)";
    List<Object[]> param_list = new ArrayList<Object[]>();
    param_list.add(new Object[]{500, "白蛇精", "skill1"});
    param_list.add(new Object[]{600, "青蛇精", "skill2"});
    bean.batchUpdate(sql, param_list);
    System.out.println("batch add ok");
}

4)查询单个 monster 并封装到 Monster 实体对象

@Test
public void selectDataByJdbcTemplate() {
    ApplicationContext ioc = new 
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 JdbcTemplate bean
    JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
    String sql = "SELECT id as monsterId,name,skill FROM monster WHERE id =?";
    //下面这个 rowmapper 是一个接口,可以将查询的结果,封装到你指定的 Monster 对象中.
    RowMapper<Monster> rowMapper = new 
        BeanPropertyRowMapper<Monster>(Monster.class);
    Monster monster = bean.queryForObject(sql, rowMapper, 100);
    System.out.println("monster= " + monster);
}

5)查询多个 monster 并封装实体对象

@Test
public void selectMulDataByJdbcTemplate() {
    ApplicationContext ioc = new 
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 JdbcTemplate bean
    JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
    String sql = "SELECT id as monsterId,name,skill FROM monster WHERE id >=?";
    //下面这个 rowmapper 是一个接口,可以将查询的结果,封装到你指定的 Monster 对象中.
    RowMapper<Monster> rowMapper = new BeanPropertyRowMapper<Monster>(Monster.class);
    List<Monster> monster_list = bean.query(sql, rowMapper, 200);
    for (Monster monster : monster_list) {
        System.out.println(monster);
    }
}

6)查询返回结果只有一行一列

@Test
public void selectScalarByJdbcTemplate() {
    ApplicationContext ioc = new 
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 JdbcTemplate bean
    JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
    String sql = "SELECT name FROM monster WHERE id =100";
    String name = bean.queryForObject(sql, String.class);
    System.out.println(name);
}

7)使用 Map 传入具名参数完成操作

src\JdbcTemplate_ioc.xml, 增加配置

<!-- 配置 NamedParameterJdbcTemplate,支持具名参数 -->
<bean id="namedParameterJdbcTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <!-- 这里需要使用构造器关联数据源 -->
    <constructor-arg name="dataSource" ref="dataSource"/>
</bean>

测试:使用 Map 传入具名参数完成操作

注:sql 语句里的属性名,要和 map_parameter 的 key 保持一致

@Test
public void testDataByNamedParameterJdbcTemplate() {
    ApplicationContext ioc = new 
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 NamedParameterJdbcTemplate bean
    NamedParameterJdbcTemplate namedParameterJdbcTemplate =
    ioc.getBean(NamedParameterJdbcTemplate.class);
    String sql = "INSERT INTO monster VALUES(:my_id, :name, :skill)";
    Map<String, Object> map_parameter = new HashMap<String, Object>();
    map_parameter.put("my_id", 800);
    map_parameter.put("name", "螃蟹精");
    map_parameter.put("skill", "钳子无敌大法");
    namedParameterJdbcTemplate.update(sql, map_parameter);
    System.out.println("add data ok~");
}

8)使用 sqlparametersoruce 来封装具名参数、

注:这里的 sql 里的属性名称,要和 Monster bean 的属性名保持一致

@Test
public void operDataBySqlparametersoruce() {
    ApplicationContext ioc = new 
        ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //得到 NamedParameterJdbcTemplate bean
    NamedParameterJdbcTemplate namedParameterJdbcTemplate =
        ioc.getBean(NamedParameterJdbcTemplate.class);
    String sql = "INSERT INTO monster VALUES(:monsterId, :name, :skill)";
    Monster monster = new Monster(900, "狐狸精", "狐媚之术");
    SqlParameterSource source = new BeanPropertySqlParameterSource(monster);
    namedParameterJdbcTemplate.update(sql, source);
    System.out.println("add ok~");
}

2.3 Dao 对象中使用 JdbcTemplate 

1)创建对象

MonsterDao.java

@Repository
public class MonsterDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    //添加 monster
    public void save(Monster monster) {
        String sql = "INSERT INTO monster VALUES(?, ?, ?)";
        jdbcTemplate.update(sql, monster.getMonsterId(),
        monster.getName(), monster.getSkill());
    }
}

2)修改 \src\JdbcTemplate_ioc.xml

<!-- 加入自动扫描包 -->
<context:component-scan base-package="com.hspedu.spring.jdbctemplate.dao"/>

3)测试

@Test
public void operDataByDao() {
    ApplicationContext ioc =
        new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    MonsterDao bean = ioc.getBean(MonsterDao.class);
    Monster monster = new Monster(1000, "大虾精", "夹子功");
    bean.save(monster);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ubuntu】docker中如何ping其他ip或外网

docker中如何ping其他ip或外网 示例图&#xff1a; 运行下面命令&#xff1a; docker run -it --namehei busybox看情况需要加权限 sudo&#xff0c;即&#xff1a; sudo docker run -it --namehei busyboxping 外网 ping -c 4 www.baidu.comping 内网 ping -c 4 192.168.…

steam游戏搬砖项目还能火多久?

最近放假回到老家&#xff0c;见了不少亲戚朋友&#xff0c;大家不约而同都在感叹今年大环境不好&#xff0c;工作不顺&#xff0c;生意效益不好&#xff0c;公司状况不佳&#xff0c;反问我们生意如何&#xff1f;为了让他们心里好受一点&#xff0c;我也假装附和道:也不咋地&…

汽车研发测试大全

车研发中需要做的试验&#xff0c;这些试验都是保证我们的车能安全、稳定、可靠行驶的必要条件。主要包含以下内容&#xff1a; 一、整车试验项目 1.1整车可靠性试验 1.2 NVH试验 1.3 HVAC试验 1.4 EMC试验 1.5 化学分析试验 1.6 整车道路性能试验 二、零部件试验项目 …

node的下载、安装、配置

下载&#xff1a; 官网下载&#xff1a;Node.js 左右两个都可以&#xff1a; 往期版本&#xff1a; ​​​​​​https://registry.npmmirror.com/binary.html?pathnode/v16.18.0/ 其中的16.18.0可以修改成你需要的版本 安装&#xff1a; 打开cmd&#xff1a; 输入以下指令…

精品基于Uniapp+springboot车辆充电桩缴费管理系统管理系统App-地图

《[含文档PPT源码等]精品基于Uniappspringboot充电桩管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安…

【STM32单片机】迷宫游戏设计

文章目录 一、主要功能二、软件设计三、实验现象联系作者 一、主要功能 本项目使用STM32F103/F407单片机控制器&#xff0c;TFTLCD触摸屏、按键等。 主要功能&#xff1a; 系统运行后&#xff0c;TFTLCD显示游戏界面&#xff0c;可按下KEY_UP键进入游戏&#xff1b; 系统内置…

持久双向通信网络协议-WebSocket-入门案例实现demo

1 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接&#xff0…

Javaweb之SpringBootWeb案例员工管理分页查询的详细解析

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询&#xff08;今天完成&#xff09; 带条件的分页查询&#xff08;今天完成&#xff09; 删除员工&…

20240115寻找两数之和

代码 class Solution:def getSumIndex(self, nums: List[int], target: int) -> List[int]:records dict()for index, value in enumerate(nums): if target - value in records: # 遍历当前元素&#xff0c;并在map中寻找是否有匹配的keyreturn [records[target- valu…

postman案例

一、表单接口 基本正向 有效反向 无效反向 JSON接口 基本正向 有效反向 无效反向 文件上传接口 token 获取token值

CNN感受野

在卷积神经网络中&#xff0c;决定某一层输出结果中一个元素所对应的输入层的区域大小&#xff0c;被称为感受野。通俗的解释是&#xff0c;输出feature map上的一个单元对应输入层上的区域大小。 感受野计算公式&#xff1a; F ( i ) ( F ( i 1 ) − 1 ) S t r i d e K s…

“确定要在不复制其属性的情况下复制此文件?”解决方案(将U盘格式由FAT格式转换为NTFS格式)

文章目录 1.问题描述2.问题分析3.问题解决3.1 方法一3.2 方法二3.3 方法三 1.问题描述 从电脑上复制文件到U盘里会出现“确定要在不复制其属性的情况下复制此文件&#xff1f;”提示。 2.问题分析 如果这个文件在NTFS分区上&#xff0c;且存在特殊的安全属性。那么把它从NT…

CodeFuse开源这半年

2023 年可以称得上是大模型元年&#xff0c;在过去的这一年里&#xff0c;大模型领域飞速发展&#xff0c;新的大模型纷纷涌现&#xff0c;基于大模型的新产品也吸引着大家的眼球&#xff0c;未来&#xff0c;这个领域又会给大家带来多少惊喜&#xff1f; 蚂蚁也推出了自己的百…

STM32F103标准外设库——寄存器 (二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

9.1、加密技术原理详解

目录 一、加解密定义 二、加密技术分类 2.1、对称加密 2.2、非对称加密 三、对称加密算法 四、非对称加密算法 五、对称加密和非对称加密比较 六、对称加密和非对称加密结合 一、加解密定义 数据加密&#xff1a;对原来为明文的文件或数据按某种算法进行处理&#x…

项目解决方案:多个分厂的视频监控汇聚到总厂

目 录 1、概述 2、建设目标及需求 2.1 建设目标 2.2 需求描述 2.3 需求分析 3. 设计依据与设计原则 3.1 设计依据 3.2设计原则 1、先进性与适用性 2、经济性与实用性 3、可靠性与安全性 4、开放性 5、可扩充性 6、追求最优化的系统设备配置…

vue-ESlint代码规范及修复

1. 介绍 ESLint:是一个代码检查工具&#xff0c;用来检查你的代码是否符合指定的规则(你和你的团队可以自行约定一套规则)。 在创建项目时&#xff0c;我们使用的是 JavaScript Standard Style 代码风格的规则。 规范网址&#xff1a;https://standardjs.com/rules-zhcn.htm…

(2024,分数蒸馏抽样,Delta 降噪分数,LoRA)PALP:文本到图像模型的提示对齐个性化

PALP: Prompt Aligned Personalization of Text-to-Image Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 4. 提示对齐方法 4.1 概述 4.2 个性化 4.3 提示对齐分数抽…

小迪安全第二天

文章目录 一、Web应用&#xff0c;架构搭建二、web应用环境架构类三、web应用安全漏洞分类总结 一、Web应用&#xff0c;架构搭建 #网站搭建前置知识 域名&#xff0c;子域名&#xff0c;dns,http/https,证书等 二、web应用环境架构类 理解不同web应用组成角色功能架构 开发…

【固态钽表面贴装电容】 MIL-PRF-55365 美军标

钽电解电容器是体积效率、电气参数稳定、高可靠性和长使用寿命是主要考虑因素的应用的首选。 钽/氧化钽/二氧化锰系统的稳定性和对高温的耐受性使固体钽消泡器成为当今表面贴装组装技术的合适选择。 钽不是纯净状态的。 相反&#xff0c;它通常存在于许多氧化物矿物中&#xf…