一、

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. CSS颜色表示的几种方式

    在CSS中颜色有很多表示方式,今天列出一些常见的颜色表示方式及它们的用法. ①color:blue;  第一种,调用颜色属性,将颜色的英文输入在冒号后,以分号结束. 这种方法直接了当,但是能表示的颜色 ...

  2. CCF_ 201512-4_送货

    一道拖了很久了题,用bool开的vis不会爆内存,dfs回溯的话会超时,于是有了一个很巧妙的dfs. #include<iostream> #include<cstring> ...

  3. 全网一定不是最好懂的C++线性筛素数

    Part 0:概念 先给几个概念(很重要): 合数:如果\(xy=z\text{且}x,y\text{为正整数}\),我们就说\(x,y\text{是}z\text{的合数}\) 素数:如果数\(a\ ...

  4. Qt 中QPainter 使用中出现的问题

    这两天在使用QPainter的过程中出现了一些问题,记录一下. 测试程序很简单,写一个继承自QWidget的类,重载其paintEvent函数进行绘图. case1: 在paintEvent函数中使用 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统--网页版本代码生成器

    1.单列表模式 2.树形列表模式 3.左右列表模式 4.左右树形和列表结合模式 一 简介 网页版代码生成器需要运行项目,非常有趣,可以用来研究,和自定义一些自己的代码习惯 按界面生成:可生成单个页面和 ...

  6. 论文《Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling》

    Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling 一.主要贡献 1. pro ...

  7. 关于simplememory theme的设置和感想

    前言 首先,这是我第一次自己个性化博客的主题.如果下文所写如有不妥之处还望大佬指出 参考 这次设置多亏了GitHub上的开源代码:https://github.com/BNDong/Cnblogs-T ...

  8. pikachu-跨站请求伪造(CSRF)

    一.CSRF漏洞概述 1.1 什么是CSRF漏洞 在CSRF的攻击场景中攻击者会伪造一个请求(整个请求一般是一个链接),然后七篇目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了,所以CSR ...

  9. C# 多线程之通过Timer开启线程的例子

    本例通过Timer的tick()方法触发TimerCallback委托来开辟新的线程,线程中的具体工作通过一个静态方法作为参数给TimerCallback委托. using System; using ...

  10. Android9.0 Settings 修改踩坑记录

    问题现象 上图展示的很清楚,当系统语言为中文时,PreferenceScreen 中的折叠项 summary 描述重复显示的 bug,系统语言为英文时正常. 修改历程 先搜索 当前显示了 字符串,还真 ...