java与.net的数据库沟通之比较

  (java)传送给数据库的 SQL 语句通过一个包含两个步骤的过程来返回结果。首先准备它们,然后处理它们。借助 Statement 对象,这两个阶段对应用程序而言变成一个阶段。PreparedStatement 允许将这两个步骤分开。准备步骤在创建对象时发生,而处理步骤在对 PreparedStatement 对象调用 executeQueryexecuteUpdate execute 方法时发生。
如果不添加参数标记,能够将 SQL 处理分割成单独的阶段并没有意义。参数标记放在应用程序中,从而使它能够告诉数据库它在准备时并不具有特定的值,但它在处理之前提供一个值。在 SQL 语句中,参数标记是使用问号表示的。
通过使用参数标记,有可能创建用于特定请求的一般 SQL 语句。例如,给定以下 SQL 查询语句:

     SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = 'DETTINGER'这是一个特定的 SQL 语句,它只返回一个值;即关于名为 Dettinger 的雇员的信息。通过添加参数标记,可以使语句更为灵活:

     SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?通过简单地将参数标记设置为某个值,可以获取关于表中的任何雇员的信息。

由于前一个 Statement 示例可以只经过一次准备阶段并接着使用不同的参数值来重复地进行处理,所以 PreparedStatement 能够提供比 Statement 更高的性能。

注意:要支持本机 JDBC 驱动程序的语句合用,必须使用 PreparedStatement

prepareStatement 方法用来创建新的 PreparedStatement 对象。与 createStatement 方法不同,创建 PreparedStatement 对象时必须提供 SQL 语句。在那个时候,对 SQL 语句进行预编译以供使用。例如,假定已存在名为 conn Connection 对象,以下示例将创建 PreparedStatement 对象并准备要在数据库中处理的 SQL 语句。

     PreparedStatement ps = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE

 WHERE LASTNAME = ?"); createStatement 方法相同,重载 prepareStatement 方法的目的是提供对指定 ResultSet 特征的支持。prepareStatement 方法还具有变体,可使用自动生成的键。以下是有效 prepareStatement 方法调用的一些示例:

示例:prepareStatement 方法

注意:请阅读代码示例不保证声明以了解重要的法律信息。

     // New in JDBC 2.
PreparedStatement ps2 = conn.prepareStatement("SELECT * FROM

         EMPLOYEE_TABLE WHERE LASTNAME = ?",

     ResultSet.TYPE_SCROLL_INSENSITIVE,

     ResultSet.CONCUR_UPDATEABLE);

     // New in JDBC 3.0

     PreparedStatement ps3 = conn.prepareStatement("SELECT * FROM

         EMPLOYEE_TABLE WHERE LASTNAME = ?",

         ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE,

         ResultSet.HOLD_CURSOR_OVER_COMMIT);

     PreparedStatement ps4 = conn.prepareStatement("SELECT * FROM

         EMPLOYEE_TABLE WHERE LASTNAME = ?", Statement.RETURN_GENERATED_KEYS);在可以处理 PreparedStatement 对象之前,必须将每个参数标记设置为一些值。PreparedStatement 对象提供了许多个用于设置参数的方法。所有这些方法的格式均为 set<Type>,其中 <Type> Java 数据类型。这些方法的一些示例包括 setIntsetLongsetStringsetTimestampsetNull setBlob。几乎所有这些方法都有两个参数:

第一个参数是该参数在语句中的索引。参数标记具有从 1 开始的编号。

第二个参数是要对第一个参数设置的值。有几个 set<Type> 方法具有附加的参数,如 setBinaryStream 上的长度参数。

有关更多信息,请查阅 java.sql 包的 Javadoc。通过对 ps 给出在先前示例中准备的 SQL 语句,以下代码说明了如何在处理之前指定参数值:

ps.setString(1,'Dettinger');如果尝试处理带有尚未设置的参数标记的 PreparedStatement,则将抛出 SQLException

注意:在设置参数标记之后,除非发生下列情况,否则参数标记将保持具有同一个值。

另一个 set 方法调用更改了该值。

调用 clearParameters 方法时除去了该值。

clearParameters 方法将所有参数都标记为尚未设置。在进行 clearParameters 调用之后,在执行下一个过程之前,必须再次对所有参数调用 set 方法。

新的 ParameterMetaData 接口允许检索关于参数的信息。此支持与 ResultSetMetaData 相符并且类似。提供了全面的诸如精度、标度、数据类型、数据类型名以及该参数是否允许空值之类的信息。

public class Sql_db {

Connection con;

Statement sta;

ResultSet rs;

String sql_driver;

String sql_url;

String user;

String pwd;

 public Sql_db() {

sql_driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";//驱动

sql_url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=luntan";//语句一,其中manage是要访问的数据库名

user="sa";//你要访问的数据库用户名

pwd="cug";//访问数据库的密

init();

 }

 public void init() {

 try{

 Class.forName(sql_driver);//加载驱动

 System.out.println("driver is ok");

 con=DriverManager.getConnection(sql_url,user,pwd);

 System.out.println("connection is ok");

 sta=con.createStatement();

 rs=sta.executeQuery("select top 2* from news");//executeQuery

 while(rs.next())

 System.out.println(rs.getString("title"));

 }catch (Exception e) {

 e.printStackTrace();//printStackTrace();

 }

}

 public static void main(String[] args) {

    Sql_db sql_db = new Sql_db();

    sql_db.init();

 }

}

如果是preparedStatement则用

public void save_comment(CommentForm commentform) {

              Connection conn = null;

              PreparedStatement stmt = null;

              try {

                     conn = new DBConnection().getConnection();

                     String sql="insert into comment (title,content,article_id,user_id,comment_date) values (?,?,?,?,now())";

                     stmt = conn.prepareStatement(sql);

                     stmt.setString(1, commentform.getTitle());

                     stmt.setString(2, commentform.getContent());

                     stmt.setInt(3, commentform.getArticleId());

                     stmt.setInt(4, commentform.getUserId());

                     stmt.executeUpdate();

              } catch (SQLException err) {

                     err.printStackTrace();

              } finally {

                     if (stmt != null) {

                            try {

                                   stmt.close();

                            } catch (Exception err) {

                                   err.printStackTrace();

                            }

                     }

                     if (conn != null) {

                            try {

                                   conn.close();

                            } catch (Exception err) {

                                   err.printStackTrace();

                            }

                     }

              }

       }

The updater methods may be used in two ways:

to update a column value in the current row. In a scrollable ResultSet object, the cursor can be moved backwards and forwards, to an absolute position, or to a position relative to the current row. The following code fragment updates the NAME column in the fifth row of the ResultSet object rs and then uses the method updateRow to update the data source table from which rs was derived.

       rs.absolute(5); // moves the cursor to the fifth row of rs

       rs.updateString("NAME", "AINSWORTH"); // updates the

          // NAME column of row 5 to be AINSWORTH

       rs.updateRow(); // updates the row in the data source

to insert column values into the insert row. An updatable ResultSet object has a special row associated with it that serves as a staging area for building a row to be inserted. The following code fragment moves the cursor to the insert row, builds a three-column row, and inserts it into rs and into the data source table using the method insertRow.

       rs.moveToInsertRow(); // moves cursor to the insert row

       rs.updateString(1, "AINSWORTH"); // updates the

          // first column of the insert row to be AINSWORTH

       rs.updateInt(2,35); // updates the second column to be 35

       rs.updateBoolean(3, true); // updates the third row to true

       rs.insertRow();

       rs.moveToCurrentRow();

jdbc元数据入门-2(ResultSetMetaData,ParameterMetaData)

上次文章的知识是通过jdbc元数据可以获取连接的数据库的信息,结合本节的知识就可以完全作出一个自定义的持久层实现了。

首先看示例:

public class Test {

    public static void main(String[] args) throws Exception {

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

        String connectionUrl = "jdbc:sqlserver://127.0.0.1:1433;database=Northwind;user=sa;password=huhuiyu";

        Connection connection = DriverManager.getConnection(connectionUrl);

        // 建立查询

        Statement statement = connection.createStatement();

        String sql = "select EmployeeID as ''员工编号'',Title as ''头衔'' ,BirthDate as ''生日'' from Employees";

        ResultSet rs = statement.executeQuery(sql);

        // 获取查询的元数据

        ResultSetMetaData meta = rs.getMetaData();

        int cols = meta.getColumnCount(); // 获取查询结果的列数

        for (int i = 1; i <= cols; i++) {

            System.out.print(String.format("%1$s的信息--", i));

            System.out.print(String.format("名称:%1$s,", meta.getColumnName(i)));

            System.out.print(String.format("java类型名称:%1$s,", meta    .getColumnClassName(i)));

            System.out.print(String.format("sql类型名称:%1$s,", meta.getColumnTypeName(i)));

            System.out.print(String.format("显示需要的最大长度:%1$s,", meta    .getColumnDisplaySize(i)));

            System.out.println();

        }

        // 关闭连接

        rs.close();

       statement.close();

        connection.close();

    }

}

数据库还是连接的Sql Server.ton通过元数据(ResultSetMetaData)可以很方便的获取出查询结果列的详细信息.

而且离线数据集(RowSet,前面的文章中说过它的使用)也是完全实现了ResultSet的所有方法,所以所有ResultSet能够完成的功能,RowSet

可过做到,配合上次文章的知识可以将一个数据库中所有的表,以及表中所有的列信息全部查询出来。只要查询语句写成:

SELECT * FROM 表名称 WHERE 1=2 就可以了。

最后给出预处理语句(PreparedStatement)的元数据信息的代码,作为jdbc元数据的结束。

PreparedStatement ps=connection.prepareStatement(

                "select EmployeeID,Title from Employees where EmployeeID < ? and Title like ?");

ParameterMetaData meta=ps.getParameterMetaData();

int cols = meta.getParameterCount(); // 获取预编译语句的参数个数

for (int i = 1; i <= cols; i++) {

    System.out.print(String.format("预编译参数%1$s的信息--", i));

    System.out.print(String.format("java数据类型:%1$s,", meta.getParameterClassName(i)));

    System.out.print(String.format("sql数据类型:%1$s", meta.getParameterTypeName(i)));

    System.out.println();

}

希望对大家熟悉jdbc元数据起到一些作用。

.net中通过数据适配器来协调数据库通讯: 
/// <summary>
        /// 所有的新闻类别查询
        /// </summary>
        public static DataSet news_typeshow()
        {
            SqlConnection conn = sqlconnect();
            SqlDataAdapter sda = new SqlDataAdapter();
            DataSet ds = new DataSet();
            string cmdtext = "select * from news_type";
            try
            {
                conn.Open();
                sda.SelectCommand = new SqlCommand(cmdtext, conn);
                sda.Fill(ds);
            }
            catch (Exception ex)
            {
                Debug.Fail(ex.Message);

            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return ds;
        }
 public static bool bol(int typeid, string title, string content, string author)
        {
            bool bol1 = false;
            SqlConnection con = sqlconnect();
            con.Open();
            try
            {
                SqlCommand cmd = new SqlCommand("insert_news", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@typeid", typeid));
                cmd.Parameters.Add(new SqlParameter("@title", title));
                cmd.Parameters.Add(new SqlParameter("@content", content));
                cmd.Parameters.Add(new SqlParameter("@author", author));
                int count = Convert.ToInt32(cmd.ExecuteNonQuery());
                if (count > 0)
                {
                    bol1 = true;
                }
                else
                {
                    bol1 = false;
                }
            }
            catch (Exception ex)
            {
                Debug.Fail(ex.Message);
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                    con.Close();
            }
            return bol1;
        }

posted on 2008-04-23 14:58  小顾问  阅读(853)  评论(0)    收藏  举报