JdbcTemplate

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:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
 
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="driverClass" value="${jdbc.drive_class}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        
        <property name="initialPoolSize" value="${initialPoolSize}"></property>
        <property name="maxPoolSize" value="${maxPoolSize}"></property>
    </bean>
    
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

针对修改单条数据

针对单条数据的操作,可以使用update方法,这个方法是用来支持insert,update,delete操作的,实例如下:
jdbcTemplate.update("insert into user(username, address, age) values(?,?,?)", "abc", "hz", 21);
jdbcTemplate.update("update user set username = ? where age = ? ", "lmy", "21");

针对修改多条数据

List<Object[]> args = new ArrayList<>();
Object[] arg1 = new Object[]{"lmw", "hz", "19"};
Object[] arg2 = new Object[]{"lmr", "hz", "16"};
args.add(arg1);
args.add(arg2);
jdbcTemplate.batchUpdate("insert into user(username, address, age) values(?, ?, ?)", args);

针对查询一个对象

RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);
User user = jdbcTemplate.queryForObject("select username name, address, age from user where age = ?", mapper, 16);

对User这个实体类进行查询,它通过使用RowMapper来映射数据库中的一行数据和实体类的一个实例。注意上述API只能放回一个对象,如果结果有多个就会报错。在进行映射时,通过将实体类的字段名作为要查的数据库中的字段的别名来完成映射。

针对查询多个对象

RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);
List<User> users = jdbcTemplate.query("select * from user where age = ?", mapper, 21);

针对其他类型数据的查询

List<Long> ages =  jdbcTemplate.queryForList("select age from user where username = ?", Long.class, "lmy");
Long count = jdbcTemplate.queryForObject("select count(*) from user ", Long.class);

  JdbcTemplate有一个问题很不方便,就是使用参数的占位符时,必须得按照顺序来写参数,如果顺序不对,则操作失败,这里新提供的NamedParameterJdbcTemplate可以用来解决这个问题,它提供了一个方式,可以通过参数名来映射参数而不是传统的"?"

  NamedParameterJdbcTemplate有两个构造函数,配置分别如下:

  使用DataSource初始化:

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"></constructor-arg>
</bean>

  使用JdbcTemplate初始化,如果看源码可以知道实际上是通过JdbcOperations的实例来初始化的,它是JdbcTemplate的接口:

<bean id="namedParameterJdbcTemplate1"  class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="jdbcTemplate"></constructor-arg>
</bean>

  具名参数时,通过:来标明一个参数,然后通过Map来完成参数的配置

String sql = "insert into user(username, address, age) values(:name, :address, :age)";
Map<String,Object> paramMap = new HashMap();
paramMap.put("name", "openwrt");
paramMap.put("address", "am");
paramMap.put("age", 34);
namedParameterJdbcTemplate.update(sql, paramMap);

通过NamedParameterJdbcTemplate也可以直接操作一个对象,如下所示:

String sql = "insert into user(username, address, age) values(:name, :address, :age)";
User user = new User();
user.setName("ssl");
user.setAddress("bm");
user.setAge(45);
SqlParameterSource source = new BeanPropertySqlParameterSource(user);
namedParameterJdbcTemplate.update(sql, source);

  使用时参数名称要和类的字段名相一致,如果不一致也会报错。SqlParameterSource是专门用来为NamedParameterJdbcTemplate提供参数的,通过它的一个实现类BeanPropertySqlParameterSource来提供JavaBean类的属性作为参数。

  org.springframework.jdbc.support.rowset.SqlRowSet接口:该对象和javax.sql.RowSet类相对应,RowSet的区别是SqlRowSet中的方法,从来不会抛出SQLException异常,通过jdbcTemplate可以获得该对象的实例
  org.springframework.jdbc.support.rowset.SqlRowSetMetaData接口:是对应于SqlRowSet的元数据接口,和java.sql.ResultSetMetaData相一致,也只是从来不会抛出SQLException异常,通过SqlRowSet可以获得该类的实例;

SqlRowSet rowSet = jdbcTemplate.queryForRowSet("select * from user limit 0");
SqlRowSetMetaData metaData = rowSet.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {  
    Map<String,String> fieldMap = new HashMap<String,String>();
    fieldMap.put("ColumnName", metaData.getColumnName(i));
    fieldMap.put("ColumnType", String.valueOf(metaData.getColumnType(i)));
    fieldMap.put("ColumnTypeName", metaData.getColumnTypeName(i));
    fieldMap.put("CatalogName", metaData.getCatalogName(i));
    fieldMap.put("ColumnClassName", metaData.getColumnClassName(i));
    fieldMap.put("ColumnLabel", metaData.getColumnLabel(i));
    fieldMap.put("Precision", String.valueOf(metaData.getPrecision(i)));
    fieldMap.put("Scale", String.valueOf(metaData.getScale(i)));
    fieldMap.put("SchemaName", metaData.getSchemaName(i));
    fieldMap.put("TableName", metaData.getTableName(i));
    fieldMap.put("SchemaName", metaData.getSchemaName(i));
    System.out.println(fieldMap);
}

使用到的类或接口有如下几个:
  org.springframework.jdbc.core.RowCallbackHandler接口:用于处理结果集中的每一行数据;
  org.springframework.jdbc.core.RowCountCallbackHandler类:实现了RowCallbackHandler接口,其中简单的实现对结果集元数据的获取,包括行数、列数、列名、列的类型等信息,顺便说一下这个类的实例只可以用一次;
  在源代码中给出了简单的使用方式,如下:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);  // reusable object
 
RowCountCallbackHandler countCallback = new RowCountCallbackHandler();  // not reusable
jdbcTemplate.query("select * from user", countCallback);
int rowCount = countCallback.getRowCount();

 


参考:
原文:https://blog.csdn.net/lmy86263/article/details/51020437

posted on 2018-10-28 09:27  溪水静幽  阅读(244)  评论(0)    收藏  举报