JdbcTemplate-01

看一个实际需求:

如果希望使用spring框架做项目,Spring框架如何处理对数据库的操作呢?

  • 方案一:使用之前的JdbcUtils类

  • 方案二:spring提供了一个操作数据库(表)的功能强大的类JdbcTemplate。我们可以通过ioc容器来配置一个JdbcTemplate对象,使用它来完成对数据库表的各种操作。

1.基本介绍

JdbcTemplate APIs:下载的文档-spring-5.3.8-dist\spring-framework-5.3.8\docs\javadoc-api\index.html

  1. 通过Spring可以配置数据源,从而完成对数据表的操作
  2. JdbcTemplate 是 spring 提供的访问数据库的技术。可以将 JDBC 的常用操作封装为模板方法。

2.使用实例

需求说明:使用 Spring 的方式来完成 JdbcTemplate 配置和使用

一、搭建环境:

  1. 引入JdbcTemplate 需要的jar包(Spring5)

  2. 创建数据库spring和表monster

-- 创建数据库
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,'蜘蛛怪','吐丝');

二、配置DataSource

  1. 创建配置文件src/jdbc.properties(key值随意)

在spring的ioc容器中,可以通过属性文件给bean注入值

jdbc.user=root
jdbc.pwd=123456
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
  1. 创建容器配置文件src/JdbcTemplate_ioc.xml
<!--引入外部的属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源对象-DataSource-->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
<!--给数据源对象配置属性值-->
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
</bean>
  1. 测试连接
@Test
public void testDatasourceByJdbcTemplate() throws SQLException {
//获取容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//因为 ComboPooledDataSource实现了 DataSource接口,这里使用接口类型来获取对象
DataSource dataSource = ioc.getBean(DataSource.class);
Connection connection = dataSource.getConnection();
System.out.println("获取到连接connection=" + connection);
connection.close();
}

成功连接:

  1. 配置 JdbcTemplate_ioc.xml,将数据源分配给 JdbcTemplate bean对象
<!--配置JdbcTemplate对象-->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<!--给JdbcTemplate对象配置DataSource属性-->
<property name="dataSource" ref="dataSource"/>
</bean>

2.1添加数据

@Test
public void addDataByJdbcTemplate() {
//获取容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//获取JdbcTemplate对象
JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class); //1.添加方式
String sql = "insert into monster values(400,'红孩儿','风火轮')";
jdbcTemplate.execute(sql); //2.添加方式 2(推荐)
String sql2 = "insert into monster values(?,?,?)";
//返回的 int类型 表示执行后表受影响的记录数
int affected = jdbcTemplate.update(sql2, 500, "牛魔王", "芭蕉扇");
System.out.println("add ok affected = " + affected);
}

添加成功:

2.2修改数据

//测试通过JdbcTemplate对象完成修改数据
@Test
public void updateDataByJdbcTemplate() {
//获取容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml"); //获取JdbcTemplate对象
JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class); String sql = "update monster set skill=? where id=?";
int affected = jdbcTemplate.update(sql, "美人计", 300);
System.out.println("update is ok, affected = " + affected);
}

修改成功:

2.3批量处理

对于某个类,如果有很多API,使用的步骤:

1.先确定API名字 2.根据API提供的参数,组织参数 3.根据API可以推测类似的用法和功能

//批量添加两个 monster
@Test
public void addBatchDataByJdbcTemplate() {
//获取容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml"); //获取JdbcTemplate对象
JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class); //1.准备参数
String sql = "insert into monster values(?,?,?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{600, "白蛇", "翻江倒海"});
batchArgs.add(new Object[]{700, "青蛇", "竹叶青"}); //2.调用
//int[] batchUpdate(String sql, List<Object[]> batchArgs);
//说明:返回结果为int数组,每个元素对应上面的sql语句对表的影响记录数
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs); //输出
for (int anInt : ints) {
System.out.println("anInt=" + anInt);
}
System.out.println("batch add is ok..");
}

批处理结果:

2.4查询

实体类 Monster.java

package com.li.bean;

/**
* @author 李
* @version 1.0
* Javabean / Entity
*/
public class Monster {
private Integer monsterId;
private String name;
private String skill; //无参构造器一定要有,spring底层反射创建对象时需要使用
public Monster() {
} //全参构造器
public Monster(Integer monsterId, String name, String skill) {
this.monsterId = monsterId;
this.name = name;
this.skill = skill;
} public Integer getMonsterId() {
return monsterId;
} public void setMonsterId(Integer monsterId) {
this.monsterId = monsterId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSkill() {
return skill;
} public void setSkill(String skill) {
this.skill = skill;
} @Override
public String toString() {
return "Monster{" +
"monsterId=" + monsterId +
", name='" + name + '\'' +
", skill='" + skill + '\'' +
'}';
}
}

2.4.1查询单行多列

查询 id=500 的 monster 并封装到 Monster 实体对象

//查询 id=100的 monster并封装到 Monster实体对象
@Test
public void selectDataByJdbcTemplate() {
//获取容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//获取JdbcTemplate对象
JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class); //1.确定API
//<T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) //2.准备参数
//注意:封装对象时,如果查询返回的字段名和实体对象的属性名不一致会出现问题,最好使用别名!
String sql = "SELECT id AS monsterId , NAME, skill FROM monster WHERE id=?";
//使用RowMapper接口来对返回的数据,进行一个封装(底层是反射->setter)
RowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class); //3.调用
Monster monster = jdbcTemplate.queryForObject(sql, rowMapper, 500);
System.out.println("monster=" + monster);
}

查询结果:

2.4.2查询多行多列

查询 id>=200 的 monster,并封装到 Monster 实体对象

//查询 id>=200的 monster并封装到 Monster实体对象
@Test
public void selectMulDataByJdbcTemplate() {
//获取容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//获取JdbcTemplate对象
JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class); //1.确定API
//public <T> T query(String sql, ResultSetExtractor<T> rse, @Nullable Object... args)
//2.组织参数
String sql = "SELECT id AS monsterId , NAME, skill FROM monster WHERE id>= ?";
BeanPropertyRowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class); List<Monster> query = jdbcTemplate.query(sql, rowMapper, 200);
for (Monster monster : query) {
System.out.println("monster=" + monster);
}
}

查询结果:

2.4.3查询单行单列

查询返回结果只有单行单列的值,比如查询表中的总记录数,或者查询 id=200 的 name 字段的值

//查询 id>=200的 monster并封装到 Monster实体对象
@Test
public void selectScalarByJdbcTemplate() {
//获取容器
ApplicationContext ioc =
new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
//获取JdbcTemplate对象
JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class); //1.确定API
// public <T> T queryForObject(String sql, Class<T> requiredType, @Nullable Object... args)
//requiredType 表示返回的单行单列的 值的 数据类型 //2.组织参数
String sql = "SELECT NAME FROM monster WHERE id=?";
String sql2 = "SELECT COUNT(*) FROM monster";
//3.调用
String name = jdbcTemplate.queryForObject(sql, String.class, 200);
Integer count = jdbcTemplate.queryForObject(sql2, Integer.class);
System.out.println("id=200 的 name = " + name);
System.out.println("monster表的总记录数 = " + count);
}

查询结果:

2.5具名参数

  • 在 JDBC用法中,SQL参数是用占位符 ? 表示,并且受到位置的限制。

    定位参数的问题在于,一旦参数的位置发生变化,必须改变参数的绑定,在Spring JDBC中,绑定SQL参数的另一种选择是使用具名参数 (named parameter),SQL具名参数是按照名称绑定,而不是位置绑定。

  • 什么是具名参数?

    具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定。具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。

day14-JdbcTemplate-01的更多相关文章

  1. Spring JdbcTemplate 的使用与学习

    JDBCTemplate 是SPRING 框架自带的一种对sql 语句查询的封装 ,封装非常完善,虽然与Hibernate比起来有一点麻烦,但是学号JDBCTemplate可以让我们用Spirngmv ...

  2. Spring JdbcTemplate 的使用与学习(转)

    紧接上一篇 (JdbcTemplate是线程安全的,因此可以配置一个简单的JdbcTemplate实例,将这个共享的实例注入到多个DAO类中.辅助的文档) Spring DAO支持 http://ww ...

  3. JdbcTemplate三种常用回调方法

    JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法. 如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便 ...

  4. Spring JdbcTemplate小结

    提供了JdbcTemplate 来封装数据库jdbc操作细节: 包括: 数据库连接[打开/关闭] ,异常转义 ,SQL执行 ,查询结果的转换 使用模板方式封装 jdbc数据库操作-固定流程的动作,提供 ...

  5. Python之路,Day14 - It's time for Django

    Python之路,Day14 - It's time for Django   本节内容 Django流程介绍 Django url Django view Django models Django ...

  6. spring boot与jdbcTemplate的整合案例2

    简单入门了spring boot后,接下来写写跟数据库打交道的案例.博文采用spring的jdbcTemplate工具类与数据库打交道. 下面是搭建的springbootJDBC的项目的总体架构图: ...

  7. Spring配置JDBCTemplate

    案例:单测查询全部学生 项目结构: 1.导入部署jar包:spring-jdbc <!--spring-jdbc--> <dependency> <groupId> ...

  8. python学习 day14 (3月19日)----

    04 json # 1. 用于多种语言 交互 编程语言通用数据 # 内置的 不需要安装直接导入使用 import json # 导入 # # dumps loads dump load # dic = ...

  9. spring+spring mvc+JdbcTemplate 入门小例子

    大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒)    https://www.cnblo ...

  10. Spring学习笔记:jdbcTemplate和数据源配置

    一.使用Spring框架jdbcTemplate实现数据库的增删改查 1.数据库 /* SQLyog Ultimate v8.32 MySQL - 5.7.19-log : Database - in ...

随机推荐

  1. JAVA系列之JVM内存调优

    一.前提 JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响.在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解.同时,在 ...

  2. 九、docker swarm主机编排

    一. 什么是Docker Swarm Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/do ...

  3. 十六、资源控制器之DaemonSet

    资源控制器之DaemonSet DaemonSet 确保全部(或者一些) Node上运行一个 Pod 的副本,当有 Node 加入集群时,也会为他们新增一个 Pod,当有 Node 从集群移除时,这些 ...

  4. Mysql之MGR高可用实战案例

    MGR高可用实战案例 1.环境准备 node1 rocky8.6 10.0.0.8 node2 rocky8.6 10.0.0.18 node3 rocky8.6 10.0.0.28 2.所有节点更改 ...

  5. 如何使用vscode快速配置C语言环境(简单实用)

    需要用到的工具: VSCode(Visual Studio Code) 一.首先打开官网链接,然后根据自己的电脑选择合适的安装程序进行下载. 二.在安装时默认点击下一步,最后记得勾选上添加path到系 ...

  6. Java8新特性:函数式编程

    1. 概述 函数式编程学习目的: 能够看懂公司里的代码 大数据量下处理集合效率更高 代码可读性高 消灭嵌套地狱 函数式编程思想: 面向对象思想需要关注用什么对象完成什么事情.而函数式编程思想就类似于我 ...

  7. JavaWeb3

    1. 会话技术 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间共享数据 方式: 客户端会话技术:Co ...

  8. zk系列二:zookeeper实战之分布式统一配置获取

    前面介绍了zk的一些基础知识,这篇文章主要介绍下如何在java环境下获取zk的配置信息:主要基于zk的监听器以及回调函数通过响应式编程的思想将核心代码糅合成一个工具类,几乎做到了拿来即用: 在分布式集 ...

  9. java判断手机号三大运营商归属的工具类

    package com.tymk.front.third; import java.util.regex.Pattern; public class OperatorsUtil { /** * 中国电 ...

  10. Pwn学习随笔

    Pwn题做题流程 使用checksec检查ELF文件保护开启的状态 IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试) 编写python的exp脚本进行攻击 (若攻击不成功)进行GDB动态调试 ...