JDBC使用总结:增删改查、调用存储过程、执行存储函数、存储过程与存储函数区别分析
JDBC(Java Database Connectivity):Java访问数据库的解决方案。
JDBC只定义接口,具体实现由各个数据库厂商负责。
原生jdbc技术的使用基本都是模板式的开发,基本格式比较固定。
JDBC增删改查
try{
//导入驱动包、加载具体驱动类
Class.forName("具体驱动类");
//与数据库建立连接,不同数据库写法可能不同,相同数据库不同版本写法可能也不一样,之前开发中遇到的//sqlserver2000的写法就与新版本的不一样
Connection connection = DriverManager.getConnection("...");
//通过connection,获取操作数据库的对象(Statement\preparedStatement\callablestatement)
Statement stmt = connection.createStatement("...");
//增删改操作都用stmt.executeUpdate("...");
//(查询)处理结果集
//ResultSet rs = stmt.executeQuery("...")
while(rs.next()){rs.getXxx(..) }
}catch(ClassNotFoundException e )
{ ...}
catch(SQLException e)
{...
}
catch(Exception e)
{...
}
finally
{//关闭各种连接资源,关闭顺序与打开顺序相反相反if(rs!=null)rs.close()if(stmt!=null) stmt.close();if(connection!=null)connection.close();
}
Statement\preparedStatement\callablestatement的区别
Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行时,数据库都要编译该SQL语句。
PreparedStatement表示预编译的SQL语句的对象,用于执行带参数的预编译的SQL语句,也可以不带参数。编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题。
CallableStatement提供了用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。继承自PreparedStatement,支持带参数的SQL操作。提供了对输出和输入/输出参数(IN/OUT)的支持。不同数据库的存储过程是不可移植的,因此CallableStatement
面临移植性差问题。
JDBC调用存储过程
//jdbc调用存储过程sql语句:
//{call <procedure-name>[(<arg1>,<arg2>, ...)]}
String sql = "{call queryEmp(?,?,?,?)}";Connection conn = null;
CallableStatement cstmt= null;try{//提前将获取数据库连接的方法封装为JDBCUtils公共方法conn = JDBCUtils.getConnection();cstmt= conn.prepareCall(sql);//赋值参数cstmt.setInt(1, 7839);//注册参数,声明类型cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);cstmt.registerOutParameter(3, java.sql.Types.DOUBLE);cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);//执行cstmt.execute();//获取值String name = call.getString(2);double sal = call.getDouble(3);String job = call.getString(4);}catch (Exception e){e.printStackTrace();}finally{//释放资源JDBCUtils.release(conn, cstmt, null);}
JDBC调用存储函数
//jdbc调用存储函数sql语句://{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}//第一个占位符为返回值String sql = "{? = call queryEmpIncome(?)}";Connection conn = null;CallableStatement cstmt= null;try{//获取连接conn = JDBCUtils.getConnection();//获取调用存储函数的对象cstmt= conn.prepareCall(sql);//注册返回值类型cstmt.registerOutParameter(1, java.sql.Types.DOUBLE);//参数赋值cstmt.setInt(2, 7839);//执行cstmt.execute();//取出返回值double income = cstmt.getDouble(1);}catch (Exception e){e.printStackTrace();}finally{//释放资源JDBCUtils.release(conn, cstmt, null);}
存储过程与存储函数主要区别
- 存储过程定义关键字用procedure,函数定义用function。
- 存储过程中不能用return返回值,只能通过改变参数为输出值(OUT)来,近似得输出返回值;存储函数中必须有return子句,定义return子句时,其后紧跟着返回值得类型。
- 存储过程可以有多个输出值,存储函数的返回值只有一个。
- function定义中只能有DDL(如select等)语句;procedure中主要是DML语句(对数据库进行复杂操作时,如对多个表进行Update、Insert、Query、Delete时)。
- 存储过程的执行方式有两种(a.使用execute b.使用begin和end);函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select SUMOF(3,4) form dual;)。
JDBC使用总结:增删改查、调用存储过程、执行存储函数、存储过程与存储函数区别分析相关推荐
- vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...
vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之 ...
- JDBC+MySQL入门增删改查案例
目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...
- jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查
1简单的Mvc,分层建包. java resources src/mian/java (1)dao 包 JDBC连接类,连接数据库.增删改查方法,其他的方法. (2)model包 实体类,数据库字段, ...
- JDBC的DML增删改查的代码重构设计(上)
1 设计商品对象 public class Product {private Long id;private String productName;private String brand;priva ...
- 增删改查操作下锁的相关情况_查询时的锁分析
此系列主要分析在增删改查操作下,表是否有索引等情况下,锁的申请使用情况,研究分析并用于语句调优,数据库优化,死锁堵塞分析等:由于时间问题,该篇只分析查询的情况,下篇继续分析 锁的种类 首先,先了解下数 ...
- JDBC(实现增删改查的通用操作)
JDBC JDBC概述 创建表以及相对应的对象(ORM) 表 对象 获取连接的方式 方式一 方式二 方式三 方式四 方式五(推荐使用) 增.删.改操作 查询操作 JDBC概述 为了使Java编写的程序 ...
- JDBC基础的增删改查方法封装
先创建一个user实体类 脚本架包 数据库user类表 package JDBCdemo;public class User {private long id;private String usern ...
- SQL增删改查,循环,触发器,存储过程,以及sql语法
可以直接粘贴代码使用 --创建数据库命令 create database j1216 on ( name=j1216, filename='E:\shuju\j1216\j1216.mdf', siz ...
- 查询jsp servelet mysql_JSP + Servlet + JDBC + Mysql 实现增删改查 课程管理系统(示例代码)...
1.项目目录结构 2.项目环境 Eclipse IDE MYSQL jdk tomcat jar包 3.数据库相关配置 先创建一个course的数据库名,然后在建立一个course的表 要注意将i ...
- JDBC的DML增删改查的代码重构设计(下)
JDBC的操作模板: 流程:1.创建ProductResultSetHandler对象:2.作为参数传递给query方法3.在query方法中:rsh.handler,其实调用的是ProductRes ...
最新文章
- 利用lua中的string.gsub来巧妙实现json中字段的正则替换
- spring之旅第四篇-注解配置详解
- doget dopost 过滤器 乱码
- 《GDAL源码剖析与开发指南》一一1.9 简单的调用
- Question for the 3D printing lattice?
- 【JavaScript】出现即使设置了ID也获取不到的可能原因与window.onload
- 说说 Spring AOP 原理
- java设置绝对布局_浅谈Java绝对布局 原创
- 如何定制 Calico 网络 Policy - 每天5分钟玩转 Docker 容器技术(70)
- 564. 寻找最近的回文数
- mysql left join右边有多条_left join 右表多条数据重复
- 在线JSON校验格式化工具(Be JSON)
- linux中一个用户可以同时属于多个组吗,为什么linux用户可以属于多个用户组,文件只能属于一个用户组?...
- 荣耀卖掉会有鸿蒙系统吗,华为为什么要把荣耀卖掉 荣耀卖掉之后依然还是那个荣耀吗?...
- 十六进制转ASCII码表
- unity泛型单例模式Singleton
- 05【数据的备份与恢复】
- 详解线性反馈移位寄存器(LFSR)
- ROS开发之如何使用RPLidar A1二维激光雷达?
- Oracle 11g 的 VKTM 进程 - virtual keeper of time
热门文章
- #39;git merge#39;和#39;git rebase#39;有什么区别?
- win11杜比视界音效怎么打开 window11开启杜比视界音效的步骤方法
- 如何用html制作彩虹,用 CSS 制作彩虹
- 宝元系统通讯软件recon_企业即时通讯工具需注意哪些问题
- jframe大小根据组件变化_Swing JDialog容器和JFrame容器使用教程
- b丅151组成的充电器电路_宜家LIVBOJ 无线充电器拆解,这设计一目了然
- UVW 在C#中的代码实现
- Stack Overflow监控系统内部架构初探
- 优化Angularjs的$watch方法
- nginx rewrite解决 jenkins error 404心得笔记