`
jdlsfl
  • 浏览: 159825 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java操作SQL数据库[查询,更新,存储过程,类型对照]

阅读更多

Java操作SQL数据库[查询,更新,存储过程,类型对照]

 

一,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]

  );

  例如:Cteate 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初始化连接池

相关推荐

    SQL Server数据库与Java类型对照.doc

    ### SQL Server 数据库与 Java 类型对照 在进行数据库开发时,尤其是在使用 SQL Server 作为后端数据库并与 Java 应用程序进行交互时,了解 SQL Server 的数据类型与 Java 数据类型的对应关系非常重要。这种对应...

    Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表

    这里,我们提到了一个名为“Hibernate的映射类型_hibernate_mysql映射类型.doc”的文档,这很可能是一个详细的对照表,列出了Hibernate如何将Java数据类型映射到MySQL数据库的SQL数据类型。MySQL是世界上最流行的...

    java英汉互译电子词典(完整版含数据库)

    5. **数据持久化**:由于数据库存储在本地,用户可以自由移动数据库文件到任何喜欢的位置,保证了数据的便携性。 6. **错误处理和异常管理**:良好的软件应该包含适当的错误处理机制,以确保在遇到问题时能够给出...

    java、mysql以及oracle数据类型对照表

    MySQL和Oracle的数据类型则针对存储和操作数据库中的各种数据类型进行了优化。 MySQL的数据类型包括数值类型(如INT、DECIMAL)、字符串类型(如VARCHAR、TEXT)、日期和时间类型(如DATE、TIMESTAMP)以及二进制...

    Hibernate 映射类型与Java 类型对照

    总的来说,理解Hibernate的映射类型与Java类型之间的对应关系,可以帮助开发者更准确地设计数据模型,从而更好地利用Hibernate进行数据库操作。在实际开发中,根据业务需求选择合适的映射类型,可以提高数据处理的...

    MySql于Java数据类型对应列表

    在进行数据库操作时,尤其是在使用Java进行MySQL数据库开发的过程中,正确地映射数据类型是至关重要的一步。本文将详细介绍MySQL中的各种数据类型及其在Java中的对应类型,并解释这些类型的具体含义以及它们在实际...

    java_mysql_数据类型对照.doc

    9. **日期时间类型**(DATE、TIME、DATETIME、TIMESTAMP、YEAR):分别对应Java中的`java.sql.Date`、`java.sql.Time`、`java.sql.Timestamp`,JDBC类型分别为91、92、93,用于存储日期、时间或两者结合的信息。...

    存储过程db2存储过程

    为了提高性能并减少网络流量,可以将复杂的数据库操作封装为**存储过程**,并将其部署在数据库服务器上。存储过程可以在服务器端直接执行多条SQL语句,减少网络传输次数,显著提升应用程序的响应速度和整体性能。 #...

    hibernate使用中与各种数据库字段类型对应类型训练

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需过多关注SQL语句的编写。本篇将主要围绕Hibernate在与各种数据库字段类型对应的Java类型进行...

    Java数据类型与MySql数据类型对照表

    理解这些对照关系有助于在Java应用程序中高效地操作MySQL数据库。合理选用数据类型可以提高数据存储的效率,减少存储开销,同时确保数据的正确性和完整性。在进行数据库设计时,开发者应结合业务需求,综合考虑各种...

    sql servlet2005课本习题参考答案

    1. 数据库引擎:负责数据的存储、检索和更新,支持T-SQL语言。 2. Analysis Services:提供多维数据处理和商业智能功能。 3. Reporting Services:用于创建和分发各种类型的报表。 4. Integration Services:用于...

    oracle concepts手册(中英文对照)

    SQL用于数据库查询和更新,PL/SQL是Oracle的过程式语言,用于编写复杂的业务逻辑。Java则通过JDBC与Oracle数据库进行交互。应用程序开发语言概述章节将提供这些语言的综合介绍,原生数据类型章节则涉及到这些语言中...

    Oracle concept 11g 中英文对照

    数据库存储结构包括数据文件、控制文件、日志文件等,而数据库实例结构则包括系统全局区(SGA)和服务器进程。 应用程序和网络体系结构是指Oracle数据库支持各种应用和网络协议,允许用户通过网络进行数据交互。文档...

    Oracle可视化工具(日文)

    1. 数据库对象浏览:用户可以通过树状结构查看数据库中的表、视图、索引、存储过程、函数、触发器等对象,便于理解和管理数据库结构。 2. SQL编辑与执行:内置的SQL编辑器支持编写复杂的SQL查询,提供自动补全功能...

    Java+mysql+swing电影购票系统视频教程+源码+截图+数据库文件

    在这个购票系统中,Swing被用来设计和实现用户友好的界面,如购票界面、查询界面、用户登录注册界面等,使得用户可以通过图形化的方式进行操作。 4. **软件/插件**:在开发过程中,可能需要使用到诸如Eclipse或...

    Java 开发飞机订票系统(ppt+流程图+数据库+架构说明视频源码)

    开发者需要了解SQL语言,用于创建表、查询数据、更新和删除记录。此外,还需要熟悉PL/SQL进行存储过程和触发器的编写。 3. **数据库设计**:资源中提到了ER图(实体关系图),这是在数据库设计阶段用来表示实体及其...

    Oracle 11g Concepts中英文对照.pdf

    Oracle 数据库体系结构是指 Oracle 数据库的物理结构,包括数据库、实例、数据库存储结构、数据库实例结构和应用程序及网络体系结构等。 Oracle 数据库文档路线图 Oracle 数据库文档路线图是指 Oracle 数据库的文档...

    java_ssm_tb_vaccine对照编码【登记系统】

    【描述】虽然描述简单,但我们可以推断出该项目的核心功能可能包括疫苗信息的录入、查询、管理和更新,以及用户(如医护人员或管理员)的登记操作。"对照编码"可能指的是疫苗批次号、厂家编码等,用于确保疫苗的可...

    Oracle_11gR2_概念 高清PDF 中英文对照

    理解这些概念有助于优化数据库存储和管理,例如,通过合理分配表空间和段来提高查询效率。 4. **索引和索引组织表**(第3章):索引是加速查询的重要工具,11gR2提供了B树、位图、函数索引等多种类型的索引。索引...

    基于Java swing带GUI界面的房产中介管理系统(源码+数据库+文档).zip

    这是一个基于Java Swing技术开发的房产中介管理系统的完整项目,包含了源代码、数据库设计、文档以及相关的项目进度计划。系统的主要目标是提供一个图形用户界面(GUI),方便房产中介进行房源信息管理、客户管理...

Global site tag (gtag.js) - Google Analytics