spring4-4-jdbc-02
1.简化 JDBC 模板查询
- 每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下.
- JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中.(推荐使用)
- JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发
- 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); }