一、

Callablestatement:调用 数据库中的存储过程、存储函数

connection.prepareCall(参数:存储过程/存储函数名)
参数格式:
存储过程:(无返回值return,用Out参数代替返回值)
      {call 存储过程名(参数列表)}
存储函数:(有返回值return)
       { ?=call 存储函数名(参数列表)}

存储过程:
create or replace procedure addTwoNum( num1 in number,num2 in number,result out number)  --1+2-->3
as
begin
       result :=num1+num2;
end;
/     --/结束

强调:
如果通过sqlplus访问数据库,只需要开启:OracleServiceSID
通过其它程序访问数据(Sqldevelop、Navicat、JDBC),需要开启:OracleServiceSID、XxxListener

JDBC调用存储过程的步骤
a.产生调用存储过程的对象(CallableStatement )cstmt=connection.prepareCall("{call addTwoNum(?,?,?)}");
b.利用setXXX()进行处理             cstmt.setInt(1, 10)
c.通过registerOutParameter()处理输出参数类型            cstmt.registerOutParameter(3, Types.INTEGER);//必须放在execute()前面
d.cstmt.execute();//execute()进行执行
e.接受返回值int result=cstmt.getInt(3);

package JDBCDemo;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types; public class JDBCcallablestatementDemo {
private static final String URL="jdbc:mysql://localhost:3306/mysql?serverTimezone=UTC&characterEncoding=utf-8";
private static final String USERNAME="root";
private static final String PWD="vayne";
public static void update()
{
CallableStatement cstmt=null;
Connection connection=null;
try { //a.导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//b.与数据库建立连接
connection = DriverManager.getConnection(URL,USERNAME,PWD);
//使用Ctrl+1,快速生成值来获取Connection
//c.发送SQL,执行(增删改、查)
cstmt=connection.prepareCall("{call addTwoNum(?,?,?)}");
cstmt.setInt(1, 10);
cstmt.setInt(2, 20); cstmt.registerOutParameter(3, Types.INTEGER);//必须放在execute()前面
cstmt.execute();//execute()前处理输入值及输出参数类型,execute()后处理输出值
//设置输出参数的类型
int result=cstmt.getInt(3);
//处理结果
System.out.println(result+"操作成功!!!"); }catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally {
try {
//先开的后关,后开的先关
if(cstmt!=null)cstmt.close();
if(connection !=null)connection.close();
}catch(SQLException e) {
e.printStackTrace();
}finally { }
}
}
public static void main(String[] args) {
update(); }
}

二、JavaBean
将java代码和jsp代码分开存放
作用:
1、减轻jsp页面的负担,便于开发人员进行分块管理代码
2、提高代码复用率,封装成类,使用时直接调用即可。

定义
1、public修饰的类以及public修饰的无参构造
2、所有的属性都是private,并且还提供set/get  (boolean类型提供set/is)

使用层面,分为两类:
1、封装业务逻辑的JavaBean (LoginDao.java封装了登录逻辑)            即逻辑
    可以将jsp中的JDBC代码,封装到Dao.java类中 (Dao.java)

2、封装数据的JavaBean   (实体类,Student.java  Person.java  )    即数据
    对应于数据库中的一张表
    User user=new User(name,pwd);//即用User对象 封装了2个数据(用户名 和密码)

封装数据的JavaBean 对应于数据库中的一张表   (User(name,pwd))
封装业务逻辑的JavaBean 用于操作 一个封装数据的JavaBean

可以发现,JavaBean可以简化 代码(jsp->jsp+java)、提供代码复用(Dao.java)

登录实例

Navicat中建表如下

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
用户名<input type="text" name="uname"><br/>
密码<input type="password" name="upwd"><br/>
<input type="submit" value="登录"><br/>
</form>
</body>
</html>

check.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="Dao.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
User user=new User(name,pwd);
Dao dao =new Dao();
int result=Dao.login(user);
if(result>0){
out.print("登录成功");
}else{
out.print("用户名或密码错误");
}%>
</body>
</html>

DBUtil.DBUtil.java

package DBUtil;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import Dao.User; public class DBUtil { public static String db_url = "jdbc:mysql://localhost:3306/system?serverTimezone=UTC&characterEncoding=utf-8";
public static String db_user = "root";
public static String db_pass = "vayne"; public static Connection getConn () {
Connection conn = null; try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(db_url, db_user, db_pass);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
} public static void close (Statement state, Connection conn) {
if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} public static void close (ResultSet rs, Statement state, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
} if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }
}

Dao.User.java

package Dao;

public class User {
private int id;
private static String name;
private static String pwd;
private static String hobby; public User() { }
public User( String name, String pwd) {
this.name = name;
this.pwd = pwd;
} public User(int id, String name, String pwd, String hobby) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.hobby = hobby;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public static String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public static String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public static String getHobby() {
return hobby;
} public void setHobby(String hobby) {
this.hobby = hobby;
} }

Dao.Dao.java

package Dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import Dao.User;
import DBUtil.DBUtil;
public class Dao {
public static int login(User user) {
int f=-1;
String sql = "select * from JDBCjsp where name = '" + User.getName() + "' and password = '"+User.getPwd()+"'";
//
Connection conn = DBUtil.getConn();
Statement state = null;
ResultSet rs = null;
try {
state = conn.createStatement();
rs = state.executeQuery(sql);
if (rs.next()) {
f = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, state, conn);
}
return f;
} }

演示截图

输入正确的密码

输入错误的用户名

Callablestatement与JavaBean及其实例的更多相关文章

  1. Javabean使用实例

    1.login.jsp <%@ page language="java" contentType="text/html; charset=utf-8" p ...

  2. jsp+javaBean 计算器实例

    package com.wzh.test.domain; import java.math.BigDecimal; public class CalculatorBean { private Stri ...

  3. java web学习总结(二十八) -------------------JSP中的JavaBean

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  4. javabean和jsp动作元素

    model1就是利用了jsp和javabean 的组合来处理问题.jsp页面如果有太多的逻辑代码的话,维护起来和扩展起来是相当的麻烦的.所以jsp的逻辑代码部分都打包到一种java类当中进行编写.这种 ...

  5. 黑马程序员——【Java高新技术】——JavaBean、注解

    ---------- android培训.java培训.期待与您交流! ---------- 一.JavaBean * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector.在J ...

  6. jsp学习--JavaBean定义和在Jsp中使用JavaBean

    一.JavaBean 1.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:>>这个Java类必须具有一个无参的构造函数>>属性必须私 ...

  7. javaweb学习总结(二十)——JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  8. JavaBean之简单应用JSP页面

    JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性.每个属性通常都需要具有相应的setter. getter方法,setter方法称为属性修改器,getter方法称为 属性访 ...

  9. JavaBean个人总结

    JavaBean在JSP程序中的应用 JavaBean是为Java语言设计的软件组件模型,具有可重复使用和跨平台的特点.可以通过JavaBean来封装业务逻辑,进行数据库操作等,从而很好的实现业务逻辑 ...

随机推荐

  1. 视觉slam十四讲课后习题ch3-7

    题目回顾: 设有小萝卜一号和小萝卜二号位于世界坐标系中,小萝卜一号的位姿为:q1=[0.35,0.2,0.3,0.1],t2=[0.3,0.1,0.1]^T (q的第一项为实部.请你把q归一化后在进行 ...

  2. 实例演示:如何在Kubernetes上大规模运行CI/CD

    本周四晚上8:30,第二期k3s在线培训如约开播!本期课程将介绍k3s的核心架构,如高可用架构以及containerd.一起来进阶探索k3s吧! 报名及观看链接:http://z-mz.cn/PmwZ ...

  3. 【题解】P3373 【模板】线段树 2

    线段树解法 好丢脸,这个题做了一下午,调试了三个多小时...... 先讲讲解题思路 既然这里是线段树,就要用到lazy-tag.又有加法又有乘法的话,就要用到两个lazy-tag,分别用数组jia[] ...

  4. 免费网盘!无限申请5TB容量并且不限速的网盘!

    鸽了好久没有更新博客了哎…… 前言 这里我先说一下下,本人深受百度网盘坑害,自己上传的文件,16GB下载花了3天时间 最后下载失败? 所以找到的一个新的储存个人文件的方法. 这个网盘是onedrive ...

  5. 怎么理解Laravel的核心架构

    使用过larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器.视图.模型)之外,还有中间件.门面.契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一 ...

  6. 02-Redis

    今日内容 1. redis 1. 概念 2. 下载安装 3. 命令操作 1. 数据结构 4. 持久化操作 5. 使用Java客户端操作redis Redis 1. 概念:redis是一款高性能的NOS ...

  7. geo常见需求

    常见的地理位置相关需求有: 1.查找附近的人 2.显示两点距离 3.点是否在指定范围内(地理围栏) redis.MongoDB.mysql都已支持geo 几种geo方案对比 https://blog. ...

  8. dubbo-admin dubbo-monitor 安装

    dubbo-admin: 因为我们不能直观的看到dubbo和zk上到底有什么服务(提供者),所以我们需要一个可视化工具来方便我们管理每一个服务和每一个节点.dubbo-admin 就是dubbo的管理 ...

  9. asp.net core 3.1 入口:Program.cs中的Main函数

    本文分析Program.cs 中Main()函数中代码的运行顺序分析asp.net core程序的启动,重点不是剖析源码,而是理清程序开始时执行的顺序.到底用了哪些实例,哪些法方. asp.net c ...

  10. Python面试(网编+数据库)

    第一部分 必答题 简述 OSI 7层模型及其作用?(2分) 应用层:与用户直接交互,软件.网站等 表示层:使用软件.网站可以查看的数据,图片等 会话层:保持登录状态,电脑中为cookie 传输层:选择 ...