jsp中的数据库编程

JSP面向接口的编程方式 JSP连接MySQL数据库 举个连接班级表的简单例子 MySQL中的班级表里面的数据展现到jsp页面让用户浏览 1.连接数据库 public class Dome { public final static String URL="jdbc:mysql://localhost:3306/mysql?&useSSL=false&serverTimezone=UTC"; public final static String NAME="root"; public final static St 阅读详情

jsp中的数据库编程


一,SQL复习
1,SQL语句分为两类:DDL(Data Definition Language)和DML(Dat Manipulation Languge,数据操作语言)。前者主要是定义数据逻辑结构,包括定义表、视图和索引;DML主要是对数据库进行查询和更新操作。
2,Create Table(DDL):
Create Table tabName(
colName1 colType1 [else],
colName2 colType2 [else],
...,
colNamen colTypen [else]
);
例如:Create Table pJoiner(
pno char(6) not null,
eno char(6) nut null
);
char int varchar等等都是用来定义列数据类型的保留字,其中varchar表示可变字符类型。
3,Select <col1>,<col2>,...,<coln>
From <tab1>,<tab2>,...,<tabm>
[Where<条件>]

条件中的子查询:
Where Not Exists(
Select * From tab2 Where col1=col2
)//当查询结果为空时,条件为真。

4,INSERT INTO <tab1> VALUES(<col1>, ...<coln>)
5,DELETE FROM <tab1> [WHERE<条件>]
6,UPDATE <tab1>
SET <tab1>=<vlu1>
...
<tabn>=<vlun>
[WHERE<条件>]
例如:
Update exployee
Set age=27
Where name='赵一'
二,JDBC 主要接口:
java.sql.DriverManager类用于处理驱动程序的调入并且对新的数据库连接提供支持。
java.sql.Connection,指应用程序与特定数据库的连接。
java.sql.Statement,用于一般sql语句的执行(可以是查询、更新甚至可以创建数据库的执行过程)
java.sql.ResultSet,查询所返回的结果保存在此对象中,用它可以浏览和存取数据库内的记录。

1,通过jdbc-odbc桥使用odbc数据库(并不需要jdbc Drivers)

先在odbc DSN(Data Source Name)设置处设置pubs sysDSN,sa为username,密码为空
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序
con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs
con.close();
//应当catch ClassNotFoundException和SQLException

Connection的getWarning方法返回一个SQLWarning对象,在连接之前应当先检查。
使用jdbc-odbc的最大好处是:免费的。但是性能受odbc的限制,而且一般odbc驱动比较昂贵。
2,使用专门的jdbc驱动程序。//此处是mm jdbc Driver
先将jar文件放在ClassPath里面。
Class.forName("org.gjt.mm.mysql.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");
con.close();

可见使用何种方式连接何种数据库与数据库的操作和连接数据库是无关的。
三,查询数据库
Statement stmt=con.createStatement();
stmt.setMaxRows()可以控制输出记录最大数量;
ResultSet rs=stmt.executeQuery("select .....");

ResultSet指向当前记录:
int userId=rs.getInt("userid");
String userName=rs.getString("username");
...或者用序号(从1开始的)
int userId=rs.getInt(1);
Stirng userName=rs.getString(2);

ClassNotFoundException是由于Class.forName()无法载入jdbc驱动程序触发的
SQLException是jdbc在执行过程中发生问题时产生。有一个额外的方法getNextException()
catch(SQLException e){
out.println(e.getMessage());
while(e=e.getNextException()){
out.println(e.getMessage());
}
}

一般来说并不建议在jsp中编写数据库的访问程序,可以将数据库的访问封装在一个javabean中。
四,ResultSet深入
1,ResultSetMetaData
ResultSet rs=stmt.executeQuery("select....");
ResultSetMetaData rsmd=rs.getMetaData(); //获取ResultSetMateData对象
int numberOfColumns=rsmd.getColumnCount();//返回列数
boolean b=rsmd.isSearchable(int i);//返回第i列是否可以用于where子句
String c=rsmd.getColumnLabel(int i);//获取第i列的列标
Objcet obj=rs.getObject();
if(obj!=null)out.println(obj.toString());
else println("");
2,SQL类型与ResultSet的getObject返回类型及对应的XXX getXXX()方法
SQL类型 JSP类型 对应的getXXX()方法
————————————————————————————————————————————
CHAR String String getString()
VARCHAR String String getString()
LONGVARCHAR String InputStream getAsciiStream()/getUnicodeStream()
NUMERIC java.math.BigDecimal java.math.BigDecimal getBigDecimal()
DECIMAL 同上
BIT Boolean boolean getBoolean()
TINYINT Integer byte getByte()
SMALLINT Integer short getShort()
INTEGER Integer int getInt()
BIGINT Long long getLong()
REAL Float float getFloat()
FLOAT Double double getDouble()
DOUBLE Double double getDouble()
BINARY byte[] byte[] getBytes()
VARBINARY byte[] byte[] getBytes()
LONGVARBINARY byte[] InputStream getBinaryStream()
DATE java.sql.Date java.sql.Date getDate()
TIME java.sql.Time java.sql.Time getTime()
TIMESTAMP java.sql.Timestamp java.sql.Timestamp getTimestamp()

3,null
int i=rs.getInt("age");
if(!rs.wasNull())....//RecordSet::wasNull()用来检查null
4,存取大字符串和二进制文本
对于数据库中longvarchar和langvarbinary进行流操作
ResultSet rs=stmt.executeQueryString("select ...");
BufferedReader br=new BufferedReader(new InputStream(rs.getAsciiStream("vol1")));//长文本串
BufferedReader br=new BufferedReader(new InputStream(rs.getUnicodeStream("vol1")));
BufferedReader br=new BufferedReader(new InputStream(rs.getBinaryStream("vol2")));//长二进制文本
//取数据必须在rs.getAsciiStream(), rs.getUnicodeStream(), rs.getBinaryStream()等之后马上进行


五,浏览ResultSet
1,JDBC2.0提供了更多浏览ResultSet的方法
首先,确定你的jdbc驱动程序支持jdbc2.0
其次,由Connection生成Statement时要指定参数
Statement stmt=con.getStatement("游标类型", "记录更新权限");
游标类型:
ResultSet.TYPE_FORWORD_ONLY:只可以向前移动
ResultSet.TYPE_SCROLL_INSENSITIVE:可卷动。但是不受其他用户对数据库更改的影响。
ResultSet.TYPE_SCROLL_SENSITIVE:可卷动。当其他用户更改数据库时这个记录也会改变。
记录更新权限:
ResultSet.CONCUR_READ_ONLY,只读
ResultSet.CONCUR_UPDATABLE,可更新

getStatement()缺省参数:getStatement(ResultSet.TYPE_FORWORD_ONLY, ResultSet.CONCUR_READ_ONLY)
2,如果ResultSet是可卷动的,以下函数可以使用:
rs.absolute()//绝对位置,负数表示从后面数
rs.first()第一条
rs.last()最后一条
rs.previoust()前一条
rs.next()后一条
rs.beforeFirst()第一条之前
rs.afterLast()最后之后
rs.isFirst(),rs.isLast(),rs.isBeforeFirst(),rs.isAfterLast
注意,刚打开的时候是处于第一条记录之前的

六,更新数据库
1,stmt.executeUpdate("strSql"),strSql是一条sql更新语句。update,insert,delete返回影响到的条数
2,stmt.execute()方法在不知道sql语句是查询还是更新的时候用。如果产生一条以上的对象时,返回true,此时可用 stmt.getResultSet()和stmt.getUpdateCount()来获取execute结果,如果不返回ResultSet对象则返回false.
3,除了Statement的executeUpdate之外还可以用ResultSet:
rs.updateInt(1,10);
rs.updateString(2,"sfafd");
rs.updateRow();

七,使用预编译PreparedStatement
PreparedStatement对象和Statement对象类似,都可以用来执行SQL语句。不同在于,数据库会对PreparedStatement的SQL语句进行预编译,而且仍旧能输入参数并重复执行编译好的查询速度比未编译的要快。
PreparedStatement stmt=con.preparedStatement("Insert Into users(userid, username) values(?,?)");
stmt.clearParameters();
stmt.setInt(1,2);
stmt.setString(2,"Big");
stmt.executeUpdate();

八,执行存储过程
1,JDBC调用存储过程,并使用存储过程的返回值。这样可以将处理工作分为服务端和客户端两部分,并大大加快系统的设计和开发的时间。比如可以重复使用服务器上的组件。使用存储过程之后大量诸计算工作可以交给数据库服务器来处理,这将降低Web服务器的负载,从而提高整个系统的性能。
2,有两个表UserMain{UserID,UserName,UserType},UserRef{BrefID, UserID, UserBrief}
下面的存储过程可以接受jdbc传来的参数,新增内容到UserMain和UserRef,并输出一个OutUserID.
CREATE PROCEDURE ap_adduser
(
@OutUserID int output, //此为输出参数,output标记
@UserName varchar(25), //参数表示方法:"@XXX"为变量名,"变量名 类型 [output]"
@UserType tinyint,
@UserBrief varchar(255),
)
AS
Declare @UserID int //定义局部变量
insert into UserMain(UserName, UserType)
values(@UserName,@UserType)
select @UserID=@@IDENTITY //赋值用select,此处自动获得ID
insert into UserRef(UserID, UserBrief)
select @OutUserID=@UserID
GO/*结束,基本结构:
CREATE PROCEDURE procedureName(
parameters
)
AS
actions
GO
*/


JSP页面中这样使用:
CallableStatement stmt=con.prepareCall("{call ap_adduser(?,?,?,?)}");
stmt.registerOutParameter(1,Types.INTEGER,1);//注册输出变量
stmt.setString(2,"edmund");
stmt.setInt(3,1);
stmt.setString(4,"description");
stmt.execute();
int userid=stmt.getInt(1);
stmt.close()

八,使用事务
1,事务中的操作是一个整体,要么都执行成功要么都不成功:事务开始后,如果所有的改变都正确,则使用commit方法将这些动作全部存入数据库,否则就使用rollback取消所有的改变动作,而这时数据库中的数据和执行事务前的是相同的。
2,使用事务时应当先用 con.setAutoCommit(false),最后使用commit或者rollback
3,rollback一般在catch段执行
九,数据库连接池
1,如果有一个数据库连接请求并且连接中没有连接,则生成一个新的连接。这个连接使用完之后并不关闭它,而是将它放入连接池。在这个过程中,还要判断连接池中的连接是否超期。如果超期则将它关闭。
2,有很多已有的Connection Pool包可以使用。
3,一般将Connection Pool作为一个application作用域的变量使用
<jsp:useBean id="pool" scope="application" class="javastart.tools.ConnectionPool" />
<%@page import="java.sql.*"%>
<%@page import="javastart.tools.*"%>
<!--javastart.tools是你的Connection Pool所在的地方-->
DBConnection con=null;
try{
con=pool.getConnection("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:access","","");
Statement stmt=con.createStatement();
stmt.setMaxRows(10);
String query=request.getParameter("quey");
ResultSet rs=stml.executeQuery(query);
ResultSetMetaData rsmd=rs.getMetaData();
}
.....
finally{
pool.releaseConnection(con);
}

也可以使用一个Servlet初始化连接池

 

JSP编程中的现实应用及示例代码 综上所述,尽管前端框架和JavaScript在Web开发中变得越来越流行,但JSP仍然是一种强大且广泛使用的服务器端编程技术。通过嵌入Java代码,JSP能够生成动态内容,使得网页能够根据用户请求和数据变化进行实时更新。a. 动态网页生成:JSP允许在服务器端嵌入Java代码,通过动态生成HTML页面来展示数据。在上述示例中,展示了一个用户注册处理的JSP代码。在上述示例中,使用了JSP的嵌入式Java代码()来生成一个包含产品列表的HTML页面。如果发生错误,则显示注册失败的消息。 阅读详情

相关推荐

Ubuntu+Dify实战:如何让大模型知识库完美支持图片召回(附避坑指南)

本文详细介绍了在Ubuntu系统上部署Dify平台,并实现大模型知识库图片召回功能的完整实战方案。通过解析Dify处理图片的底层逻辑,重点讲解了配置Nginx代理服务器将本地图片路径转换为可公开访问URL的核心工程步骤,并提供了文档预处理、环境变量配置以及父子分段策略等高级技巧,帮助开发者构建图文并茂的AI应用,有效提升知识库的丰富性和用户体验。

c7d8e的博客 424

JSP中SQL数据库编程技术

JSP中SQL数据库编程技术一,SQL复习 1,SQL语句分为两类:DDL(Data Definition Language)和DML(Dat Manipulation Languge,数据操作语言)。前者主要是定义数据逻辑结构,包括定义表、视图和索引;DML主要是对数据库进行查询和更新操作。 2,Create Table(DDL):  Create Table tabName(   colNam

思想无止境 2659

别再手动填数据了!Vivado里用.coe文件给ROM IP核预装数据的保姆级教程

本文详细介绍了在Vivado中使用.coe文件为ROM IP核预装数据的全流程教程,包括文件格式规范、数据转换技巧和Vivado配置指南。通过自动化数据加载,开发者可以显著提升FPGA开发效率,避免手动输入错误,适用于查找表、波形存储等多种应用场景。

weixin_33377602的博客 309

方法:rs.absolute(...)和rs.isAfterLast()

rs.absolute(...)允许你指定结果集的绝对位置,如果没有它,假如你要取第1000条记录的数据,就只能rs.next()1000次了:)rs.isAfterLast()是一种特殊的状态,表征已到达结果集的结尾,此时你如果调用rs.next()就会抛出异常rs.next();//向后滚动rs.getRow();//得到当前行号rs.absolute(n);//光标定位到n行rs.relat

www89404565的专栏 1122

java的absolute如何用,java调用存储过程返回rs.absolute(1)报错,该如何解决

当前位置:我的异常网» Java Web开发»java调用存储过程返回rs.absolute(1)报错,该如何解决java调用存储过程返回rs.absolute(1)报错,该如何解决www.myexceptions.net网友分享于:2013-05-11浏览:27次java调用存储过程返回rs.absolute(1)报错1.package com.mypack.test;2.3.imp...

weixin_39769091的博客 369

关于 给absolutepage赋值出错

<br />当我们用记录集进行分页时,有时会奇怪的发现,当给absolutepage赋值时,absolutepage的值会出现等于 -1,-2,-3 奇怪现象.先说一下,-1,-2,-3 的意义吧: -1:表示RS.BOF; -2表示RS.EOF; -3表示超出了RS.PAGECOUNT.<br />本人出现过 为-3的情况,出现的原因是,在没有设置RS.PAGESIZE时,就给RS.absolutepage赋值,这样很明显会出错 ,因为当你没有设置好rs.pagesize时,记录集不出自己计算出自己的PA

曾经最美 1264

java执行sql脚本,支持普通sql和存储过程

sql脚本执行的工具类及使用实例 package com.ph.exsdb.service.impl; import com.ph.exsdb.common.application.BusinessException; import com.ph.exsdb.common.utils.StringUtil; import org.apache.commons.logging.Log; impor...

路口小沣 1300

数据库技术练习2

2.在jsp中写查询数据库db_database24中的表tb_user中的所有数据并在页面中显示出来。1.用sql在MYSQL-FRONT中创建数据表tb_user。

Nefertari_______的博客 106

编程示例:jsp数据库中的编程

如果产生一条以上的对象时,返回true,此时可用 stmt.getResultSet()和stmt.getUpdateCount()来获取execute结果,如果不返回ResultSet对象则返回false.1,事务中的操作是一个整体,要么都执行成功要么都不成功:事务开始后,如果所有的改变都正确,则使用commit方法将这些动作全部存入数据库,否则就使用rollback取消所有的改变动作,而这时数据库中的数据和执行事务前的是相同的。1,如果有一个数据库连接请求并且连接中没有连接,则生成一个新的连接。

红孩儿编程大师 752

第6章 数据库编程---数据库原理及应用

第6章 数据库编程 1、理解ODBC连接数据库的方法 2、掌握数据库连接技术(JDBC) 3、掌握JavaWeb数据库编程 4、掌握数据库存储过程原理与编程 5、掌握数据库触发器原理与编程 6、掌握数据库游标的原理与编程 7、理解嵌入式SQL编程的过程 6.1 数据库连接技术(ODBC) 本节的主要内容 • 了解数据库编程的内容 • 了解ODBC的技术背景 • 掌握数据库ODBC的层次架构 • 理解ODBC访问数据库的过程 • 掌握ODBC数据源的配置方法 一、数据库编程简介 (1)客户端应用编

aiqq136的博客 4591

编程新技术实务】实验二 HTML以及J2EE简单编程(Java Web工程 JSP+Servlet+Mysql)

目录实验目的实验对应知识点实验前任务实验要求及步骤一、Tomcat应用服务器安装配置二、编写web页面,完成对实验一数据库的操作具体实现 实验目的 安装配置好Tomcat应用服务器,使用Java进行JSP、Servlet的编写web应用并将其部署到Tomcat上 实验对应知识点 结合HTML进行JavaEE框架中的JSP、Servlet编程 实验前任务 学习Java的基本语法以及Java数据库编程...

悲伤无声地涌出来 4968

JSP编程技巧集锦

      JSP编程技巧集锦实用性问题汇总   一个问题一段代码新手上路走捷径   浓缩精华实用方便      一份20元(WORD文件)需要者请联系:e_mail:fzlotuscn@yahoo.com.cn    QQ:595563946目录1. 如何让选中的一行记录高亮显示?2. 如何在下拉列表框里选择一个值后跳出新窗口?3. 如何在JSP中启动execl?4.

无为的专栏 1084

JSP课程总结

(一) Web基础知识 静态web页:由html标记构造的web页(基于文件构造),其文件拓展名为a.html 动态web页:含服务器控制程序的web 早期CGI:公共网关接口技术 脚本编程:PHP、ASP、JSP(基于java构造) 基于JSP构造web应用: This is a web Abcxyz<%动态编码%> (二) Jsp基础  Jsp...

just_now_and_future的博客 3064

JavaWeb:实验二JSP表单开发及访问数据库

请书写你对本次实验有哪些实质性的收获和体会,以及对本次实验有何良好的建议?(10分)login.jsp这个页面包含一个登录表单,用户需要输入用户名和密码。通过 JavaScript 对表单进行了基本的前端验证,确保用户输入不为空。当用户点击登录按钮时,表单数据将被提交到 login_result.jsp 页面进行处理。这个页面接收从登录表单提交的用户名和密码。加载 MySQL 驱动,建立数据库连接。

OraOla的博客 2263

基于JSP实现图片的数据库存储与显示

摘 要:本文介绍了利用JSP编程模式如何实现图片的数据库存储和显示。 关键词:JSP、动态存取、SQL、输入输出流 1、引言 数据库应用程序,特别是基于WEB的数据库应用程序,常会涉及到图片信息的存储和显示。通常我们使用的方法是将所要显示的图片存在特定的目录下,在数据库中保存相应的图片的名称,在JSP中建立相应的数据源,利用数据库访问技术处理图片信息。但是,如果我们想动态的显...

开心的穷下去 712
上一篇: struts-hibernate-spring基础配制
下一篇: ORACLE中date类型字段的处理
hitlermen
博客等级 码龄20年 42粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值