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);
}

相关推荐

  1. JdbcTemplate

    2024-01-16 17:26:02       27 阅读
  2. Spring JdbcTemplate

    2024-01-16 17:26:02       40 阅读
  3. 04--JdbcTemplate模版

    2024-01-16 17:26:02       41 阅读
  4. SpringBoot+jdbcTemplate连接MySQL

    2024-01-16 17:26:02       35 阅读
  5. SpringBoot+JdbcTempalte+SQLServer

    2024-01-16 17:26:02       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-16 17:26:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-16 17:26:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-16 17:26:02       87 阅读
  4. Python语言-面向对象

    2024-01-16 17:26:02       96 阅读

热门阅读

  1. ChatGPT绘画生成软件MidTool:智能艺术的新纪元

    2024-01-16 17:26:02       135 阅读
  2. 关于小程序短剧视频特点及解析

    2024-01-16 17:26:02       60 阅读
  3. 解决torchvision.model下载预训练模型太慢的问题

    2024-01-16 17:26:02       56 阅读
  4. 【git】如何提交pull request

    2024-01-16 17:26:02       43 阅读
  5. http 请求流程,网络的七层模型

    2024-01-16 17:26:02       52 阅读
  6. 在QT中使用POST方式发送HTTP数据

    2024-01-16 17:26:02       57 阅读