public
class
JDBCTemplateTest {
//初始化JDBCTemplate
private static JdbcTemplate jdbcTemplate;
@BeforeClass
public static void setUpClass() {
//利用内存来作为数据的存储源
String url = "jdbc:hsqldb:mem:test";
String username = "sa";
String password = "";
//获取数据源
DriverManagerDataSource dataSource = new DriverManagerDataSource(url, username, password);
//设置驱动
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Before
public void setUp(){
//建表
String createTableSql = "create memory table test" + "(id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, " + "name varchar(100))";
//execute一般用来执行DDL
jdbcTemplate.execute(createTableSql);
System.out.println("表创建成功");
//建函数
String createHsqldbFunctionSql = "CREATE FUNCTION FUNCTION_TEST(str CHAR(100)) " "returns INT begin atomic return length(str);end";
jdbcTemplate.update(createHsqldbFunctionSql);
System.out.println("函数创建成功");
//创建存储过程
String createHsqldbProcedureSql =
"CREATE PROCEDURE PROCEDURE_TEST" + "(INOUT
inOutName VARCHAR(100), OUT outId INT) "
+
"MODIFIES
SQL DATA "
+
"BEGIN
ATOMIC "
+
"
insert into test(name) values (inOutName); "
+
"
SET outId = IDENTITY(); "
+
"
SET inOutName = 'Hello,' + inOutName; "
+
"END";
jdbcTemplate.update(createHsqldbProcedureSql);
System.out.println("存储过程创建成功!");
}
@Test
public
void
test(){
insert();
update();
delete();
select();
testPpreparedStatement();
testPreparedStatement2();
testResultSet();
testResultSet2();
testResultSet3();
testCallableStatementCreator1();
testCallableStatementCreator3();
}
/**
*
插入数据
*/
private
void
insert(){
String
sql = "select
count(*) from test";
jdbcTemplate.update("insert
into test(name) values('name1')");
jdbcTemplate.update("insert
into test(name) values('name2')");
assertEquals(2,
jdbcTemplate.queryForInt(sql));
System.out.println("插入记录数为:"+jdbcTemplate.queryForInt(sql));
}
/**
*
更新数据
*/
private
void
update(){
String
sql = "select
count(*) from test where name='name3'";
jdbcTemplate.update("update
test set name='name3' where name=?",new
Object[]{"name2"});
assertEquals(1,
jdbcTemplate.queryForInt(sql));
System.out.println("更新的记录数为:"+jdbcTemplate.queryForInt(sql));
}
/**
*
删除数据
*/
private
void
delete(){
String
sql = "select
count(*) from test";
jdbcTemplate.update("delete
from test where name =?",new
Object[]{"name1"});
assertEquals(1,
jdbcTemplate.queryForInt(sql));
System.out.println("删除的记录数为:"+jdbcTemplate.queryForInt(sql));
}
/**
*
查询数据(利用回调函数)
*/
private
void
select(){
String
sql = "select
count(*) from test";
jdbcTemplate.query("select
* from test",
new
RowCallbackHandler(){
@Override
public
void
processRow(ResultSet rs) throws
SQLException {
int
id = rs.getInt("id");
String
name = rs.getString("name");
System.out.println("id="+id+","+"name="+name);
}});
System.out.println("查询的数据:"+jdbcTemplate.queryForInt(sql));
}
/**
*
预编译语句及存储过程创建回调
*/
private
void
testPpreparedStatement(){
int
count = jdbcTemplate.execute(new
PreparedStatementCreator() {
@Override
public
PreparedStatement createPreparedStatement(Connection conn)
throws
SQLException {
return
conn.prepareStatement("select
count(*) from test");
}
},
new
PreparedStatementCallback<Integer>(){
@Override
public
Integer doInPreparedStatement(PreparedStatement pstmt)
throws
SQLException, DataAccessException {
pstmt.execute();
ResultSet
rs = pstmt.executeQuery();
rs.next();
return
rs.getInt(1);
}
});
assertEquals(1,
count);
System.out.println("预编译语句count=:"+count);
}
/**
*
预编译语句设值回调使用(带参数)
*/
private
void
testPreparedStatement2(){
String
sql = "insert
into test(name) values(?)";
int
count = jdbcTemplate.update(sql,new
PreparedStatementSetter(){
@Override
public
void
setValues(PreparedStatement ps) throws
SQLException {
ps.setObject(1,
"name4");
}
});
assertEquals(1,
count);
System.out.println("当前的数据条目:"+count);
//优先使用update(sql,args)
String
sqldelete = "delete
from test where name =?";
count
= jdbcTemplate.update(sqldelete, new
Object[]{"name4"});
assertEquals(1,
count);
System.out.println("删除后的数据条目:"+count);
}
/**
*
结果集处理回调(RowMapper<Map>接口,以Map的方式返回结果集)
*/
private
void
testResultSet(){
jdbcTemplate.update("insert
into test(name) values('name5')");
String
listSql = "select
* from test";
List
list = jdbcTemplate.query(listSql, new
RowMapper<Map>() {
@Override
public
Map mapRow(ResultSet rs, int
rowNum) throws
SQLException {
Map
row = new
HashMap();
row.put(rs.getInt("id"),
rs.getString("name"));
return
row;
}});
jdbcTemplate.update("delete
from test where name='name5'");
assertEquals(2,
list.size());
System.out.println("当前的list结果为"+list.get(0)+","+list.get(1));
}
/**
*
结果集处理回调(RowCallbackHandler接口,将结果集转换为需要的形式)
*/
private
void
testResultSet2(){
jdbcTemplate.update("insert
into test(name) values(?)",new
Object[]{"name5"});
String
sql = "select
* from test";
final
List list = new
ArrayList();
jdbcTemplate.query(sql,new
RowCallbackHandler(){
@Override
public
void
processRow(ResultSet rs) throws
SQLException {
Map
map = new
HashMap();
map.put(rs.getInt("id"),
rs.getString("name"));
list.add(map);
}
});
assertEquals(2,
list.size());
System.out.println("当前的数组结果为"+list.get(0)+","+list.get(1));
jdbcTemplate.update("delete
from test where name=?",
new
Object[]{"name5"});
}
/**
*
结果集处理回调(ResultSetExtractor接口,提供给用户整个结果集,让用户决定如何处理该结果集)
*/
private
void
testResultSet3(){
jdbcTemplate.update("insert
into test(name) values(?)",new
Object[]{"name5"});
String
sql = "select
* from test";
List
result = jdbcTemplate.query(sql,new
ResultSetExtractor<List>(){
@Override
public
List extractData(ResultSet rs) throws
SQLException,
DataAccessException
{
List
list = new
ArrayList();
while(rs.next()){
Map
map = new
HashMap();
map.put(rs.getInt("id"),rs.getString("name"));
list.add(map);
}
return
list;
}
});
assertEquals(2,
result.size());
System.out.println("当前的数组1结果为"+result.get(0)+","+result.get(1));
jdbcTemplate.update("delete
from test where name=?",new
Object[]{"name5"});
}
/**
*
调用函数(利用回调函数)
*/
public
void
testCallableStatementCreator1() {
final
String callFunctionSql = "{call
FUNCTION_TEST(?)}";
List<SqlParameter>
params = new
ArrayList<SqlParameter>();
//设置函数参数
params.add(new
SqlParameter(Types.VARCHAR));
//设置函数返回结果集
params.add(new
SqlReturnResultSet("result",
new
ResultSetExtractor<Integer>(){
@Override
public
Integer extractData(ResultSet rs) throws
SQLException,
DataAccessException
{
while(rs.next()){
return
rs.getInt(1);
}
return
0;
}}));
//获取结果
Map<String,
Object> outValues = jdbcTemplate.call(new
CallableStatementCreator() {
@Override
public
CallableStatement createCallableStatement(Connection conn)
throws
SQLException {
CallableStatement
cstm = conn.prepareCall(callFunctionSql);
cstm.setString(1,
"test");
return
cstm;
}
},
params);
System.out.println("函数调用成功!");
System.out.println(outValues.get("result"));
Assert.assertEquals(4,
outValues.get("result"));
}
/**
*
MYSQL的函数调用(和之前的类似)
*/
public
void
testCallableStatementCreator2() {
JdbcTemplate
mysqlJdbcTemplate = new
JdbcTemplate(getMysqlDataSource());
//2.创建自定义函数
String
createFunctionSql = "CREATE
FUNCTION FUNCTION_TEST(str VARCHAR(100)) "
+
"returns
INT return LENGTH(str)";
String
dropFunctionSql = "DROP
FUNCTION IF EXISTS FUNCTION_TEST";
mysqlJdbcTemplate.update(dropFunctionSql);
mysqlJdbcTemplate.update(createFunctionSql);
//3.准备sql,mysql支持{?=
call …}
final
String callFunctionSql = "{?=
call FUNCTION_TEST(?)}";
//4.定义参数
List<SqlParameter>
params = new
ArrayList<SqlParameter>();
params.add(new
SqlOutParameter("result",
Types.INTEGER));
params.add(new
SqlParameter("str",
Types.VARCHAR));
Map<String,
Object> outValues = mysqlJdbcTemplate.call(
new
CallableStatementCreator() {
@Override
public
CallableStatement createCallableStatement(Connection conn) throws
SQLException {
CallableStatement
cstmt = conn.prepareCall(callFunctionSql);
cstmt.registerOutParameter(1,
Types.INTEGER);
cstmt.setString(2,
"test");
return
cstmt;
}},
params);
Assert.assertEquals(4,
outValues.get("result"));
}
public
DataSource getMysqlDataSource() {
String
url = "jdbc:mysql://localhost:3306/test";
DriverManagerDataSource
dataSource =
new
DriverManagerDataSource(url, "root",
"");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return
dataSource;
}
/**
*
调用存储过程(利用回调函数)
*/
public
void
testCallableStatementCreator3() {
final
String callProcedureSql = "{call
PROCEDURE_TEST(?, ?)}";
List<SqlParameter>
params = new
ArrayList<SqlParameter>();
//定义数组输出参数
params.add(new
SqlInOutParameter("inOutName",
Types.VARCHAR));
//定义存储过程参数
params.add(new
SqlOutParameter("outId",
Types.INTEGER));
Map<String,
Object> outValues = jdbcTemplate.call(
new
CallableStatementCreator() {
@Override
public
CallableStatement createCallableStatement(Connection conn) throws
SQLException {
CallableStatement
cstmt = conn.prepareCall(callProcedureSql);
cstmt.registerOutParameter(1,
Types.VARCHAR);
cstmt.registerOutParameter(2,
Types.INTEGER);
cstmt.setString(1,
"test");
return
cstmt;
}},
params);
Assert.assertEquals("Hello,test",
outValues.get("inOutName"));
Assert.assertEquals(6,
outValues.get("outId"));
}
/*
public
void test() {
//1.声明SQL
String
sql = "select * from INFORMATION_SCHEMA.SYSTEM_TABLES";
//2.执行查询
jdbcTemplate.query(sql,
new RowCallbackHandler(){
@Override
public
void processRow(ResultSet rs) throws SQLException {
//2.处理结果集
String
value = rs.getString("TABLE_NAME");
System.out.println("Column
TABLENAME:" + value);
}});
}
*/
@After
public
void
setDown(){
jdbcTemplate.execute("drop
function FUNCTION_TEST");
System.out.println("函数删除成功!");
jdbcTemplate.execute("DROP
PROCEDURE PROCEDURE_TEST");
System.out.println("存储过程删除成功!");
String
dropTableSQL = "drop
table test";
jdbcTemplate.execute(dropTableSQL);
System.out.println("表删除成功!");
}
}相关推荐
数字IC时序约束实战:深入解析clock_uncertainty的设置策略与后端影响
本文深入探讨数字IC设计中clock_uncertainty的设置策略及其对后端实现的影响。通过分析时钟不确定度的组成(包括clock_skew、clock_jitter和margin),并结合实际项目经验,详细介绍了在不同设计阶段(综合、布局布线、签核)的动态调整方法。文章还提供了工程化处理参数来源、跨时钟域特殊处理以及优化时序收敛的实用技巧,帮助工程师提升数字IC设计的可靠性和性能。
JdbcTemplate系列(一)----使用详解
一、简介 1.什么是JDBC模板(jdbcTemplate) JDBC--->Java Data Base Connectivity,java数据库连接,简单点说就是可以为多种关系数据库提供统一访问,由一组用java语言编写的类和接口组成。 模板就是事先准备好的东西,你只需要去套用就可以,JDBCTemplate就是这样的模板,通过设置JDBCTemplate可以减少对数据库
医疗AI Agent实战:从零搭建一个能看病的智能助手(附完整代码)
本文详细介绍了如何从零搭建一个医疗AI Agent智能助手,涵盖核心架构设计、症状推理引擎开发、安全与合规实现以及系统集成等关键环节。通过完整的代码示例和实战案例,帮助开发者快速构建具备医疗咨询能力的智能Agent,提升医疗服务的效率和质量。
trigger调用(java)存储过程——HSQL_DB存储过程学习笔记(1)
1 trigger调用存储过程 createprocedure insert_student(name VARCHAR(50)) MODIFIESSQL DATA beginATOMIC DECLAREid INTEGER; --DECLAREname VARCHAR(50); setid=Select
科研指南:IEEE期刊LaTeX/Word模板下载与使用全解析
本文详细解析了IEEE期刊LaTeX/Word模板的下载与使用技巧,帮助科研人员高效完成论文排版。从官方模板获取入口到LaTeX文档结构配置,再到Word样式管理与常见问题解决方案,全面覆盖投稿准备的关键步骤。特别针对数学公式、参考文献和图片处理等难点提供实用建议,助力学术写作规范化。
手把手式介绍 ADNI 影像数据下载
1.搜索 1.1登录 打开ADNI的官网:http://adni.loni.usc.edu/,进入下面的界面。 点击 DATA&SMPLES 下的 ACCESS DATA AND SAMPLES,如下图。 页面跳转以后点击中间的“LOGIN”,这时会跳出一个新的界面,然后在右上角输入自己的帐号、密码即可。如果没有权限可以跳转到第2部分看看如何申请权限。 登录以后选择DOWNLOAD下的 Image Collections就是搜索下载影像数据,其他还有一些学习测试数据和遗传数据。 1.2 sea
Spring JdbcTemplate方法详解
JdbcTemplate主要提供以下五类方法:execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;query方法及queryForXXX方法:用于执行查询相关语句;call方法:用于执行存储过程、函数相关语句。 JdbcTemplate
嵌入式AI实战:基于RK3588部署YOLOv11并集成OpenCV实现实时推理(全流程详解)
本文详细介绍了在RK3588芯片上部署YOLOv11目标检测模型的全流程,包括环境搭建、模型转换和实时推理实现。主要内容为:1)通过YOLOv11官方工具将PyTorch模型转为ONNX格式;2)使用RKNN Toolkit2将ONNX模型转换为适配RK3588的RKNN格式;3)在RK3588上结合OpenCV实现实时视频推理功能。教程提供了完整的代码示例和详细步骤说明,帮助开发者快速在边缘设备上部署目标检测模型,实现AI视觉应用的落地。
跟我StepByStep学FLEX教程------访问数据库之hsqldb
跟我StepByStep学FLEX教程------访问数据库之hsqldb 说明:该文系作者原创,请勿商用或者用于论文发表,转载必须经作者同意并且注明出处。 这一讲本来要简单提及一下的,看上一讲的评论还是决定再详细一点,这样大家能够比较成功的做成Demo。 为了Demo比较容易,选择内存数据库hsqldb(读者也可以用mysql),这种小型数据...
YOLOv12改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度(二次改进A2C2f)
本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
Spring 数据访问策略
Spring封装的数据访问异常 与SQLException是一个Checked Exception不同,Spring定义的基本书籍访问异常DataAccessException是一个RuntimeException,DataAccessException继承自NestedRuntimeException,完整的保留了原始异常信息。 异常 定义 DataAcces
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
sqlh和mysql的区别_HSQL和MySQL的区别
我使用MySQL作为我的应用程序数据库,但HSQL作为测试内存数据库。现在的问题是,我有一个SQL selectQuery象下面这样:HSQL和MySQL的区别SELECT date(a.created_at) as record_dateFROM table a现在,日期()是日期时间转换为日期在MySQL中的功能,但在HSQL同样的功能是TO_DATE()。现在,我有一个方法将上面的查询输出到...
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
[原创]Spring JdbcTemplate 使用总结与经验分享
引言 近期开发的几个项目,均是基于Spring boot框架的web后端项目,使用JdbcTemplate执行数据库操作,实际开发过程中,掌握了一些有效的开发经验,踩过一些坑,在此做个记录及总结,与各位读者分享。 欢迎留言与我交流。 正确使用JdbcTemplate执行数据库操作 1、Bean声明 新增类型DatabaseConfiguration,添加注解@Configuration ...
Spring–查看HSQLDB嵌入式数据库的内容
一个Spring @Configuration示例,用于启动HSQLDB嵌入式数据库或内存数据库。 DataSourceConfig.java package com.mkyong.config.db; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org...
Spring-JdbcTemplate详解,这都看不懂就安心去当个咸鱼吧!
Nullable方法。
Spring JdbcTemplate详解
Spring JdbcTemplate使用实例 JDBC 基础 Java程序使用JDBC接口访问关系数据库的时候,需要以下几步: 创建全局DataSource实例,表示数据库连接池; 在需要读写数据库的方法内部,按如下步骤访问数据库: 从全局DataSource实例获取Connection实例; 通过Connection实例创建PreparedStatement实例; 执行SQL语句,如果是查询,则通过ResultSet读取结果集,如果是修改,则获得int结果。 正确编写JDBC代码的关键是使用try
How to use hsqldb to test DB operation
sometime we want to test dao operation in junit test, below we will use hsqldb to test it. 1. setup hsqldb configuation. we have a persistent-config.xml like this: <?xml version="1.0" encoding=...
jdbctemplate 执行多条sql_SpringBoot中文参考指南(2.1.6)31、使用 SQL 数据库
上一篇[30、安全]下一篇[31.3、JPA 和 Spring Data JPA]英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-sql.htmlGitHub:https://github.com/jijicai/Spring/tree/master/spring-boo...
SpringBoot 官方文档示例:(67)使用hsqldb
boot
Spring开发系列教程(13)——JDBC
我们在前面介绍DataSourceDataSourceConnectionConnectionResultSetint正确编写JDBC代码的关键是使用释放资源,涉及到事务的代码需要正确提交或回滚事务。在Spring使用JDBC,首先我们通过IoC容器创建并管理一个DataSource实例,然后,Spring提供了一个,可以方便地让我们操作JDBC,因此,通常情况下,我们会实例化一个。顾名思义,这个类主要使用了。编写示例代码或者测试代码时,我们强烈推荐使用。
企业分布式微服务云SpringCloud SpringBoot mybatis (七)Spring Boot中使用JdbcTemplate访问数据库
本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例。数据源配置在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式。首先,为了连接数据库需要引入jdbc支持,在pom.xml中引入如下配置:<dependency> <groupId>org.springframework.boot<...
227



被折叠的 条评论
为什么被折叠?



