具名参数:

具名参数: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. JSP知识点大致介绍1

    解释:当jsp写好,运行服务器,还没有发出请求(写网址按Enter),Tomcat的work下是没有字节码文件的.当写网址:localhost:8888/xxxx/index.jsp按Enter,运行 ...

  2. JavaScript入门(四)

    一.数组 1.数组的基本概念 数组是在内存空间中连续存储的一组有序数据的集合.元素在数组中的顺序,称为下标.可以使用下标访问数组的每个元素. 2.如何声明一个数组 ①使用字面量声明:var arr = ...

  3. python基础教程(三)

    序列概览 Python 包含6 种内建的序列,这里重点讨论最常用的两种类型:列表和元组. 列表与元组的主要区别在于,列表可以修改,元组则不能.也就是说如果要根据要求来添加元素,那么列表可以会更好用:而 ...

  4. CentOS7.3虚拟机扩展数据磁盘

    操作之前需要重点查看: 由于扩容磁盘的操作非同小可,一旦哪一步出现问题,就会导致分区损坏,数据丢失等一系列严重的问题,因此建议:在进行虚拟机分区扩容之前,一定要备份重要数据文件,并且先在测试机上验证以 ...

  5. FileProvider解决FileUriExposedException

    FileUriExposedException 在给app做版本升级的时候,先从服务器下载新版本的apk文件到sdcard路径,然后调用安装apk的代码,一般写法如下: private void op ...

  6. SVN 通过IIS设置反向代理访问

    原因 一个字,穷,没办法,只有一台机器 要当测试服务器还要做源码管理. 解决办法 通过IIS配置反向代理访问SVN,给SVN访问的HTTPS绑定上域名,就可以正常访问了. 1.修改SVN配置 把SVN ...

  7. Keil报错failed to execute 'd:\Keil\C51\BIN\C51.EXE'

    关于老师发的keil软件报错如下: --- Error: failed to execute 'd:\Keil\C51\BIN\C51.EXE' 错误是因为老师直接拷贝的安装目录,里面的文件路径设置仍 ...

  8. C++中static关键字作用总结

    1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件 ...

  9. 向eclipse的JavaWeb项目中导入jar包--备忘录

    一:      在你所需的jar包网站下载对应的jar包.如org.apache.commons.lang.jar. 二:复制粘贴到该JavaWeb的WEB-INF目录下的lib目录下,如: 三:右键 ...

  10. [js高手之路]Vue2.0基于vue-cli+webpack父子组件通信教程

    在git命令行下,执行以下命令完成环境的搭建: 1,npm install --global vue-cli  安装vue命令行工具 2,vue init webpack vue-demo   使用v ...