Spring JDBC Template

3 篇文章 1 订阅
1 篇文章 0 订阅

简介

    JDBC Template的由来,为了使我们操作数据库更加的方便,更加易用。Spring在JDBC API的基础上定义了一层抽象层,建立一套新的操作数据库的框架。JDBC Template作为Spring JDBC的框架核心,JDBC模板的设计是为不同类型的JDBC提供模板方法,,每一个模板都能控制整个过程,并覆盖过程中的特定任务,通过这种方式在竟可能保留灵活性的情况下,将数据库存取工作量讲到最低。

  Spring支持不同的持久化技术,这里我们要说的是JDBC Template;  此外spring还提供Hibernate的HibernateTemplate;IBatis 的SqlMapClientTemplate; JPA的 JpaTemplate; 对于不同的框架都有不同的工具提供支持。

使用

下面我们就通过JDBC Template 来实现CRUD,看看这里是如何实现的;

首先新建spring项目导入需要的的jar包;spring-jdbc、 c3p0、mysql-connector 我这里使用的是mysql数据,所有选择mysql驱动,根据自己需要。

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>

配置文件

1.新建db.properties 文件

jdbc.user=root
jdbc.password=123456
jdbc.dirverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test

jdbc.initPoolSize=5
jdbc.maxPoolSize=10

2.利用spring的注入实现容器中的自动注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"
>
    <!--自动扫描包 -->
    <context:component-scan base-package="com.jdbcTemplate.*">        </context:component-scan>

    <!-- 导入资源文件-->
    <context:property-placeholder location="db.properties"/>

    <!--配置从c3po数据源 -->
    <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.url}"></property>
        <property name="driverClass" value="${jdbc.dirverClass}"></property>

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

    <!--配置Spring 的Template -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置NamedParameterJdbcTemplate 该对象没有无参的构造方法,需要使用有参构造器,一般选用     dataSourc -->
    <bean id="namedParameterJdbcTemplate"    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"></constructor-arg>
    </bean>

</beans>

我们在数据库中随便建一张测试表;我这里创建的一张简单的user表,写了一条测试数据;

创建User.java实体类和测试类JdbcTemplateTest;如下图测试是否成功。

 

接下来通过几个实例测试JDBC Template的CRUD;

1.查询

     /**
     *查询某一条记录
     */
    @Test
    public void querySql(){
        //sql语句
        String sql = "select ID id, user_name name, user_code code, user_age age    from user where id =?";
        //返回值类型
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
        //param 1.sql语句 2.返回值类型 3.sql需要传入的动态值
        User user = jdbcTemplate.queryForObject(sql, rowMapper, 1);
        System.out.println(user);
    }


对比数据我们开始时候的模拟数据,查询方法是成功的。

2.插入(新增)

 

查看数据库新增成功;一条一条插入效率会非常低,怎么能实现批量插入?

 

通过传入Object类型的集合的形式可以实现批量新增;

操作新增的方法不止一个,可以看各自实现的方式,传入相应的参数即可;

既然能批量新增,能不能批量查询?显然是可以的;

实现批量查询,查询的方法还是很多的,可以看一下封装的实现方法;

3.修改

可以看到数据库中ID为1的tom已经被修改完成;

4.删除

通过查询数据库可以看到id为1的数据已经被删除;这里为什么还使用update,其实没有封装真实delete方法名的方法,delete其实也是更新操作;除了我们的查询方法;新增、删除、修改本质上还是对数据进行了更新操作;

具名参数的使用

  是什么?

   这里我们测试的数据量都少,看似很容易来匹配,如果实体类的属性多的话,后面写的sql语句中的value(?,?,?.....)值多的话就很难不保证后面的匹配不会出错;这时候具名参数就起到很好的作用;通过绑定参数名与值得防止,就避免了传值可能会出错的问题,而且还可以直接传递实体对象,直接就与具名的属性匹配,还是很方便的;使用具名参数可以提升我们的阅读性,便于我们维护;

如何使用?

 首先在spring配置文件中添加相关的配置;上面的spring配置文件中我已经将其贴出,通过 NamedParameterJdbcTemplate 对象来实现具名参数的使用;

测试 

新增

通过具名函数的方式也可以实现新增操作;

但是在真实的项目场景中,不会让我们来一个一个的写参数的值,往往是通过前段传递过来的值,通过封装成具体对象的方式;来实现数据的变更;

通过传递对象的方式也能实现新增的操作。

上面就是JDBC Template来操作数据库的实现方式,相比传统的连接先创建驱动对象再连接数据库,再通过执具体的方法来操作数据库还需要将值在取出的方式,最后还需要关闭数据库的连接;JDBC Template的实现方式可谓是大大的减少了我们操作数据的成本。还是值得推荐的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值