简介
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的实现方式可谓是大大的减少了我们操作数据的成本。还是值得推荐的。