在本文,我们将学习使用Spring NamedParameterJdbcTemplate类。
1. Spring NamedParameterJdbcTemplate
是具有一组基本JDBC操作的模板类,允许使用命名参数而不是传统的“?”占位符。
2. NamedParameterJdbcTemplate
将命名参数替换为 JDBC 样式后,委托给包装的JdbcTemplate
。
3. NamedParameterJdbcTemplate
还可以将 List
值扩展到适当数量的占位符。
4. NamedParameterJdbcTemplate
可以使用以下构造函数进行实例化。
NamedParameterJdbcTemplate(DataSource dataSource)
NamedParameterJdbcTemplate(JdbcOperations classicJdbcTemplate)
方法
在这里,我们将讨论NamedParameterJdbcTemplate类
的几种方法
1. update:通过准备好的语句发出更新,绑定给定的参数。
int update(String sql, Map<String,?> paramMap)
int update(String sql, SqlParameterSource paramSource)
int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder)
int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder, @Nullable String[] keyColumnNames)
sql :包含命名参数的 SQL。
paramSource :要绑定到查询的参数和 SQL 类型的容器
generatedKeyHolder :KeyHolder
将保存生成的密钥。
keyColumnNames :将为其生成密钥的列的名称。
2. queryForObject :查询给定的 SQL 以从 SQL 创建预准备语句,并列出要绑定到查询的参数。
<T> T queryForObject(String sql, Map<String,?> paramMap, Class<T> requiredType)
<T> T queryForObject(String sql, Map<String,?> paramMap, RowMapper<T> rowMapper)
<T> T queryForObject(String sql, SqlParameterSource paramSource, Class<T> requiredType)
<T> T queryForObject(String sql, SqlParameterSource paramSource, RowMapper<T> rowMapper)
SQL :要执行的 SQL 查询。
paramMap :要绑定到查询的参数映射。
requiredType :结果对象应匹配的类型。
rowMapper :每行将映射一个对象的对象。
paramSource :要绑定到查询的参数的容器。
3. queryForList :查询给定的 SQL 以从 SQL 创建预准备语句,并列出要绑定到查询的参数。
List<Map<String,Object>> queryForList(String sql, Map<String,?> paramMap)
<T> List<T> queryForList(String sql, Map<String,?> paramMap, Class<T> elementType)
List<Map<String,Object>> queryForList(String sql, SqlParameterSource paramSource)
<T> List<T> queryForList(String sql, SqlParameterSource paramSource, Class<T> elementType)
例
找到“生成”依赖项。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.concretepage</groupId>
<artifactId>soap-ws</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-demo</name>
<description>Spring Demo Application</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.1</version>
<relativePath />
</parent>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
</project>
现在找到完整的代码。在这里,我们使用NamedParameterJdbcTemplate
类执行 CRUD 操作.
PersonDAO.java
package com.concretepage;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Repository;
@Repository
public class PersonDAO {
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public void addPerson(Person p) {
GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
String sql = "insert into person (name, age) values (:name, :age)";
SqlParameterSource paramSource = new MapSqlParameterSource().addValue("name", p.getName()).addValue("age",
p.getAge());
namedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder);
int id = generatedKeyHolder.getKey().intValue();
System.out.println(id);
p.setId(id);
}
public int getPersonCount() {
String sql = "select count(*) from person";
SqlParameterSource namedParameters = new MapSqlParameterSource();
return namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}
public void updatePerson(Person p) {
String sql = "update person set name = :name, age = :age where id = :id";
SqlParameterSource paramSource = new MapSqlParameterSource().addValue("name", p.getName())
.addValue("age", p.getAge()).addValue("id", p.getId());
namedParameterJdbcTemplate.update(sql, paramSource);
}
public List<Map<String, Object>> getAllPersonsByAge(int age) {
String sql = "select * from person where age=:age";
SqlParameterSource namedParameters = new MapSqlParameterSource("age", age);
List<Map<String, Object>> list = namedParameterJdbcTemplate.queryForList(sql, namedParameters);
return list;
}
public void deletePersonById(int id) {
String sql = "delete from person where id = :id";
SqlParameterSource paramSource = new MapSqlParameterSource("id", id);
namedParameterJdbcTemplate.update(sql, paramSource);
}
}
Person.java
package com.concretepage;
public class Person {
private int id;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
app-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="personDAO" class="com.concretepage.PersonDAO">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/concretepage?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
</beans>
找到“MySQL ”表。
表:person
CREATE TABLE `person` (
`id` BIGINT(5) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
`age` INT(3) NOT NULL,
PRIMARY KEY (`id`)
)
SpringApp.java
package com.concretepage;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml");
PersonDAO personDAO = (PersonDAO) context.getBean("personDAO");
Person p = new Person("Mohan", 25);
personDAO.addPerson(p);
System.out.println(personDAO.getPersonCount());
p = new Person("Rakesh", 30);
p.setId(1);
personDAO.updatePerson(p);
personDAO.deletePersonById(2);
personDAO.getAllPersonsByAge(25)
.forEach(e -> {
System.out.println(e);
});
}
}
输出
参考
下载源代码