具名参数:

具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代

我们之前一直是用JDBCTemplate  进行Sql语句的 拼写 , 但是 当 一个行中有 多个 占位符时,很容易 搞混哪个值 是 哪个值。 那我们可以使用具名参数。

如何使用具名参数?

1. 在 xml 文件中加入对具名参数的支持

注意具名参数只能 使用 constructor-arg  并且必须对 dataSource 赋值

<!-- 具名参数 必须要有参数的构造器   没有无参的 -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg name="dataSource" ref="DataSource"></constructor-arg>
</bean>

applicationContext.xml

2. 在Java 类中引入 具名参数

import java.util.HashMap;
import java.util.Map; 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.jdbc.core.namedparam.EmptySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository; import com.myth.springJDBC.exception.AddFailedException;
import com.myth.springJDBC.po.Employee; @Repository
public class EmployeeDao {
@Autowired
private JdbcTemplate jdbcTemplate; @Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate; private String sql;

  //这个使用的 是 传统的 JdbcTemplate
public Employee getEmployee(int id) {
sql = "Select * from employees where id = ?";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
Employee employee = jdbcTemplate.queryForObject(sql, rowMapper,id);
return employee;
} //引入一个 空 的Map EmptySqlParameterSource.INSTANCE
public Integer getCount() {
sql = "select count(*) from employees";
int result = namedParameterJdbcTemplate.queryForObject(sql, EmptySqlParameterSource.INSTANCE, Integer.class);
return result;
}
/*这里也可以使用BeanPropertySqlParameterSource
* 这个意思就是把Map 转换为对象 来对待
*/
public void insertEmployee(Employee employee) {
sql = "INSERT INTO employees values (:ID,:ln,:email,:departID)";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ID", employee.getId());
paramMap.put("ln", employee.getLast_name());
paramMap.put("email", employee.getEmail());
paramMap.put("departID", employee.getDept_id()); try {
namedParameterJdbcTemplate.update(sql, paramMap);
System.out.println("添加成功");
} catch (Exception e) {
throw new AddFailedException("添加失败");
}
}    //要注意具名参数要和Bean中的属性值要一致。
   public void updateEmployee(Employee employee) {
      sql = "UPDATE employees set LAST_NAME =:last_name,EMAIL=:email,DEPT_ID =:dept_id WHERE ID = :id";
      SqlParameterSource paramSource = new BeanPropertySqlParameterSource(employee);
      try {
       namedParameterJdbcTemplate.update(sql, paramSource);
       System.out.println("修改成功");
      } catch (Exception e) {
       System.out.println(e.toString());
       throw new AddFailedException("修改失败");
      }
     }    /* 这样子 会报错
* public void deleteEmployee(int id) {
sql = "DELETE FROM EMPLOYEES WHERE ID = :ID";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ID", id);
try {
namedParameterJdbcTemplate.update(sql, paramMap);
System.out.println("删除成功");
} catch (Exception e) {
throw new AddFailedException("删除失败");
}
}*/
//必须传入Employee 只传入int id 会报错
public void deleteEmployee(Employee employee) {
sql = "DELETE FROM EMPLOYEES WHERE ID = :ID";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ID", employee.getId());
try {
namedParameterJdbcTemplate.update(sql, paramMap);
System.out.println("删除成功");
} catch (Exception e) {
throw new AddFailedException("删除失败");
}
}
}

3.然后写Junit Test 类

 package com.myth.springJDBC;

 import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.myth.springJDBC.dao.EmployeeDao;
import com.myth.springJDBC.po.Employee;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class TestJDBC {
@Autowired
private EmployeeDao employeeDao; @Test
public void testQuery() {
System.out.println(employeeDao.getEmployee(12));
} @Test
public void testInsert() {
Employee employee = new Employee();
employee.setId(12);
employee.setLast_name("FF");
employee.setEmail("FF@email.com");
employee.setDept_id(4); employeeDao.insertEmployee(employee);
} @Test
public void testUpdate() {
Employee employee = new Employee();
employee.setId(12);
employee.setLast_name("FFF");
employee.setEmail("FF@email.com");
employee.setDept_id(4); employeeDao.updateEmployee(employee);
} @Test
public void testDelete() {
Employee employee = new Employee();
employee.setId(12);
employeeDao.deleteEmployee(employee);
} @Test
public void testGetCount() {
System.out.println(employeeDao.getCount());
}
}

Junit

Spring 具名参数NamedParameterJdbcTemplate的更多相关文章

  1. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. (转) Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数(转)

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

  3. Spring(二十一):Spring JdbcTemplate、NamedParameterJdbcTemplate具名参数

    JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdate方法:update方法用于执行新增.修 ...

  4. 【实验二】Spring框架笔记——NamedParameterJdbcTemplate与具名参数

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

  5. spring使用JdbcTemplate和jdbcDaosupport及具名参数使用

    关于jdbctemplate: 个人感觉比Java链接mysql那一套方便好维护多了,只需在配置文件维护即可 需要的包: com.springsource.net.sf.cglib-2.2.0.jar ...

  6. spring的jdbc具名参数

    在jdbc的模板中使用具名参数: 1.就需要在之前的jdbc的例子中进行修改:需要在xml文件中重新配置一个bean.这是固定的格式.如下 对于使用具名参数而言.配置NamedParameterJdb ...

  7. Spring使用JDBC配置具名参数

    好处:若有多个参数,则不用再去对应位置?,直接对应参数名,便于维护 缺点:较为麻烦 使用具名参数时可以使用以下的方法 好处,通过实现类BeanPropertySqlParameterSource之间传 ...

  8. 【Spring JDBC】NamedParameterJdbcTemplate(四)

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

  9. spring mvc参数绑定

    spring绑定参数的过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上.springmvc中,接收页面提交的数据是通过方法形参来接 ...

随机推荐

  1. CRF技能词识别过程

    最近在用CRF做未登录技能词识别,虽然艰难,但是感觉很爽,效率非常高. (1)数据准备: 选取30000行精语料作为训练数据.每一个br作为一条数据.使用已有的技能词典对数据进行无标注分词. (2)训 ...

  2. STL中set的用法

    set,顾名思义,就是数学上的集合——每个元素最多只出现一次,并且set中的元素已经从小到大排好序. 头文件:#include<set> 常用的函数: begin()     返回set容 ...

  3. java通过freemarker导出包含富文本图片的word文档

    废话不多说,进入正题! 本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈) 参考文章:http://www.cnblogs.com/liaofeifig ...

  4. 主从及转发DNS搭建

    author:JevonWei 版权声明:原创作品 主DNS 安装bind软件包 yum -y install bind systemctl start named systemctl enable ...

  5. JAVA基础-集合(一)

    一.结构 Collection接口为一些单列集合的根接口,其常用子接口为List接口.Set接口.List接口常用实现子类为ArrayList(数组)LinkedList(链表).Set接口常用实现子 ...

  6. Springboot与Thymeleaf模板引擎整合基础教程(附源码)

    前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...

  7. 转:【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)

    载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153 在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作 ...

  8. 团队作业3——需求改进&系统设计

    Deadline: 2017-4-21 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目包括后文的四个方面 需求&原型改进 系统设计 Alpha任务分配计划 测试计 ...

  9. 个人附加作业XD --这门课终于结束了~~

    你认为每次项目的评分标准存在哪些问题,你认为的合理评分准则是怎样的(个人/结对/团队算三个) 评分的话我个人觉得是存在一些问题的. 第一,分数差异 问题:一个就是各班的成绩评分有高有低,有的班整体分数 ...

  10. 201521123099《java程序设计》第五周学习总结

    本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现 ...