首页 > 其他分享 >使用NamedParameterJdbcTemplate指定命名参数

使用NamedParameterJdbcTemplate指定命名参数

时间:2023-06-19 16:36:06浏览次数:39  
标签:NamedParameterJdbcTemplate spring void groupId Employee 参数 emp 命名 public


在本文中,我们将介绍如何在连接到后端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 varchar(100)NOT  NULL,employeeId varchar(11)NOT  NULL,employeeAddress varchar(100)DEFAULT NULL,employeeEmail varchar(100)DEFAULT NULL,主要关键(employeeId));
  • 在资源文件夹中创建data.sql,以便在启动期间加载第一组员工。否则可以跳过:

insert into employee(employeeId, employeeName , employeeAddress,employeeEmail) values('1','Jack','USA','[email protected]');

  • application.properties中的更改,以使用Postgres DB的URL,用户名和密码配置数据源。5432是Postgres的默认端口。Hibernate将自动获取PostgresSQLDialect。
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialectspring.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.sqlspring.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 < String,Object >  map = new  HashMap < String,Object >();地图。把(“雇员”,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 < String,Object >  map = new  HashMap < String,Object >();地图。把(“雇员”,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 { 
 
 
@ResourceEmployeeService  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的

使用NamedParameterJdbcTemplate指定命名参数_sql

测试2:创建员工

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

使用NamedParameterJdbcTemplate指定命名参数_bc_02

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

使用NamedParameterJdbcTemplate指定命名参数_sql_03

测试3:更新员工

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

使用NamedParameterJdbcTemplate指定命名参数_spring_04

使用NamedParameterJdbcTemplate指定命名参数_bc_05

测试4:删除员工

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

使用NamedParameterJdbcTemplate指定命名参数_bc_06

使用NamedParameterJdbcTemplate指定命名参数_sql_07

标签:NamedParameterJdbcTemplate,spring,void,groupId,Employee,参数,emp,命名,public
From: https://blog.51cto.com/u_16145034/6515593

相关文章

  • Python3使用装饰器实现参数类型检查
    fromfunctoolsimportwrapsdefmerge_args(varnames:tuple,args:tuple,kwargs:dict)->dict:"""融合参数-将args参数都转为kwargs参数:paramvarnames:变量名列表:paramargs:args参数:paramkwargs:kwargs参数:return:"&......
  • 命名规范
    1.类名定义DO,VO,BO,DTO,DAO不需要遵循驼峰命名规范,都大写AlarmDetailsDTO✔️AlarmDetailsDtoX2.常量常量应该都是大写,多个单词用_间隔3.包名统一使用小写.分隔,且是自然语义的单词4.布尔类型变量命名不要加is,防止序列化异常Booleansuccess5.变量命名的含义一定......
  • 谈一谈PHP中关于非法参数名传参问题
    在CTF中有些时候GET、POST等方法传参中参数名可能存在一些非法字符导致传参问题。下面讲述的也算是CTF比赛中常见的一种Trick注意:这种Trick只能在PHP版本小于8时有效,当PHP版本大于等于8并不会出现这种转换错误在PHP官方文档中有解释当变量名中出现点和空格时,PHP的处理方式https://w......
  • 如何根据v$parameter查询Oracle隐含参数
    Oracle的隐含参数在Oracle的官方文档中是不会出现的,这些参数主要是Oracle内部用于控制某些功能的开关,或者就像今天eygle讲的,Oracle牛逼之处就是可能几年前开发的一个功能就放到当时的版本中,让你“试用”,但你却不知道,如果碰巧因为遇见了这个问题的bug,Oracle会告诉你可以使用这个参数......
  • Pycharm中print函数有end= 参数,控制台不打印输出
    Pycharm中print函数有end=参数,控制台不打印输出foriinrange(1,256):#寻找对称平方数square=str(i*i)#转为字符串ifsquare==square[::-1]:print(i,end='\t')循环中print函数有end=参数,无论end='\t'还是end=''end='9'e......
  • 4. SpringMVC获取请求参数
    1.通过ServletAPI获取‍将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象‍​​‍2.通过控制器方法的形参获取请求参数‍在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到......
  • shell pattern(参数展开)
    shellpattern(参数展开) ${parameter:-word}若parameter没有设置或为空,展开结果是word的值。若parameter不为空,则展开结果是parameter的值${parameter:=word}若parameter没有设置或为空,展开结果是word的值。另外,word的值会赋值给parameter。若parameter......
  • 介绍一个MySQL参数检索工具
    碰巧看到徐老师的这篇文章《MySQL的参数工具》,其中介绍了一个讲解MySQL不同版本参数的小工具,网站的作者是MySQL日本用户组的负责人Tomita。该网站能够提供不同版本MySQL的参数,包括不同版本之间的对比。当用户需要对MySQL进行升级、需要确认不同版本间的具体参数差异时,就可以用到这......
  • 对select()参数fdset的完整理解
    虽然写了很多代码,但select我就从没有完整理解过,要用时不过copypaste而已。惭愧!今天决定要对select()参数fdset有一个完整理解。Go!先上一段代码(代码1-1),这段代码做的事情是1.创建一个socket来listen请求2.调用select等待新请求、等待已有请求的数据收发状态READY3.当有新连接请求......
  • 自定义异常和统一校验参数
    自定义异常@GetterpublicclassBusinessExceptionextendsRuntimeException{/***http状态码*/privateintcode;privateObjectobject;publicBusinessException(Stringmessage,intcode,Objectobject){super(message);......