spring4-4-jdbc-02

1.简化 JDBC 模板查询

  1. 每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下.
  2. JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中.(推荐使用)
  3. JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发
  4. Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. 该类声明了 jdbcTemplate 属性, 它可以从 IOC 容器中注入, 或者自动从数据源中创建.(不推荐使用)

 

第二条示例:

package com.l1.spring.jdbc;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@Repository
public class EmployeeDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public Employee get(int id){
        
        String sql  = "select id,name,email from employees where id=?";
        RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
        Employee employee = jdbcTemplate.queryForObject(sql, rowMapper,id);
        return employee;
    }
    
}

 

第四条使用:

/**
 * 不推荐使用 JdbcDaoSupport, 而推荐直接使用 JdbcTempate 作为 Dao 类的成员变量
 */
@Repository
public class DepartmentDao extends JdbcDaoSupport{

    @Autowired
    public void setDataSource2(DataSource dataSource){
        setDataSource(dataSource);
    }

    public Department get(Integer id){
        String sql = "SELECT id, dept_name name FROM departments WHERE id = ?";
        RowMapper<Department> rowMapper = new BeanPropertyRowMapper<>(Department.class);
        return getJdbcTemplate().queryForObject(sql, rowMapper, id);
    }
    
}

 2. 在 JDBC 模板中使用具名参数

  在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.

    在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter).
  具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
  具名参数只在 NamedParameterJdbcTemplate 中得到支持

1     <!-- 配置 NamedParameterJdbcTemplate,该对象可以使用具名参数,为有参构造器-->
2     <bean id="namedParameterJdbcTemplate"
3             class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
4         <constructor-arg ref="dataSource"></constructor-arg>        
5     </bean>

 



2.1参数:
  在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键,也可以使用 SqlParameterSource 参数
  批量更新时可以提供 Map 或 SqlParameterSource 的数组


2.2 优缺点:

  1).优点是: 若有多个参数,不用再直接对应位置,可以直接对应参数名,便于维护.

  2).缺点是:比较麻烦.

2.3 demo:

  

 1 @Test
 2     public void testNamedParams(){
 3         NamedParameterJdbcTemplate  jdbcTemplate = ctx.getBean("namedParameterJdbcTemplate",NamedParameterJdbcTemplate.class);
 4     
 5         String sql = "insert into employees (name,email,dept_id) values(:name,:email,:dept_id)";
 6         Map<String,Object> paramMap = new HashMap<String,Object>();
 7         paramMap.put("name", "孙七");
 8         paramMap.put("email", "sunqi@si.com");
 9         paramMap.put("dept_id", 3);
10         jdbcTemplate.update(sql, paramMap);
11     
12     }

 可以传入对象形式的参数:

  /**
     * 参数为对象形式
   * 1.SQL语句中的参数名和类的属性要一致
   *
*/ @Test public void testNamedParams(){ NamedParameterJdbcTemplate namedParamjdbcTemplate = ctx.getBean("namedParameterJdbcTemplate",NamedParameterJdbcTemplate.class); String sql = "insert into employees (name,email,dept_id) values(:name,:email,:dept_id)"; Employee employee = new Employee(); employee.setName("赵八"); employee.setEmail("zhaoba@si.com"); employee.setDept_id(2); SqlParameterSource paramSource = new BeanPropertySqlParameterSource(employee); namedParamjdbcTemplate.update(sql, paramSource); }

 

posted @ 2015-07-01 18:10  勿妄  阅读(374)  评论(0编辑  收藏  举报