Spring 具名参数NamedParameterJdbcTemplate

具名参数:

具名参数: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 类

 1 package com.myth.springJDBC;
 2
 3
 4 import org.junit.Test;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.test.context.ContextConfiguration;
 8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 9
10 import com.myth.springJDBC.dao.EmployeeDao;
11 import com.myth.springJDBC.po.Employee;
12 @RunWith(SpringJUnit4ClassRunner.class)
13 @ContextConfiguration(locations="classpath:applicationContext.xml")
14 public class TestJDBC {
15     @Autowired
16     private EmployeeDao employeeDao;
17
18     @Test
19     public void testQuery() {
20         System.out.println(employeeDao.getEmployee(12));
21     }
22
23     @Test
24     public void testInsert() {
25         Employee employee = new Employee();
26         employee.setId(12);
27         employee.setLast_name("FF");
28         employee.setEmail("[email protected]");
29         employee.setDept_id(4);
30
31         employeeDao.insertEmployee(employee);
32     }
33
34     @Test
35     public void testUpdate() {
36         Employee employee = new Employee();
37         employee.setId(12);
38         employee.setLast_name("FFF");
39         employee.setEmail("[email protected]");
40         employee.setDept_id(4);
41
42         employeeDao.updateEmployee(employee);
43     }
44
45     @Test
46     public void testDelete() {
47         Employee employee = new Employee();
48         employee.setId(12);
49         employeeDao.deleteEmployee(employee);
50     }
51
52     @Test
53     public void testGetCount() {
54         System.out.println(employeeDao.getCount());
55     }
56 }

Junit

时间: 2024-11-06 07:11:23

Spring 具名参数NamedParameterJdbcTemplate的相关文章

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

在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter). 那么什么是具名参数? 具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代 具名参数只在 NamedParameterJdbcTempl

Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)

使用spring的jdbcTemplate-----使用具名参数 在JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制,定位参数的问题在于,一旦参数的位置发生变化,必须改变参数的绑定,在Spring JDBC中,绑定SQL参数的另一种选择是使用具名参数,SQL具名参数是按照名称绑定,而不是位置绑定. 什么是具名参数? 具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代 具名参数只在 NamedP

spring的jdbc具名参数

在jdbc的模板中使用具名参数: 1.就需要在之前的jdbc的例子中进行修改:需要在xml文件中重新配置一个bean.这是固定的格式.如下 对于使用具名参数而言.配置NamedParameterJdbcTemplate,该对象可以说使用具名参数.其没有无参数的构造器.所以必须为其构造器指定参数. 2.之后在test的稳健者哄.得到bean的对象.之后进行测试.具体的代码示例如下: 主要的区别是在sql语句的后边value中不在是问号.而是一下名字.之后通过map进行相应的赋值.最后通过具名函数的

Spring使用JDBC配置具名参数

好处:若有多个参数,则不用再去对应位置?,直接对应参数名,便于维护 缺点:较为麻烦 使用具名参数时可以使用以下的方法 好处,通过实现类BeanPropertySqlParameterSource之间传人对象 sql语句中的参数名和类的属性一致 原文地址:https://www.cnblogs.com/tanlei-sxs/p/10182489.html

C#中的 具名参数 和 可选参数

具名参数 和 可选参数 是 C# framework 4.0 出来的新特性. 一. 常规方法定义及调用 public void Demo1(string x, int y) { //do something... } public void Main() { //调用 Demo1("similar", 22); } 调用时,参数顺序(类型)必须与声明一致,且不可省略. 二. 可选参数的声明及调用 可选参数分为两种情况: 1. 部分参数可选:   2. 全部参数都是可选 //部分可选(x

C#可选参数与具名参数

可选参数 static void test1() { func1("A"); func1("B", 30); Console.ReadKey(); } static void func1(string name, int age = 20) { Console.WriteLine("Name: " + name + "\t Age: " + age); } 具名参数 static void test2() { func2(&q

spring boot 参数传递(spring boot 参数传数 arg0 每一个参数 arg0#{arg0},arg1 #{arg1})

spring boot 参数传数 arg0 每一个参数 arg0#{arg0},arg1  #{arg1} @Select("select * from sys_user where name=#{arg0} and pass=#{arg1}") public List<Map<String,Object>> getAllUser(String username,String password); 大于三个参数据,用传递对象 /** * Spring 启动 *

C#中可选参数和具名参数的使用

具名参数 和 可选参数 是 C# 4.0 提出来的新特性 一,可选参数分为:部分可选.全部可选 1,声明 public class Dogs { public string Name { get; set; } public string Age { get; set; } //1,name为必选参数,age为可选参数,如果有必选参数,那么可选参数必须定义在必选参数后 //可选参数之后必然为可选参数 //如果都是可选参数,那么可以放第一位 public void Says(string name

spring mvc 参数绑定

1.默认支持类型 a.HttpServletRequest b.HttpServletResponse c.HttpSession e.Model/ModelMap model是接口,modelmap是接口实现.将model数据填充到request域 2.简单类型 a.直接在controller上加上形参 这种方式,链接中可以不传入定义的参数或为空,不会报错.如果要正常使用,则请求过来的参数,必须与形参名一致. b.使用@RequestParam 3.pojo类型 对应表单提交 请求过来的的参数