• 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等框架混合使用。

  • 相关阅读:
    C#中将全部代码一次性折叠
    C#中图片单击旋转事件
    块参照重命名
    补强圈设计
    c# winform 按名称取得控件
    获得某控件的父控件(容器)中的所有控件
    回车键当Tab键使用
    替换CAD中原有命令为开发人员自己开发的命令的方法
    窗体设置
    判断控件的tag是否为空的方法
  • 原文地址:https://www.cnblogs.com/fulong133/p/12712712.html
Copyright © 2020-2023  润新知