使用NamedParameterJdbcTemplate指定命名参数

2024-04-30 12:32

本文主要是介绍使用NamedParameterJdbcTemplate指定命名参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在本文中,我们将介绍如何在连接到后端Postgres数据库的Spring启动应用程序中使用NamedParameterJdbcTemplate。我们将使用NamedParameterJdbcTemplate从Postgres DB插入,更新和删除员工。为了保持设计的合理性,我将dao,service和controller分开了。服务只是本文的一个转折点。

概观

NamedParameterJdbcTemplate是一个模板类,它允许一组基本的JDBC操作。它有一个底层的经典JdbcTemplate,允许用'?'运行本机SQL查询 占位符在准备好的报表的执行时间。NamedParameterJdbcTemplate实现NamedParameterJdbcOperations接口,并在JdbcOperations接口中保存JdbcTemplate对象的引用。

先决条件

  1. jdk1.8已安装
  2. Postgres 10.x已安装

让我们现在设置项目:

  • 从https://start.spring.io/下载示例Spring Boot项目
  • 更新pom.xml如下:
<?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/xsd/maven-4.0.0.xsd” >
< modelVersion > 4.0.0 </ modelVersion >
< parent >
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-parent </ artifactId >
< version > 2.1.1.RELEASE </ version >
< relativePath  />  <! - 从存储库查找父级 - >
</ parent >
< groupId > com.sample </ groupId >
< artifactId > postgress </ artifactId >
< version > 0.0.1-SNAPSHOT </ version >
< name > postgress </ name >
< description > Spring Boot的演示项目</ description >
 
< properties >
< java.version > 1.8 </ java.version >
</ properties >
 
< dependencies >
< 依赖>
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter </ artifactId >
</ dependency >
< 依赖>
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-web </ artifactId >
</ dependency >
< 依赖>
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-jdbc </ artifactId >
</ dependency >
< 依赖>
< groupId > org.postgresql </ groupId >
< artifactId > postgresql </ artifactId >
< scope > runtime </ scope >
</ dependency >
< 依赖>
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-starter-test </ artifactId >
< scope > test </ scope >
</ dependency >
</ dependencies >
 
< build >
< plugins >
< 插件>
< groupId > org.springframework.boot </ groupId >
< artifactId > spring-boot-maven-plugin </ artifactId >
</ plugin >
</ plugins >
</ build >
 
</ project >

spring-boot-starter-jdbcartifact会给出所有spring jdbc相关的jar,并且org.postgresql.postgresql会在运行时具有Postgres jdbc驱动程序的依赖关系。

  • 在资源文件夹中创建schema.sql。将在服务器启动时创建一个employee表。如果您不希望在服务器启动期间配置初始数据库,则可以忽略此项。通常,对于构建生产就绪的应用程序,可以忽略此步骤,因为将直接在DB中使用脚本创建表。
CREATE  TABLE员工
employeeName varchar100NOT  NULL
  employeeId varchar11NOT  NULL
employeeAddress varchar100)DEFAULT NULL
employeeEmail varchar100)DEFAULT NULL
 主要关键(employeeId)
);
  • 在资源文件夹中创建data.sql,以便在启动期间加载第一组员工。否则可以跳过:

insert into employee(employeeId, employeeName , employeeAddress,employeeEmail) values('1','Jack','USA','jack@gmail.com');

  • application.properties中的更改,以使用Postgres DB的URL,用户名和密码配置数据源。5432是Postgres的默认端口。Hibernate将自动获取PostgresSQLDialect。
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-AUTO =无
spring.jpa.hibernate.show-SQL =真
spring.datasource.url = JDBC:在PostgreSQL://本地主机:5432 / postgres的
spring.datasource.username = postgres的
spring.datasource.password =管理员
 
 
spring.datasource.initialization模式=总是
spring.datasource.initialize =真
spring.datasource.schema =类路径:/schema.sql
spring.datasource.continue上误差=真

spring.jpa.hibernate.ddl-auto将关闭来自实体对象的表的休眠自动创建。通常,如果定义了实体,Hibernate会运行它。但是我们将使用JdbcTemplate的本机SQL查询,因此,我们可以将其关闭,因为我们不会创建任何实体。

spring.datasource.initialization-mode标记为始终,因为我们希望每次启动时都会初始化数据库。这是可选的,用于此示例目的。

spring.datasource.initialize=true 将标记初始化为真。

spring.datasource.continue-on-error=true 尽管数据初始化有任何错误,仍会继续启动应用程序。

spring.datasource.schema 是需要初始化的架构路径。

spring.datasource.urlPostgres DB的URL。它也可以是远程数据库。

spring.datasource.username 数据库的用户名

spring.datasource.password 数据库的密码

  • 创建一个dao接口和dao实现
 com。样品。事后。道 ;
 
导入 java。util。清单 ;
 
进口 com。样品。事后。实体。员工 ;
 
公共 接口 EmployeeDao {
 
List < Employee >  findAll();
 
void  insertEmployee(Employee  emp);
 
void  updateEmployee(Employee  emp);
 
void  executeUpdateEmployee(Employee  emp);
 
public  void  deleteEmployee(Employee  emp);
}
 com。样品。事后。道 ;
 
导入 java。sql。PreparedStatement ;
导入 java。sql。SQLException ;
导入 java。util。HashMap ;
导入 java。util。清单 ;
导入 java。util。地图 ;
 
进口 组织。弹簧框架。道。DataAccessException ;
进口 组织。弹簧框架。jdbc。核心。PreparedStatementCallback ;
进口 组织。弹簧框架。jdbc。核心。namedparam。MapSqlParameterSource ;
进口 组织。弹簧框架。jdbc。核心。namedparam。NamedParameterJdbcTemplate ;
进口 组织。弹簧框架。jdbc。核心。namedparam。SqlParameterSource ;
进口 组织。弹簧框架。jdbc。支持。GeneratedKeyHolder ;
进口 组织。弹簧框架。jdbc。支持。KeyHolder ;
进口 组织。弹簧框架。刻板印象。存储库 ;
 
进口 com。样品。事后。实体。员工 ;
进口 com。样品。事后。映射器。EmployeeRowMapper ;
@Repository
公共  EmployeeDaoImpl  实现 EmployeeDao {
 
public  EmployeeDaoImpl(NamedParameterJdbcTemplate  template){  
        这个。template  =  template ;  
}  
NamedParameterJdbcTemplate  模板 ;  
 
@覆盖
public  List < Employee >  findAll(){
返回 模板。query(“select * from employee”new  EmployeeRowMapper());
}
@覆盖
public  void  insertEmployee(Employee  emp){
 final  String  sql  =  “insert into employee(employeeId,employeeName,employeeAddress,employeeEmail)values(:employeeId,:employeeName,:employeeEmail,:employeeAddress)” ;
 
        KeyHolder  holder  =  new  GeneratedKeyHolder();
        SqlParameterSource  param  =  new  MapSqlParameterSource()
。的addValue(“雇员”,EMP。getEmployeeId())
。的addValue(“employeeName” ,EMP。getEmployeeName())
。的addValue(“employeeEmail” ,EMP。getEmployeeEmail())
。的addValue(“employeeAddress” ,EMP。getEmployeeAddress());
        模板。update(sql,param,holder);
 
}
 
@覆盖
public  void  updateEmployee(Employee  emp){
 final  String  sql  =  “update employee set employeeName =:employeeName,employeeAddress =:employeeAddress,employeeEmail =:employeeEmail where employeeId =:employeeId” ;
 
        KeyHolder  holder  =  new  GeneratedKeyHolder();
        SqlParameterSource  param  =  new  MapSqlParameterSource()
。的addValue(“雇员”,EMP。getEmployeeId())
。的addValue(“employeeName” ,EMP。getEmployeeName())
。的addValue(“employeeEmail” ,EMP。getEmployeeEmail())
。的addValue(“employeeAddress” ,EMP。getEmployeeAddress());
        模板。update(sql,param,holder);
 
}
 
@覆盖
public  void  executeUpdateEmployee(Employee  emp){
 final  String  sql  =  “update employee set employeeName =:employeeName,employeeAddress =:employeeAddress,employeeEmail =:employeeEmail where employeeId =:employeeId” ;
 
 
 Map < StringObject >  map = new  HashMap < StringObject >();  
 地图。把(“雇员”,EMP。getEmployeeId());
 地图。把(“employeeName” ,EMP。getEmployeeName());
 地图。把(“employeeEmail” ,EMP。getEmployeeEmail());
 地图。把(“employeeAddress” ,EMP。getEmployeeAddress());
 
 模板。execute(sql,map,new  PreparedStatementCallback < Object >(){  
    @覆盖  
    public  Object  doInPreparedStatement(PreparedStatement  ps)  
            抛出 SQLException,DataAccessException {  
        返回 ps。executeUpdate();  
    }  
});  
 
 
}
 
@覆盖
public  void  deleteEmployee(Employee  emp){
 final  String  sql  =  “从员工中删除employeeId =:employeeId” ;
 
 
 Map < StringObject >  map = new  HashMap < StringObject >();  
 地图。把(“雇员”,EMP。getEmployeeId());
 
 模板。execute(sql,map,new  PreparedStatementCallback < Object >(){  
    @覆盖  
    public  Object  doInPreparedStatement(PreparedStatement  ps)  
            抛出 SQLException,DataAccessException {  
        返回 ps。executeUpdate();  
    }  
});  
 
 
}
 
}
  • findAll()检索所有雇员,然后使用下面描述的RowMapper将结果集映射到Employee对象。

  • insertEmployee()将使用template.update(sql,param, holder) param是SqlParameterSource 来插入一个雇员,它将在用冒号标记的查询中动态映射值。插入数据时,GeneratedKeyHolder将返回自动生成的值。

  • executeUpdateEmployee()将使用更新员工 template.execute

 模板。execute(sql,map,new  PreparedStatementCallback < Object >(){  
    @覆盖  
    public  Object  doInPreparedStatement(PreparedStatement  ps)  
            抛出 SQLException,DataAccessException {  
        返回 ps。executeUpdate();  
    }  
});
  • EmployeeRowMapper将使用POJO 从select查询中检索的结果集映射。
 com。样品。事后。映射器 ;
 
导入 java。sql。ResultSet ;
导入 java。sql。SQLException ;
 
进口 组织。弹簧框架。jdbc。核心。RowMapper ;
 
进口 com。样品。事后。实体。员工 ;
 
公共  EmployeeRowMapper  实现 RowMapper < Employee > {
 
@覆盖
public  Employee  mapRow(ResultSet  rs,int  arg1)抛出 SQLException {
Employee  emp  =  new  Employee();
emp。setEmployeeId(RS。的getString(“雇员”));
emp。setEmployeeName(RS。的getString(“employeeName” ));
emp。setEmployeeEmail(RS。的getString(“employeeEmail” ));
 
        返回 emp ;
}
 
 
}
  • 您可以按如下方式创建控制器和服务类:
 com。样品。事后。服务 ;
 
导入 java。util。清单 ;
 
导入 javax。注释。资源 ;
 
进口 组织。弹簧框架。刻板印象。组件 ;
 
进口 com。样品。事后。道。员工道 ;
进口 com。样品。事后。实体。员工 ;
@零件
公共  EmployeeServiceImpl  实现 EmployeeService {
@Resource 
员工道 雇员道 ;
@覆盖
public  List < Employee >  findAll(){
返回 员工道。findAll();
}
@覆盖
public  void  insertEmployee(Employee  emp){
employeeDao。insertEmployee(emp);
 
}
@覆盖
public  void  updateEmployee(Employee  emp){
employeeDao。updateEmployee(emp);
 
}
@覆盖
public  void  executeUpdateEmployee(Employee  emp){
employeeDao。executeUpdateEmployee(emp);
 
}
 
@覆盖
public  void  deleteEmployee(Employee  emp){
employeeDao。deleteEmployee(emp);
 
}
}
 com。样品。事后。控制器 ;
 
导入 java。util。清单 ;
 
导入 javax。注释。资源 ;
 
进口 组织。弹簧框架。网络。绑定。注释。DeleteMapping ;
进口 组织。弹簧框架。网络。绑定。注释。GetMapping ;
进口 组织。弹簧框架。网络。绑定。注释。PostMapping ;
进口 组织。弹簧框架。网络。绑定。注释。PutMapping ;
进口 组织。弹簧框架。网络。绑定。注释。RequestBody ;
进口 组织。弹簧框架。网络。绑定。注释。RequestMapping ;
进口 组织。弹簧框架。网络。绑定。注释。RestController ;
 
进口 com。样品。事后。实体。员工 ;
进口 com。样品。事后。服务。EmployeeService ;
 
@RestController
@RequestMapping“/ postgressApp”
public  class  ApplicationController {
 
@Resource 
EmployeeService  employeeService ;
 
@GetMapping(value  =  “/ employeeList”
public  List < Employee >  getEmployees(){
返回 employeeService。findAll();
 
}
 
@PostMapping(value  =  “/ createEmp”
public  void  createEmployee(@RequestBody  Employee  emp){
 employeeService。insertEmployee(emp);
 
}
@PutMapping(value  =  “/ updateEmp”
public  void  updateEmployee(@RequestBody  Employee  emp){
 employeeService。updateEmployee(emp);
 
}
@PutMapping(value  =  “/ executeUpdateEmp”
public  void  executeUpdateEmployee(@RequestBody  Employee  emp){
 employeeService。executeUpdateEmployee(emp);
 
}
 
@DeleteMapping(value  =  “/ deleteEmpById”
public  void  deleteEmployee(@RequestBody  Employee  emp){
 employeeService。deleteEmployee(emp);
 
}
 
 
}

现在让我们使用POSTMAN验证更改:

测试1:获取员工列表

HTTP://本地主机:8080 / PostgresApp / EmployeeList的

图片标题

测试2:创建员工

HTTP://本地主机:8080 / PostgresApp / createEmp

图片标题

我们看到JONES插入了一个条目。

图片标题

测试3:更新员工

HTTP://本地主机:8080 / PostgresApp / executeUpdateEmp

图片标题

图片标题

测试4:删除员工

HTTP://本地主机:8080 / PostgresApp / deleteEmpById

图片标题

图片标题

这篇关于使用NamedParameterJdbcTemplate指定命名参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948865

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他