Spring JdbcTemplate详解

转载:https://www.cnblogs.com/xuwenjin/p/8822354.html

为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.

作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种

方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.

JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

  • update方法:update方法用于执行新增、修改、删除等语句;

  • batchUpdate方法:batchUpdate方法用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;

  • call方法:用于执行存储过程、函数相关语句。

1、首先在数据库新建一张表

CREATE TABLE xwj_user (
   id VARCHAR(32) NOT NULL,
   last_name VARCHAR(32),
   age INT(2),
   email VARCHAR(32)
) ENGINE=INNODB DEFAULT CHARSET=utf8

2、在pom.xml文件中,增加依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.5.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.2.5.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <!-- 获取上下文 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- 连接到mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>
        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

3、在resource下面增加两个配置文件db.properties、applicationContext.xml

  db.properties配置文件:

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://dev.yonyouccs.com:3001/icop-construct-busisubpack

initPoolSize=5
maxPoolSize=10

在xml文件中,导入这个属性文件以及配置c3p0数据源:

<!-- 读取配置文件 -->
    <context:property-placeholder location="classpath:db.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="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>

        <property name="initialPoolSize" value="${initPoolSize}"></property>
        <property name="maxPoolSize" value="${maxPoolSize}"></property>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

4、创建一个实体类User

 1 package com.xwj.bean;
 2 
 3 public class User {
 4 
 5     private String id;
 6     private String lastName;
 7     private int age;
 8     private String email;
 9 
10     public String getId() {
11         return id;
12     }
13 
14     public void setId(String id) {
15         this.id = id;
16     }
17 
18     public String getLastName() {
19         return lastName;
20     }
21 
22     public void setLastName(String lastName) {
23         this.lastName = lastName;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }
33 
34     public String getEmail() {
35         return email;
36     }
37 
38     public void setEmail(String email) {
39         this.email = email;
40     }
41 
42     public String toString() {
43         return "User [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age +"] ";
44     }
45 
46 }

5、创建一个测试类对JdbcTemplate的方法进行测试:

  1 package com.xwj.util;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import org.junit.Test;
  7 import org.springframework.context.ApplicationContext;
  8 import org.springframework.context.support.ClassPathXmlApplicationContext;
  9 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 10 import org.springframework.jdbc.core.JdbcTemplate;
 11 import org.springframework.jdbc.core.RowMapper;
 12 import org.springframework.util.CollectionUtils;
 13 
 14 import com.xwj.bean.User;
 15 
 16 public class TestJdbc {
 17 
 18     private ApplicationContext ctx = null;
 19     private JdbcTemplate jdbcTemplate = null;
 20 
 21     {
 22         ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
 23         jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
 24     }
 25 
 26     /**
 27      * 执行 INSERT
 28      */
 29     @Test
 30     public void testInsert() {
 31         String sql = "INSERT INTO xwj_user(id, last_name, age) VALUES(?, ?, ?)";
 32         jdbcTemplate.update(sql, "1", "a-xwj", 0);
 33     }
 34 
 35     /**
 36      * 执行UPDATE
 37      */
 38     @Test
 39     public void testUpdate() {
 40         String sql = "UPDATE xwj_user SET last_name = ? WHERE id = ?";
 41         jdbcTemplate.update(sql, "b-xwj", 1);
 42     }
 43 
 44     /**
 45      * 执行 DELETE
 46      */
 47     @Test
 48     public void testDelete() {
 49         String sql = "DELETE from xwj_user WHERE id = ?";
 50         jdbcTemplate.update(sql, 1);
 51     }
 52 
 53     /**
 54      * 测试批量更新操作 最后一个参数是 Object[] 的 List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个
 55      * List 来存放多个数组。
 56      */
 57     @Test
 58     public void testBatchUpdate() {
 59         String sql = "INSERT INTO xwj_user(id, last_name, email) VALUES(?, ?, ?)";
 60 
 61         List<Object[]> batchArgs = new ArrayList<>();
 62         batchArgs.add(new Object[] { "2", "AA", "aa@atguigu.com" });
 63         batchArgs.add(new Object[] { "3", "BB", "bb@atguigu.com" });
 64         batchArgs.add(new Object[] { "4", "CC", "cc@atguigu.com" });
 65         batchArgs.add(new Object[] { "5", "DD", "dd@atguigu.com" });
 66 
 67         jdbcTemplate.batchUpdate(sql, batchArgs);
 68     }
 69 
 70     /**
 71      * 从数据库中获取一条记录,实际得到对应的一个对象 注意:不是调用 queryForObject(String sql,Class<Employee> requiredType, Object... args) 方法! 
 72      * 而需要调用queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
 73      * 1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper 
 74      * 2、使用SQL中的列的别名完成列名和类的属性名的映射,例如 last_name lastName 
 75      * 3、不支持级联属性。 JdbcTemplate只能作为一个 JDBC 的小工具, 而不是 ORM 框架
 76      */
 77     @Test
 78     public void testQueryForObject() {
 79         String sql = "SELECT id, last_name lastName, email FROM xwj_user WHERE ID = ?";
 80         RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
 81         // 在将数据装入对象时需要调用set方法。
 82         User user = jdbcTemplate.queryForObject(sql, rowMapper, 2);
 83         System.out.println(user);
 84     }
 85     
 86     /** 
 87      * 一次查询多个对象 
 88      * 注意:调用的不是 queryForList 方法 
 89      */  
 90     @Test  
 91     public void testQueryForList() {  
 92         String sql = "SELECT id, name, email FROM xwj_user WHERE id > ?";  
 93         RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);  
 94         List<User> userList = jdbcTemplate.query(sql, rowMapper, 1);  
 95         if (!CollectionUtils.isEmpty(userList)) {
 96             userList.forEach(user -> {
 97                 System.out.println(user);
 98             });
 99         }
100     }  
101     
102     /** 
103      * 获取单个列的值或做统计查询 
104      * 使用 queryForObject(String sql, Class<Long> requiredType)  
105      */  
106     @Test  
107     public void testQueryForCount() {  
108         String sql = "SELECT count(id) FROM xwj_user";  
109         long count = jdbcTemplate.queryForObject(sql, Long.class);  
110           
111         System.out.println(count);  
112     }     
113 
114 }

总结:JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错。但是功能还是不够强大(比如不支持级联属性),在实际应用中还需要和hibernate、mybaties等框架混合使用。

原文地址:https://www.cnblogs.com/fulong133/p/12712712.html