具名参数:

具名参数: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. PKIX path building failed

    百度这个问题,很多人都说是证书问题.至于是什么证书呢?搞了老半天原来是 /Java/jre/lib/security/cacerts不正确.换了个jdk版本就解决这个问题了. 可靠的jdk1.8下载链 ...

  2. (转载)Java多线程入门理解

    转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...

  3. (转载)深入Java关键字this的用法的总结

    在Java程序设计中经常会见到this的使用,this使得程序设计变得规范.简单.灵活.但是在使用过程中,在不同场 合它的含义并不完全相同,使用不当还会出现错误, 本文对this的几种用法和出现的问题 ...

  4. wifi pineapple 外接USB无线网卡桥接外网

    0:选择USB网卡 在没有有线网络的情况下,可以外挂一个usb无线网卡来桥接上网,目前支持3070L.8187L芯片的网卡,反正linux系统都用这些芯片, 免的安装驱动, 我选择的是 WN-722N ...

  5. 极化码的matlab仿真(4)——SC译码(2)

    ================================================ 首先自作多情的说一句--"抱歉!" 古语"有志者.事竟成",是 ...

  6. 学习之-ASP.NET MVC Filter

    MVC Filter 是典型的AOP应用,对MVC框架处理客户端请求注入额外的一些逻辑,如日志记录.缓存处理.异常处理和权限验证,性能检测(横切关注点),而这些逻辑通常与主要业务无关,被独立分开作为公 ...

  7. poj3723 MST好题 kruskal

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...

  8. datable 翻页事件处理

    JQuery datatable插件,点下一页在点击事件无效问题 (2013-10-16 16:01:54) 转载▼   分类: C# 在MVC的项目中,我利用jquery datatable 来实现 ...

  9. Brotli、Deflate、Zopfli、LZMA、LZHAM、Bzip2六种无损数据压缩性能比较

    这里比较了六种数据压缩算法,结果表明Brotli算法会代替普遍使用的Deflate算法.分别用Canterbury compression corpus,web contentcorpus,和 enw ...

  10. 201521123077 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 多线程 Runnable类 表示任务的类,可以当作参数传入Thread的构造器来运行该任务 Thread类 ...