你好,请参考我以前做过的例子:
(1)把mysql的驱动放到tomcat的lib中
(2)建一个很简单的表person就两个字段username和password,数据库名和数据库密码换成你的就是了
create database ibatis;--创建数据库
use ibatis;--使用数据库,以下表在该数据库中
create table person(username varchar(20),password varchar(20));--创建person表
(3)创建indexjsp和registjsp
1:
indexjsp 提交表单页面
<%@ page pageEncoding="GBK"%>
<html>
<head>
</head>
<body>
<form action="registjsp" method="post">
username :<input type = "text" name="name"/>
password :<input type = "password" name="password"/>
<input type = "submit" value="提交"/>
</form>
</body>
</html>
2:registjsp //用户注册同时显示所有用户
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="javasql"%>
<body>
<center>
<%
requestsetCharacterEncoding("GBK");
String uname=requestgetParameter("name"); //从表单获得
String pwd=requestgetParameter("password"); //从表单获得
String driver="commysqljdbcDriver"; //我用的是mysql官方驱动你自己换一下就是了 在这里有
String url="jdbc:mysql://localhost:3306/ibatisuser=root&password=yanghao"; //这是数据库连接地址Ibatis是数据库名称,user是用户password就是你的用户名,根据实际情况你修改
String sql="INSERT INTO person (username,password) VALUES('"+uname+"','"+pwd+"')"; //把indexjsp提交的两个数据插进数据库的数据库语句
Connection conn=null; //数据库连接
Statement stmt=null;
ResultSet rs = null; //查询结果
%>
<%
ClassforName(driver); //加载驱动
conn=DriverManagergetConnection(url); //获得连接
stmt=conncreateStatement();
stmtexecute(sql);//存入数据库
rs=stmtexecuteQuery("select from person"); //查询所有person语句
%>
<%
if(rs!=null){ //判断以下
while(rsnext()){
String username=rsgetString(1);
String password=rsgetString(2);
%>
<table>
<tr>
<td><%=username %></td>
<td><%=password %></td>
</tr>
</table>
<%
//关闭数据库连接,和开始的顺序是反的
rsclose();//关闭结果集
stmtclose();//关闭Statement
connclose();//关闭数据库连接
//ok完成了插入和查询 *** 作
}
}
%>
</center>
</body>
你好。
执行顺序和数据库有关的。
如果你的数据库是SQL Server,你的理解是正确的。
ORACLE是从后往前解析,SQL Server则是从前往后。
如果对这方面比较感兴趣,SQL Server推荐一本书
《Microsoft SQL SERVER 2008技术内幕 T-SQL查询(中文)》,其中有讲逻辑查询处理阶段详解。
(在网上应该容易找到的,不行的话加我qq(知道号))
如果是Oracle的话,可以查一下优化器相关。
使用java连接MySQL数据库与其他的数据库连接核心是一样的,如果说区别,那就是所需的驱动不一样。
工具/原料
MySQL、JDK
方法/步骤
1、首先需要安装好JDK(配置环境变量),如图所示:
2、其次要安装好MySQL数据库,可以使用可视化Navicar For MySQL,如图所示:
3、最后通过代码进行连接。
(1)确定连接路径URL:
String url="jdbc:mysql://localhost(可以是本机IP地址):3306(端口号)/mysqltest(数据库名称)?"+"user=用户账号&password=用户密码&useUnicode=字符编码";
(2)加载驱动:
ClassforName("commysqljdbcDriver");
(3)连接,获取Connection对象
Connection conn=DriverManagergetConnection(url)
(4)可以通过conn对象检验连接与否。
创建一个以JDBC连接数据库的程序,包含7个步骤:
1、加载JDBC驱动程序:
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),
这通过javalangClass类的静态方法forName(String className)实现。
例如:
try{
//加载MySql的驱动类
ClassforName("commysqljdbcDriver") ;
}catch(ClassNotFoundException e){
Systemoutprintln("找不到驱动程序类 ,加载驱动失败!");
eprintStackTrace() ;
}
成功加载后,会将Driver类的实例注册到DriverManager类中。
2、提供JDBC连接的URL
•连接URL定义了连接数据库时的协议、子协议、数据源标识。
•书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:(MySql的连接URL)
jdbc:mysql:
//localhost:3306/testuseUnicode=true&characterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
3、创建数据库的连接
•要连接数据库,需要向javasqlDriverManager请求并获得Connection对象,
该对象就代表一个数据库的连接。
•使用DriverManager的getConnectin(String url , String username ,
String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和
密码来获得。
例如:
//连接MySql数据库,用户名和密码都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManagergetConnection(url , username , password ) ;
}catch(SQLException se){
Systemoutprintln("数据库连接失败!");
seprintStackTrace() ;
}
4、创建一个Statement
•要执行SQL语句,必须获得javasqlStatement实例,Statement实例分为以下3
种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式:
Statement stmt = concreateStatement() ;
PreparedStatement pstmt = conprepareStatement(sql) ;
CallableStatement cstmt =
conprepareCall("{CALL demoSp( , )}") ;
5、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate
和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句
,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或
DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的
语句。
具体实现的代码:
ResultSet rs = stmtexecuteQuery("SELECT FROM ") ;
int rows = stmtexecuteUpdate("INSERT INTO ") ;
boolean flag = stmtexecute(String sql) ;
6、处理结果
两种情况:
1、执行更新返回的是本次 *** 作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据:
while(rsnext()){
String name = rsgetString("name") ;
String pass = rsgetString(1) ; // 此方法比较高效
}
(列是从左到右编号的,并且从列1开始)
7、关闭JDBC对象
*** 作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
if(rs != null){ // 关闭记录集
try{
rsclose() ;
}catch(SQLException e){
eprintStackTrace() ;
}
}
if(stmt != null){ // 关闭声明
try{
stmtclose() ;
}catch(SQLException e){
eprintStackTrace() ;
}
}
if(conn != null){ // 关闭连接对象
try{
connclose() ;
}catch(SQLException e){
eprintStackTrace() ;
}
}
1 Join
我得到A 数据流(不管是基于文件或数据库),A包含field1 , field2 , field3 字段,然后我还有一个B数据流,B包含field4 , field5 , field6 , 我现在想把它们 ‘加’ 起来, 应该怎么样做
这是新手最容易犯错的一个地方,A数据流跟B数据流能够Join,肯定是它们包含join key ,join key 可以是一个字段也可以是多个字段。如果两个数据流没有join key ,那么它们就是在做笛卡尔积,一般很少会这样。比如你现在需要列出一个员工的姓名和他所在部门的姓名,如果这是在同一个数据库,大家都知道会在一个sql 里面加上where 限定条件,但是如果员工表和部门表在两个不同的数据流里面,尤其是数据源的来源是多个数据库的情况,我们一般是要使用Database Join *** 作,然后用两个database table input 来表示输入流,一个输入是部门表的姓名,另一个是员工表的姓名,然后我们认为这两个表就可以 ”Join” 了,我们需要的输出的确是这两个字段,但是这两个字段的输出并不代表只需要这两个字段的输入,它们之间肯定是需要一个约束关系存在的。另外,无论是在做 Join , Merge , Update , Delete 这些常规 *** 作的时候,都是先需要做一个compare *** 作的,这个compare *** 作都是针对compare key 的,无论两个表结构是不是一样的,比如employee 表和department 表,它们比较的依据就是employee 的外键department_id , 没有这个compare key 这两个表是不可能连接的起来的 对于两个表可能还有人知道是直接sql 来做连接,如果是多个输入数据源,然后是三个表,有人就开始迷茫了,A表一个字段,B表一个字段,C表一个字段,然后就连Join *** 作都没有,直接 database table output , 然后开始报错,报完错就到处找高手问,他们的数据库原理老师已经在吐血了。如果是三个表连接,一个sql 不能搞定,就需要先两个表两个表的连接,通过两次compare key 连接之后得到你的输出,记住,你的输出并不能代表你的输入 下面总结一下:
1 单数据源输入,直接用sql 做连接
2 多数据源输入,(可能是文本或是两个以上源数据库),用database join *** 作
3 三个表以上的多字段输出
2 Kettle的数据库连接模式
Kettle的数据库连接是一个步骤里面控制一个单数据库连接,所以kettle的连接有数据库连接池,你可以在指定的数据库连接里面指定一开始连接池里面放多少个数据库连接,在创建数据库连接的时候就有Pooling 选项卡,里面可以指定最大连接数和初始连接数,这可以一定程度上提高速度
3 transaction
我想在步骤A执行一个 *** 作(更新或者插入),然后在经过若干个步骤之后,如果我发现某一个条件成立,我就提交所有的 *** 作,如果失败,我就回滚,kettle提供这种事务性的 *** 作吗?
Kettle 里面是没有所谓事务的概念的,每个步骤都是自己管理自己的连接的,在这个步骤开始的时候打开数据库连接,在结束的时候关闭数据库连接,一个步骤是肯定不会跨session的(数据库里面的session), 另外,由于kettle是并行执行的,所以不可能把一个数据库连接打开很长时间不放,这样可能会造成锁出现,虽然不一定是死锁,但是对性能还是影响太大了。ETL中的事务对性能影响也很大,所以不应该设计一种依赖与事务方式的ETL执行顺序,毕竟这不是OLTP,因为你可能一次需要提交的数据量是几百 GB都有可能,任何一种数据库维持一个几百GB的回滚段性能都是会不大幅下降的
4 我真的需要transaction 但又不想要一个很复杂的设计,能不能提供一个简单一点的方式
Kettle 在302GA版中将推出一种新功能,在一个table output 步骤中有一个Miscellaneous 选项卡,其中有一个Use unique connections 的选项,如果你选中的话就可以得到一个transaction 的简单版,
由于是使用的单数据库连接,所以可以有错误的时候回滚事务,不过要提醒一点是这种方式是以牺牲非常大的性能为前提条件的,对于太大的数据量是不适合的(个人仍然不建议使用这种方式)
5 temporary 表如何使用
我要在ETL过程中创建一个中间表,当某个条件成立的时候,我要把中间表的数据进行转换,当另一条件成立的时候我要对中间表进行另一个 *** 作,我想使用数据库的临时表来 *** 作,应该用什么步骤。
首先从temp 表的生命周期来分,temp分为事务临时表和会话临时表,前面已经解释过了,kettle是没有所谓事务的概念的,所以自然也没有所谓的事务临时表。 Kettle的每个步骤管理自己的数据库连接,连接一结束,kettle也就自然丢掉了这个连接的session 的handler , 没有办法可以在其他步骤拿回这个session 的handler , 所以也就不能使用所谓的会话临时表,当你尝试再开一个连接的时候,你可以连上这个临时表,但是你想要的临时表里面的数据都已经是空的(数据不一定被清除了,但是你连不上了),所以不要设计一个需要使用临时表的转换
之所以会使用临时表,其实跟需要 ”事务” 特性有一点类似,都是希望在ETL过程中提供一种缓冲。临时表很多时候都不是某一个源表的全部数据的镜像,很多时候临时表都是很小一部分结果集,可能经过了某种计算过程,你需要临时表无非是基于下面三个特性:
1 表结构固定,用一个固定的表来接受一部分数据。
2 每次连接的时候里面没有数据。你希望它接受数据,但是不保存,每次都好像执行了truncate table *** 作一样
3 不同的时候连接临时表用同一个名字,你不想使用多个连接的时候用类似与temp1 , temp2 , temp3 , temp4 这种名字,应为它们表结构一样。
既然临时表不能用,应该如何设计ETL过程呢?(可以用某种诡异的 *** 作搞出临时表,不过不建议这样做罢了)
如果你的ETL过程比较的单线程性,也就是你清楚的知道同一时间只有一个这样的表需要,你可以创建一个普通的表,每次连接的时候都执行truncate *** 作,不论是通过table output 的truncate table 选项,还是通过手工执行truncate table sql 语句(在execute sql script 步骤)都可以达到目的(基于上面的1,2 特性)
如果你的ETL *** 作比较的多线程性,同一时间可能需要多个表结构一样并且里面都是为空的表(基于上面1,2,3特性),你可以创建一个 “字符串+序列” 的模式,每次需要的时候,就创建这样的表,用完之后就删除,因为你自己不一定知道你需要多少个这种类型的表,所以删除会比truncate 好一些。
下面举个例子怎么创建这种表:
你可以使用某种约定的表名比如department_temp 作为department 的临时表。或者
把argument 传到表名,使用 department_${argument} 的语法,
如果你需要多个这种表,使用一个sequence *** 作+execute sql script *** 作,execute sql script 就下面这种模式
Create table_ (…………)
在表的名字上加参数,前面接受一个sequence 或类似的输入 *** 作
需要注意的是这种参数表名包括database table input 或者execute sql script ,只要是参数作为表名的情况前面的输入不能是从数据库来的,应为没有办法执行这种preparedStatement 语句,从数据库来的值后面的 *** 作是 “值 *** 作” ,而不是字符串替换,只有argument 或者sequence *** 作当作参数才是字符串替换 (这一点官方FAQ也有提到)
using System;
using System Data;
using System Configuration;
using System Web;
using System Web Security;
using System Web UI;
using System Web UI WebControls;
using System Web UI WebControls WebParts;
using System Web UI HtmlControls;
public partial class _Default : Page
{
protected void Page_Load(object sender EventArgs e)
{
}
#region OnPreInit 第一步
protected override void OnPreInit(EventArgs e)
{
//检查 IsPostBack 属性来确定是不是第一次处理该页
//创建或重新创建动态控件
//动态设置主控页
//动态设置 Theme 属性
//读取或设置配置文件属性值
//注意
//如果请求是回发请求 则控件的值尚未从视图状态还原 如果在此阶段设置控件属性 则其值可能会在下一事件中被重写
base OnPreInit(e);
}
#endregion
#region OnInit 第二步
protected override void OnInit(EventArgs e)
{
//在所有控件都已初始化且已应用所有外观设置后引发 使用该事件来读取或初始化控件属性
base OnInit(e);
}
#endregion
#region OnInitComplete 第三步
protected override void OnInitComplete(EventArgs e)
{
//由 Page 对象引发 使用该事件来处理要求先完成所有初始化工作的任务
base OnInitComplete(e);
}
#endregion
#region PreLoad 第四步
protected override void OnPreLoad(EventArgs e)
{
//如果需要在 Load 事件之前对页或控件执行处理 请使用该事件
//在 Page 引发该事件后 它会为自身和所有控件加载视图状态 然后会处理 Request 实例包括的任何回发数据
base OnPreLoad(e);
}
#endregion
#region OnLoad 第五步
protected override void OnLoad(EventArgs e)
{
//Page 在 Page 上调用 OnLoad 事件方法 然后以递归方式对每个子控件执行相同 *** 作 如此循环往复 直到加载完本页和所有控件为止
//使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接
base OnLoad(e);
}
#endregion
#region 控件事件 第六步
protected void Button _Click(object sender EventArgs e)
{
//用这些事件来处理特定控件事件 如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件
//注意
//在回发请求中 如果页包含验证程序控件 请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性
}
#endregion
#region OnLoadComplete 第七步
protected override void OnLoadComplete(EventArgs e)
{
//对需要加载页上的所有其他控件的任务使用该事件
base OnLoadComplete(e);
}
#endregion
#region OnPreRender 第八步
protected override void OnPreRender(EventArgs e)
{
//在该事件发生前
//Page 对象会针对每个控件和页调用 EnsureChildControls
//设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法 有关更多信息 请参见下面的数据绑定控件的数据绑定事件
//页上的每个控件都会发生 PreRender 事件 使用该事件对页或其控件的内容进行最后更改
base OnPreRender(e);
}
#endregion
#region SaveStateComplete 第九步
protected override void OnSaveStateComplete(EventArgs e)
{
//在该事件发生前 已针对页和所有控件保存了 ViewState 将忽略此时对页或控件进行的任何更改
//使用该事件执行满足以下条件的任务 要求已经保存了视图状态 但未对控件进行任何更改
base OnSaveStateComplete(e);
}
#endregion
#region Render 第十步
//Render
//这不是事件 在处理的这个阶段 Page 对象会在每个控件上调用此方法 所有 ASP NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法
//如果创建自定义控件 通常要重写此方法以输出控件的标记 不过 如果自定义控件只合并标准的 ASP NET Web 服务器控件 不合并自定义标记 则不需要重写 Render 方法 有关更多信息 请参见开发自定义 ASP NET 服务器控件
//用户控件( ascx 文件)自动合并呈现 因此不需要在代码中显式呈现该控件
#endregion
#region OnUnload 第十一步
protected override void OnUnload(EventArgs e)
{
//该事件首先针对每个控件发生 继而针对该页发生 在控件中 使用该事件对特定控件执行最后清理 如关闭控件特定数据库连接
//对于页自身 使用该事件来执行最后清理工作 如 关闭打开的文件和数据库连接 或完成日志记录或其他请求特定任务
//注意
//在卸载阶段 页及其控件已被呈现 因此无法对响应流做进一步更改 如果尝试调用方法(如 Response Write 方法) 则该页将引发异常
base OnUnload(e);
}
#endregion
}
当页面进行回发时 如点击按钮 以上事件都会重新执行一次 这时的执行顺序为
OnPreInit
OnInit
OnInitComplete
OnPreLoad
Page_Load
OnLoad
Button_Click
OnLoadComplete
OnPreRender
可以看到 Button_Click事件位于OnLoad之后执行 可以测试一下
public partial class TestControls : System Web UI Page
{
static int count = ;
protected void Page_Load(object sender EventArgs e)
{
Response Write(count+ Page_Load <br /> );
count++;
}
protected override void OnPreInit(EventArgs e)
{
base OnPreInit(e);
Response Write(count + OnPreInit <br /> );
count++;
}
protected override void OnInit(EventArgs e)
{
base OnInit(e);
Response Write(count + OnInit <br /> );
count++;
}
protected override void OnLoad(EventArgs e)
{
base OnLoad(e);
Response Write(count + OnLoad <br /> );
count++;
}
protected override void OnPreLoad(EventArgs e)
{
base OnPreLoad(e);
Response Write(count + OnPreLoad <br /> );
count++;
}
protected override void OnLoadComplete(EventArgs e)
{
base OnLoadComplete(e);
Response Write(count + OnLoadComplete <br /> );
count++;
}
protected override void OnInitComplete(EventArgs e)
{
base OnInitComplete(e);
Response Write(count + OnInitComplete <br /> );
count++;
}
protected override void OnUnload(EventArgs e)
{
base OnUnload(e);
}
protected override void OnDataBinding(EventArgs e)
{
base OnDataBinding(e);
Response Write(count + OnDataBinding <br /> );
count++;
}
protected override void OnPreRender(EventArgs e)
{
base OnPreRender(e);
Response Write(count + OnPreRender <br /> );
count++;
}
protected void btnGraphics_Click(object sender EventArgs e)
{
//Bitmap bmp = new Bitmap( );
//Graphics g = Graphics FromImage(bmp);
Response Write(count + btnGraphics_Click <br /> );
count++;
}
lishixinzhi/Article/program/net/201311/12283
以上就是关于在数据库中检索jsp画面输入内容,如果有与数据库内容相同的,则在画面上显示的jsp跟java怎么写全部的内容,包括:在数据库中检索jsp画面输入内容,如果有与数据库内容相同的,则在画面上显示的jsp跟java怎么写、请问数据库多表内连接顺序是怎样的、java怎么和数据库连接等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)