Spring框架|JdbcTemplate介绍

文章目录
JdbcTemplate 概述
对JdbcTemplate进行分步演示
1:测试数据源
2:为IoC容器配置一个JdbcTemplate
3:更新,将emp_id=5的记录salary字段改为1300.00
4:批量插入
5:查询emp_id=5的记录,封装为一个Java对象返回。
6:查询salary>4000的记录,封装为List集合返回
7:查询最大的salary
8:使用具名参数SQL插入一条员工记录,并以Map形式传入参数值。
9:使用具名参数SQL插入一条员工记录,并以SqlparamSource传入参数值。

JdbcTemplate 概述

在之前的Javaweb学习中,学习了手动封装JdbcTemplate,其好处是通过(sql语句+参数)模板化了编程。而真正的JdbcTemplate类,是Spring框架为我们写好的。它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。

除了JdbcTemplate,spring 框架还为我们提供了很多的操作模板类。

  • 操作关系型数据的:JdbcTemplate和HibernateTemplate。
  • 操作 nosql 数据库的:RedisTemplate。
  • 操作消息队列的:JmsTemplate。

Spring框架的JdbcTemplate在spring-jdbc的jar包中,,除了要导入这个 jar 包
外,还需要导入一个 spring-tx的jar包(它是和事务相关的)。当然连接池的jar包也不能忘记,这里使用的是c3p0。
使用JdbcTemplate一定要导入Spring的数据库模块的三个jar:


20200326175028437.png

如果是springboot maven的项目,需要jdbc依赖:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

使用JdbcTemplate可以快捷的操作数据库,本文章针对JdbcTemplate进行演示。本文所使用的数据库表为jdbctemplate中的employee,表的内容如下。


table.png

对JdbcTemplate进行分步演示

数据库配置文件

  • jdbctemplate数据库在本地数据库中已经创建。
jdbc.user=root
jdbc.password=Hudie
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/jdbctemplate
jdbc.driverClass=com.mysql.jdbc.Driver
  • xml配置文件
<!-- 引入外部配置文件 -->
    <context:property-placeholder location="classpath:dbconfig.properties" />
        
    <!-- 配置数据源 -->
    <bean id="dataSource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
    </bean>

springboot默认启动的时候已经将JdbcTemplate对象加入Spring Iop容器中,所以springboot不需要配置bean

  • 测试获取连接
public class txTest {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("ApplicationContext.xml");

    @Test
    public void test() throws SQLException {
        DataSource bean = ioc.getBean(DataSource.class);
        Connection connection = bean.getConnection();
        System.out.println(connection);
        connection.close();
    }
}

执行测试,成功获取到连接。


result1.png

2:为IoC容器配置一个JdbcTemplate

如果通过编码来进行获得一个JdbcTemplate对象,可以使用new JdbcTemplate(dataSource);,不过由于这个对象经常使用,将其放在IoC容器中更合适。
具体配置如下:

    <!-- Spring提供了一个JdbcTmplate来操作数据库 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
    </bean>

测试

public class txTest {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    JdbcTemplate jdbcTemplate= ioc.getBean(JdbcTemplate.class);

    @Test
    public void test2() {
        System.out.println(jdbcTemplate);
    }
}

成功打印出JdbcTemplate对象。


result2.png

3:更新,将emp_id=5的记录salary字段改为1300.00

  • jdbcTemplate.updat():表示更新一条记录。
    @Test
    public void test3() {
        String sql = "update employee set salary = ? where emp_id=?;";
        int update = jdbcTemplate.update(sql, 1300.00, 5);
        System.out.println("更新员工表,影响" + update + "行");
    }
result3.png

4:批量插入

  • jdbcTemplate.batchUpdate(sql, batchArgs):表示批量进行插入,插入一个list集合,返回的是影响的行数。
@Test
    public void test4() {

        String sql = "insert into employee (emp_name,salary) values(?,?)";
        List<Object[]> batchArgs = new ArrayList<Object[]>();
        batchArgs.add(new Object[] { "张三", 998.98 });
        batchArgs.add(new Object[] { "李四", 998.98 });
        batchArgs.add(new Object[] { "王五", 998.98 });
        batchArgs.add(new Object[] { "赵六", 998.98 });

        // List的长度就是sql语句执行的次数
        int[] is = jdbcTemplate.batchUpdate(sql, batchArgs);
        for (int i : is) {
            System.out.println(i);
        }
    }
  • int[] is = jdbcTemplate.batchUpdate(sql, batchArgs);返回的结果是影响的行数。


    result4.png

5:查询emp_id=5的记录,封装为一个Java对象返回。

  • 创建JavaBean
package com.gql.bean;

public class Employee {
    private Integer empId;
    private String empName;
    private Double salary;
    //省略setter、getter与toString方法。
}

查询并封装单条记录

@Test
    public void test5() {
        String sql = "select emp_id empId,emp_name empName,salary from employee where emp_id=?";
        // rowMapper:规定每一行记录和JavaBean的属性如何映射
        Employee employee = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Employee.class), 5);
        System.out.println(employee);
    }
result5.png

6:查询salary>4000的记录,封装为List集合返回

    @Test
    public void test6() {
        String sql = "select emp_id empId,emp_name empName,salary from employee where salary>?";
        List<Employee> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class), 4000);
        for (Employee employee : list) {
            System.out.println(employee);
        }
    }

成功将salary>400的记录封装进list集合.


result6.png

7:查询最大的salary

  • 使用mysql的max函数可以获得最大的salary,调用queryForObject方法,返回Double类型。
@Test
    public void test7() {
        String sql = "select max(salary) from employee";
        Double object = jdbcTemplate.queryForObject(sql, Double.class);
        System.out.println("最高工资是:" + object);
    }
result7.png

8:使用具名参数SQL插入一条员工记录,并以Map形式传入参数值。

  • Spring中使用namedParameterJdbcTemplate来进行含有具名SQL的操作。

将namedParameterJdbcTemplate加到IoC容器中。

<!-- 配置一个具名参数的Jdbctemplate -->
    <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <!-- 使用构造器注入一个数据源 -->
        <constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
    </bean>

在测试中以Map形式传入参数值。

public class txTest {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);
    NamedParameterJdbcTemplate namedJdbcTemplate = ioc.getBean(NamedParameterJdbcTemplate.class);

    @Test
    public void test9() {
        String sql = "insert into employee (emp_name,salary) values(:empName,:salary)";
        Map<String, Object> paramMap = new HashMap<>();
        // 将所有具名参数的值都放在map中
        paramMap.put("empName", "小红");
        paramMap.put("salary", 12000.00);
        int update = namedJdbcTemplate.update(sql, paramMap);
        System.out.println(update);
    }
}

9:使用具名参数SQL插入一条员工记录,并以SqlparamSource传入参数值。

与上一条实验类似,只是选用了不同的参数类型。

@Test
    public void test10() {
        String sql = "insert into employee (emp_name,salary) values(:empName,:salary)";
        Employee employee = new Employee();
        employee.setEmpName("小蓝");
        employee.setSalary(9999.00);
        int i = namedJdbcTemplate.update(sql, new BeanPropertySqlParameterSource(employee));
        System.out.println(i);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容