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. 解决oracle18c没有hr用户

    1.查找系统变量ORACLE_HOME的值 2.按照路径寻找sql文件 ORACLE_HOME变量值+demo\schema\human_resources 3.把hr_main.sql脚本文件放在此 ...

  2. JS学习笔记 (三) 对象进阶

    1.JS对象 1.1 JS对象特征 1.JS对象是基本数据数据类型之一,是一种复合值,可以看成若干属性的集合. 属性是名值对的形式(key:value) 属性名是字符串,因此可以把对象看成是字符串到值 ...

  3. Agda学习笔记1

    目录 Agda学习笔记1 快捷键 refl Natural Number 自然数集合 operations rewrite cong 加法结合律 加法交换律 乘法分配律 比较大小 衍生的一些证明 be ...

  4. Windows操作系统搭建Lsky Pro

    写在前面 本文主要介绍在Windows下部署兰空图床,以及安装过程, 非Windows系统可以参考本文章的安装流程,结合自己系统版本进行部署 图床用处 图床在日常的用处非常广泛,尤其对于经常写博客的人 ...

  5. 46.drf过滤、搜索、排序

    DRF的过滤类 drf过滤器在filters模块中,主要有四个类 BaseFilterBackend:过滤基类,留好占位方法待后续继承 SearchFilter:继承BaseFilterBackend ...

  6. C语言实现计算“已经活了多少天”

    输入生日,通过系统或者自己输入,获得当前日期,计算已经存活了多少天. #include<stdio.h> #include<time.h> /** * 函数介绍: * 通过输入 ...

  7. String常用API

    String常用API 1. 获取字符串长度 int length = str.length(); 2. 根据索引,返回字符串中对应的字符 char c = str.chaeAt(length-1); ...

  8. Redis管理及监控工具推荐

    推荐一款Redis管理软件.[官网 http://www.redisant.cn/] 功能描述: 1. 键和字段CRUD和glob. 2. 适用于字符串.列表.散列.集合.有序集合. 通过漂亮的用户界 ...

  9. 重学c#系列——委托和匿名函数[二十五]

    前言 简单介绍一下什么是委托. 正文 以前也写过委托,这次算是重新归档,和新的补充吧. https://www.cnblogs.com/aoximin/p/13940125.html 有些人说委托是函 ...

  10. 关于python3格式化字符输出的问题

    前言 今天简答写了一个爬虫,利用 % 格式化输出总是有问题 第一种写法: url = 'https://yysygw.res.netease.com/pc/gw/20190826151318/data ...