day14-JdbcTemplate-01
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
- 通过Spring可以配置数据源,从而完成对数据表的操作
- JdbcTemplate 是 spring 提供的访问数据库的技术。可以将 JDBC 的常用操作封装为模板方法。
2.使用实例
需求说明:使用 Spring 的方式来完成 JdbcTemplate 配置和使用
一、搭建环境:
引入JdbcTemplate 需要的jar包(Spring5)
创建数据库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
- 创建配置文件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
- 创建容器配置文件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>
- 测试连接
@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();
}
成功连接:
- 配置 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的更多相关文章
- Spring JdbcTemplate 的使用与学习
JDBCTemplate 是SPRING 框架自带的一种对sql 语句查询的封装 ,封装非常完善,虽然与Hibernate比起来有一点麻烦,但是学号JDBCTemplate可以让我们用Spirngmv ...
- Spring JdbcTemplate 的使用与学习(转)
紧接上一篇 (JdbcTemplate是线程安全的,因此可以配置一个简单的JdbcTemplate实例,将这个共享的实例注入到多个DAO类中.辅助的文档) Spring DAO支持 http://ww ...
- JdbcTemplate三种常用回调方法
JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法. 如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便 ...
- Spring JdbcTemplate小结
提供了JdbcTemplate 来封装数据库jdbc操作细节: 包括: 数据库连接[打开/关闭] ,异常转义 ,SQL执行 ,查询结果的转换 使用模板方式封装 jdbc数据库操作-固定流程的动作,提供 ...
- Python之路,Day14 - It's time for Django
Python之路,Day14 - It's time for Django 本节内容 Django流程介绍 Django url Django view Django models Django ...
- spring boot与jdbcTemplate的整合案例2
简单入门了spring boot后,接下来写写跟数据库打交道的案例.博文采用spring的jdbcTemplate工具类与数据库打交道. 下面是搭建的springbootJDBC的项目的总体架构图: ...
- Spring配置JDBCTemplate
案例:单测查询全部学生 项目结构: 1.导入部署jar包:spring-jdbc <!--spring-jdbc--> <dependency> <groupId> ...
- python学习 day14 (3月19日)----
04 json # 1. 用于多种语言 交互 编程语言通用数据 # 内置的 不需要安装直接导入使用 import json # 导入 # # dumps loads dump load # dic = ...
- spring+spring mvc+JdbcTemplate 入门小例子
大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒) https://www.cnblo ...
- Spring学习笔记:jdbcTemplate和数据源配置
一.使用Spring框架jdbcTemplate实现数据库的增删改查 1.数据库 /* SQLyog Ultimate v8.32 MySQL - 5.7.19-log : Database - in ...
随机推荐
- 2022春每日一题:Day 26
题目:无聊的数列 区间增加等差序列,似乎不好维护,等差等差,那就差分呗,单点查询,更加肯定,直接差分,每次加了一个等差序列容易发现只需要对应的差分数组a[l]+=k,a[l+1]...a[r]+=d, ...
- python编程学习方法及计算机基础理论
**从零开始学习编程 ** 一.学习前语 在学习python之前首先先说几点学习建议,首先是培养自己能解决问题的能力: 1.遇到问题时给自己设置一个解决该问题的时间限制 0-5min:自己解决问题(百 ...
- Java9-17新特性一览,了解少于3个你可能脱节了
前言 Java8出来这么多年后,已经成为企业最成熟稳定的版本,相信绝大部分公司用的还是这个版本,但是一眨眼今年Java19都出来了,相信很多Java工程师忙于学习工作对新特性没什么了解,有的话也仅限于 ...
- 【Java】【数据库】索引为何使查询变得更快?--B+树
排序数据的二分查找 二分查找的时间复杂度是\(O(log_2n)\),明显快于暴力搜索. 索引 建立索引的数据,就是通过事先排好顺序,在查找时可以应用二分查找来提高查询效率. 所以索引应该尽可能建立在 ...
- linux基础第二部分
一.Linux命令执行过程 先判断是否是别名,如果是直接执行,不是看是否是内部命令 如果是内部命令,直接执行,不是看hash表 hash表中有源文件直接执行,找不到报错 若hash表中不存在去外部规定 ...
- C#深拷贝方法
概述 为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做. 方法一(利用反射实现 ...
- SQL语句查询关键字:where筛选、group by分组、distinc去重、order by排序、limit分页、操作表的SQL语句布补充
目录 SQL语句查询关键字 前期数据准备 编写SQL语句的小技巧 查询关键字之where筛选 查询关键字之group by分组 查询关键字之having过滤 查询关键字值distinct去重 查询关键 ...
- js 获取当前时间转换时间戳 (毫秒)
js 当前时间转换毫秒数 五种方式 var date = new Date().getTime(); var date = new Date().valueOf(); var date = +ne ...
- Linux第四章 进程
4.1 前言 本章讨论进程概念.资源.属性. 4.2 内核和进程的关系 当系统启动时,内核代码被加载到内存,初始化之后,启动第一个用户进程,然后内核的代码就等着用户进程来调度了. 4.3 进程是程序的 ...
- HBase详解(05) - HBase优化 整合Phoenix 集成Hive
HBase详解(05) - HBase优化 整合Phoenix 集成Hive HBase优化 预分区 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维 ...