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

最新文章

  1. 获取本机IP地址
  2. c#将list集合转换为datatable的简单办法
  3. Android 网络HTML查看器
  4. web开发 虚拟目录映射
  5. POJ3321 Apple Tree(DFS序)
  6. 大礼包!ANDROID内存优化(大汇总)
  7. bm25
  8. Light Bulb--zoj3203(三分法)
  9. TCP 协议三次握手过程解析带实例
  10. leetcode 3Sum Closest python
  11. A计划
  12. testXSS &lt;img src=&quot;aa&quot; onerror=&quot;javascript:alert(&#39;XSS&#39;);&quot;/&gt;
  13. Luogu P1010 幂次方
  14. Win10系列:C#应用控件基础10
  15. hibernate操作mysql插入修改中文出现乱码
  16. 微信定时获取token
  17. PHP操作Redis常用技巧
  18. SpringBoot日记——SpringMvc自动配置与扩展篇
  19. ASP------字符串与HTML格式相互转换
  20. Oracle表空间和用户常用语句

热门文章

  1. Istio(十三):Istio项目实际案例——Online Boutique
  2. SLAM中的内外点
  3. JS逆向实战4--cookie——__jsl_clearance_s 生成
  4. php自定义分页类
  5. i春秋Not Found
  6. mybatis中xml的sql之test中文报错
  7. 批量将多个相同Excel表格内容合并到一个Excel表格的sheet工作簿当中。
  8. Nginx rewrite 详解
  9. 提高python异步效率
  10. JS传值与应用