﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-记忆好很大程度决定能力!-文章分类-Database</title><link>http://www.blogjava.net/microlab4321/category/24888.html</link><description>适时总结是一种很好的彌补方法!</description><language>zh-cn</language><lastBuildDate>Thu, 06 Sep 2007 03:22:47 GMT</lastBuildDate><pubDate>Thu, 06 Sep 2007 03:22:47 GMT</pubDate><ttl>60</ttl><item><title>(摘)使用变参执行SQL语句 </title><link>http://www.blogjava.net/microlab4321/articles/142925.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Wed, 05 Sep 2007 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/142925.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/142925.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/142925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/142925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/142925.html</trackback:ping><description><![CDATA[<div class="postText">原文出处:http://www.blogjava.net/mlh123caoer/archive/2007/09/05/142885.html<br />
当你需要多次执行相同的SQL语句（一般情况下是update）但是使用不同的参数值时 ，可以使用<br />
<span class="pf">PrepareStatement</span>方法，举例如下：
<pre><code><br />
Connection conn=null;<br />
PreparedStatement pst=null;<br />
String[] nm=new String[3];<br />
int[] nc=new int[3];<br />
...<br />
try {<br />
nm[0]="Costescu",nm[1]="Alexandrescu",nm[2]="Popovici";<br />
nc[0]=234423;nc[1]=123344;nc[2]=534562;<br />
<br />
pst=conn.prepareStatement("UPDATE Table1 SET Nume=? WHERE Nr_cont=?");<br />
for(int i=0;i&lt;=2;i++)<br />
{<br />
pst.setString(1,nm[i]);<br />
pst.setInt(2,nc[i]);<br />
pst.executeUpdate();<br />
}<br />
}catch (SQLException e){System.out.println(e.getMessage());}<br />
...<br />
</code></pre>
</div>
<img src ="http://www.blogjava.net/microlab4321/aggbug/142925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-05 16:19 <a href="http://www.blogjava.net/microlab4321/articles/142925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JAVA中的动态代理实现数据库连接池 </title><link>http://www.blogjava.net/microlab4321/articles/142385.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 03 Sep 2007 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/142385.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/142385.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/142385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/142385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/142385.html</trackback:ping><description><![CDATA[附：其实，很多时候，原理大家也都很清楚，但是很多人就是懒的总结出来，我就是一个例子，看到这篇文章后，转载于此，一是学习，二是鞭策。下面是原文。<br />
<br />
原文引自：<a href="http://www-128.ibm.com/developerworks/cn/java/l-connpoolproxy/">http://www-128.ibm.com/developerworks/cn/java/l-connpoolproxy/</a><br />
<br />
<br />
<br />
<blockquote>作者通过使用JAVA中的动态代理实现数据库连接池，使使用者可以以普通的jdbc连接的使用习惯来使用连接池。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p>数据库连接池在编写应用服务是经常需要用到的模块，太过频繁的连接数据库对服务性能来讲是一个瓶颈，使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序，但是都发现这样一个共同的问题：这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库的连接，这一点我们可以理解，毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是，它们同时不允许使用者显式的调用Connection.close()方法，而需要用其规定的一个方法来关闭连接。这种做法有两个缺点：</p>
<p>第一：改变了用户使用习惯，增加了用户的使用难度。</p>
<p>首先我们来看看一个正常的数据库操作过程：</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">int executeSQL(String sql) throws SQLException
            {
            Connection conn = getConnection();	//通过某种方式获取数据库连接
            PreparedStatement ps = null;
            int res = 0;
            try{
            ps = conn.prepareStatement(sql);
            res = ps.executeUpdate();
            }finally{
            try{
            ps.close();
            }catch(Exception e){}
            try{
            conn.close();//
            }catch(Exception e){}
            }
            return res;
            }
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资源，如果用我们前面提到的连接池的实现方法，那语句conn.close()将被某些特定的语句所替代。</p>
<p>第二：使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法，一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接，那么连接池将无法正常维护所有连接的状态，考虑连接池和应用由不同开发人员实现时这种问题更容易出现。</p>
<p>综合上面提到的两个问题，我们来讨论一下如何解决这两个要命的问题。</p>
<p>首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接，同时这个连接的类型应该是标准的java.sql.Connection。用户在获取到这个数据库连接后可以对这个连接进行任意的操作，包括关闭连接等。</p>
<p>通过对用户使用的描述，怎样可以接管Connection.close方法就成了我们这篇文章的主题。</p>
<p>为了接管数据库连接的close方法，我们应该有一种类似于钩子的机制。例如在Windows编程中我们可以利用Hook API来实现对某个Windows API的接管。在JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个InvocationHandler，这两个类都在java.lang.reflect包中。我们先来看看SUN公司提供的文档是怎么描述这两个类的。</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">public interface InvocationHandler
            InvocationHandler is the interface implemented by the invocation handler of a proxy instance.
            Each proxy instance has an associated invocation handler.
            When a method is invoked on a proxy instance,
            the method invocation is encoded and dispatched to the invoke method of its invocation handler.
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>SUN的API文档中关于Proxy的描述很多，这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法，而对一般的类无效，考虑到java.sql.Connection本身也是一个接口由此就找到了解决如何接管close方法的出路。</p>
<p>首先，我们先定义一个数据库连接池参数的类，定义了数据库的JDBC驱动程序类名，连接的URL以及用户名口令等等一些信息，该类是用于初始化连接池的参数，具体定义如下：</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">public class ConnectionParam implements Serializable
            {
            private String driver;				//数据库驱动程序
            private String url;					//数据连接的URL
            private String user;					//数据库用户名
            private String password;				//数据库密码
            private int minConnection = 0;		//初始化连接数
            private int maxConnection = 50;		//最大连接数
            private long timeoutValue = 600000;//连接的最大空闲时间
            private long waitTime = 30000;		//取连接的时候如果没有可用连接最大的等待时间
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>其次是连接池的工厂类ConnectionFactory，通过该类来将一个连接池对象与一个名称对应起来，使用者通过该名称就可以获取指定的连接池对象，具体代码如下：</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">/**
            * 连接池类厂，该类常用来保存多个数据源名称合数据库连接池对应的哈希
            * @author liusoft
            */
            public class ConnectionFactory
            {
            //该哈希表用来保存数据源名和连接池对象的关系表
            static Hashtable connectionPools = null;
            static{
            connectionPools = new Hashtable(2,0.75F);
            }
            /**
            * 从连接池工厂中获取指定名称对应的连接池对象
            * @param dataSource	连接池对象对应的名称
            * @return DataSource	返回名称对应的连接池对象
            * @throws NameNotFoundException	无法找到指定的连接池
            */
            public static DataSource lookup(String dataSource)
            throws NameNotFoundException
            {
            Object ds = null;
            ds = connectionPools.get(dataSource);
            if(ds == null || !(ds instanceof DataSource))
            throw new NameNotFoundException(dataSource);
            return (DataSource)ds;
            }
            /**
            * 将指定的名字和数据库连接配置绑定在一起并初始化数据库连接池
            * @param name		对应连接池的名称
            * @param param	连接池的配置参数，具体请见类ConnectionParam
            * @return DataSource	如果绑定成功后返回连接池对象
            * @throws NameAlreadyBoundException	一定名字name已经绑定则抛出该异常
            * @throws ClassNotFoundException		无法找到连接池的配置中的驱动程序类
            * @throws IllegalAccessException		连接池配置中的驱动程序类有误
            * @throws InstantiationException		无法实例化驱动程序类
            * @throws SQLException				无法正常连接指定的数据库
            */
            public static DataSource bind(String name, ConnectionParam param)
            throws NameAlreadyBoundException,ClassNotFoundException,
            IllegalAccessException,InstantiationException,SQLException
            {
            DataSourceImpl source = null;
            try{
            lookup(name);
            throw new NameAlreadyBoundException(name);
            }catch(NameNotFoundException e){
            source = new DataSourceImpl(param);
            source.initConnection();
            connectionPools.put(name, source);
            }
            return source;
            }
            /**
            * 重新绑定数据库连接池
            * @param name		对应连接池的名称
            * @param param	连接池的配置参数，具体请见类ConnectionParam
            * @return DataSource	如果绑定成功后返回连接池对象
            * @throws NameAlreadyBoundException	一定名字name已经绑定则抛出该异常
            * @throws ClassNotFoundException		无法找到连接池的配置中的驱动程序类
            * @throws IllegalAccessException		连接池配置中的驱动程序类有误
            * @throws InstantiationException		无法实例化驱动程序类
            * @throws SQLException				无法正常连接指定的数据库
            */
            public static DataSource rebind(String name, ConnectionParam param)
            throws NameAlreadyBoundException,ClassNotFoundException,
            IllegalAccessException,InstantiationException,SQLException
            {
            try{
            unbind(name);
            }catch(Exception e){}
            return bind(name, param);
            }
            /**
            * 删除一个数据库连接池对象
            * @param name
            * @throws NameNotFoundException
            */
            public static void unbind(String name) throws NameNotFoundException
            {
            DataSource dataSource = lookup(name);
            if(dataSource instanceof DataSourceImpl){
            DataSourceImpl dsi = (DataSourceImpl)dataSource;
            try{
            dsi.stop();
            dsi.close();
            }catch(Exception e){
            }finally{
            dsi = null;
            }
            }
            connectionPools.remove(name);
            }
            }
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>ConnectionFactory主要提供了用户将将连接池绑定到一个具体的名称上以及取消绑定的操作。使用者只需要关心这两个类即可使用数据库连接池的功能。下面我们给出一段如何使用连接池的代码：</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">	String name = "pool";
            String driver = " sun.jdbc.odbc.JdbcOdbcDriver ";
            String url = "jdbc:odbc:datasource";
            ConnectionParam param = new ConnectionParam(driver,url,null,null);
            param.setMinConnection(1);
            param.setMaxConnection(5);
            param.setTimeoutValue(20000);
            ConnectionFactory.bind(name, param);
            System.out.println("bind datasource ok.");
            //以上代码是用来登记一个连接池对象，该操作可以在程序初始化只做一次即可
            //以下开始就是使用者真正需要写的代码
            DataSource ds = ConnectionFactory.lookup(name);
            try{
            for(int i=0;i&lt;10;i++){
            Connection conn = ds.getConnection();
            try{
            testSQL(conn, sql);
            }finally{
            try{
            conn.close();
            }catch(Exception e){}
            }
            }
            }catch(Exception e){
            e.printStackTrace();
            }finally{
            ConnectionFactory.unbind(name);
            System.out.println("unbind datasource ok.");
            System.exit(0);
            }
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>从使用者的示例代码就可以看出，我们已经解决了常规连接池产生的两个问题。但是我们最最关心的是如何解决接管close方法的办法。接管工作主要在ConnectionFactory中的两句代码：</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">source = new DataSourceImpl(param);
            source.initConnection();
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>DataSourceImpl是一个实现了接口javax.sql.DataSource的类，该类维护着一个连接池的对象。由于该类是一个受保护的类，因此它暴露给使用者的方法只有接口DataSource中定义的方法，其他的所有方法对使用者来说都是不可视的。我们先来关心用户可访问的一个方法getConnection</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">/**
            * @see javax.sql.DataSource#getConnection(String,String)
            */
            public Connection getConnection(String user, String password) throws SQLException
            {
            //首先从连接池中找出空闲的对象
            Connection conn = getFreeConnection(0);
            if(conn == null){
            //判断是否超过最大连接数,如果超过最大连接数
            //则等待一定时间查看是否有空闲连接,否则抛出异常告诉用户无可用连接
            if(getConnectionCount() &gt;= connParam.getMaxConnection())
            conn = getFreeConnection(connParam.getWaitTime());
            else{//没有超过连接数，重新获取一个数据库的连接
            connParam.setUser(user);
            connParam.setPassword(password);
            Connection conn2 = DriverManager.getConnection(connParam.getUrl(),
            user, password);
            //代理将要返回的连接对象
            _Connection _conn = new _Connection(conn2,true);
            synchronized(conns){
            conns.add(_conn);
            }
            conn = _conn.getConnection();
            }
            }
            return conn;
            }
            /**
            * 从连接池中取一个空闲的连接
            * @param nTimeout	如果该参数值为0则没有连接时只是返回一个null
            * 否则的话等待nTimeout毫秒看是否还有空闲连接，如果没有抛出异常
            * @return Connection
            * @throws SQLException
            */
            protected synchronized Connection getFreeConnection(long nTimeout)
            throws SQLException
            {
            Connection conn = null;
            Iterator iter = conns.iterator();
            while(iter.hasNext()){
            _Connection _conn = (_Connection)iter.next();
            if(!_conn.isInUse()){
            conn = _conn.getConnection();
            _conn.setInUse(true);
            break;
            }
            }
            if(conn == null &amp;&amp; nTimeout &gt; 0){
            //等待nTimeout毫秒以便看是否有空闲连接
            try{
            Thread.sleep(nTimeout);
            }catch(Exception e){}
            conn = getFreeConnection(0);
            if(conn == null)
            throw new SQLException("没有可用的数据库连接");
            }
            return conn;
            }
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>DataSourceImpl类中实现getConnection方法的跟正常的数据库连接池的逻辑是一致的，首先判断是否有空闲的连接，如果没有的话判断连接数是否已经超过最大连接数等等的一些逻辑。但是有一点不同的是通过DriverManager得到的数据库连接并不是及时返回的，而是通过一个叫_Connection的类中介一下，然后调用_Connection.getConnection返回的。如果我们没有通过一个中介也就是JAVA中的Proxy来接管要返回的接口对象，那么我们就没有办法截住Connection.close方法。</p>
<p>终于到了核心所在，我们先来看看_Connection是如何实现的，然后再介绍是客户端调用Connection.close方法时走的是怎样一个流程，为什么并没有真正的关闭连接。</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">/**
            * 数据连接的自封装，屏蔽了close方法
            * @author Liudong
            */
            class _Connection implements InvocationHandler
            {
            private final static String CLOSE_METHOD_NAME = "close";
            private Connection conn = null;
            //数据库的忙状态
            private boolean inUse = false;
            //用户最后一次访问该连接方法的时间
            private long lastAccessTime = System.currentTimeMillis();
            _Connection(Connection conn, boolean inUse){
            this.conn = conn;
            this.inUse = inUse;
            }
            /**
            * Returns the conn.
            * @return Connection
            */
            public Connection getConnection() {
            //返回数据库连接conn的接管类，以便截住close方法
            Connection conn2 = (Connection)Proxy.newProxyInstance(
            conn.getClass().getClassLoader(),
            conn.getClass().getInterfaces(),this);
            return conn2;
            }
            /**
            * 该方法真正的关闭了数据库的连接
            * @throws SQLException
            */
            void close() throws SQLException{
            //由于类属性conn是没有被接管的连接，因此一旦调用close方法后就直接关闭连接
            conn.close();
            }
            /**
            * Returns the inUse.
            * @return boolean
            */
            public boolean isInUse() {
            return inUse;
            }
            /**
            * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)
            */
            public Object invoke(Object proxy, Method m, Object[] args)
            throws Throwable
            {
            Object obj = null;
            //判断是否调用了close的方法，如果调用close方法则把连接置为无用状态
            if(CLOSE_METHOD_NAME.equals(m.getName()))
            setInUse(false);
            else
            obj = m.invoke(conn, args);
            //设置最后一次访问时间，以便及时清除超时的连接
            lastAccessTime = System.currentTimeMillis();
            return obj;
            }
            /**
            * Returns the lastAccessTime.
            * @return long
            */
            public long getLastAccessTime() {
            return lastAccessTime;
            }
            /**
            * Sets the inUse.
            * @param inUse The inUse to set
            */
            public void setInUse(boolean inUse) {
            this.inUse = inUse;
            }
            }
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>一旦使用者调用所得到连接的close方法，由于用户的连接对象是经过接管后的对象，因此JAVA虚拟机会首先调用_Connection.invoke方法，在该方法中首先判断是否为close方法，如果不是则将代码转给真正的没有被接管的连接对象conn。否则的话只是简单的将该连接的状态设置为可用。到此您可能就明白了整个接管的过程，但是同时也有一个疑问：这样的话是不是这些已建立的连接就始终没有办法真正关闭？答案是可以的。我们来看看ConnectionFactory.unbind方法，该方法首先找到名字对应的连接池对象，然后关闭该连接池中的所有连接并删除掉连接池。在DataSourceImpl类中定义了一个close方法用来关闭所有的连接，详细代码如下：</p>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td>
            <pre><code class="section"><font face="Lucida Console">	/**
            * 关闭该连接池中的所有数据库连接
            * @return int 返回被关闭连接的个数
            * @throws SQLException
            */
            public int close() throws SQLException
            {
            int cc = 0;
            SQLException excp = null;
            Iterator iter = conns.iterator();
            while(iter.hasNext()){
            try{
            ((_Connection)iter.next()).close();
            cc ++;
            }catch(Exception e){
            if(e instanceof SQLException)
            excp = (SQLException)e;
            }
            }
            if(excp != null)
            throw excp;
            return cc;
            }
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>该方法一一调用连接池中每个对象的close方法，这个close方法对应的是_Connection中对close的实现，在_Connection定义中关闭数据库连接的时候是直接调用没有经过接管的对象的关闭方法，因此该close方法真正的释放了数据库资源。</p>
<p>以上文字只是描述了接口方法的接管，具体一个实用的连接池模块还需要对空闲连接的监控并及时释放连接，详细的代码请参照附件。</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/142385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-03 17:12 <a href="http://www.blogjava.net/microlab4321/articles/142385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】六种异常处理的陋习 </title><link>http://www.blogjava.net/microlab4321/articles/137356.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Thu, 16 Aug 2007 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137356.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137356.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137356.html</trackback:ping><description><![CDATA[<p><font size=2>六种异常处理的陋习</font></p>
<p><font size=2>你觉得自己是一个Java专家吗？是否肯定自己已经全面掌握了Java的异常处理机制？在下面这段代码中，你能够迅速找出异常处理的六个问题吗？ <br><br></font></p>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td><font size=2>1 OutputStreamWriter out = ... <br>2 java.sql.Connection conn = ... <br>3 try { // ⑸ <br>4 　Statement stat = conn.createStatement(); <br>5 　ResultSet rs = stat.executeQuery( <br>6 　　"select uid, name from user"); <br>7 　while (rs.next()) <br>8 　{ <br>9 　　out.println("ID：" + rs.getString("uid") // ⑹ <br>10 　　　"，姓名：" + rs.getString("name")); <br>11 　} <br>12 　conn.close(); // ⑶ <br>13 　out.close(); <br>14 } <br>15 catch(Exception ex) // ⑵ <br>16 { <br>17 　ex.printStackTrace(); //⑴，⑷ <br>18 }</font></td>
        </tr>
    </tbody>
</table>
<p><br><font size=2>　　作为一个Java程序员，你至少应该能够找出两个问题。但是，如果你不能找出全部六个问题，请继续阅读本文。 <br><br>　　本文讨论的不是Java异常处理的一般性原则，因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为&#8220;反例&#8221;（anti-pattern）的违背优秀编码规范的常见坏习惯，帮助读者熟悉这些典型的反面例子，从而能够在实际工作中敏锐地察觉和避免这些问题。 <br><br>　　<strong>反例之一：丢弃异常 </strong><br><br>　　代码：15行-18行。 <br><br>　　这段代码捕获了异常却不作任何处理，可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看，它也许可以和C/C++程序的一个恶名远播的问题相提并论??不检查缓冲区是否已满。如果你看到了这种丢弃（而不是抛出）异常的情况，可以百分之九十九地肯定代码存在问题（在极少数情况下，这段代码有存在的理由，但最好加上完整的注释，以免引起别人误解）。 <br><br>　　这段代码的错误在于，异常（几乎）总是意味着某些事情不对劲了，或者说至少发生了某些不寻常的事情，我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上&#8220;处理异常&#8221;。不错，调用printStackTrace对调试程序有帮助，但程序调试阶段结束之后，printStackTrace就不应再在异常处理模块中担负主要责任了。 <br><br>　　丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档，可以看到下面这段说明：&#8220;特别地，虽然出现 ThreadDeath是一种&#8216;正常的情形&#8217;，但ThreadDeath类是Error而不是Exception的子类，因为许多应用会捕获所有的 Exception然后丢弃它不再理睬。&#8221;这段话的意思是，虽然ThreadDeath代表的是一种普通的问题，但鉴于许多应用会试图捕获所有异常然后不予以适当的处理，所以JDK把ThreadDeath定义成了Error的子类，因为Error类代表的是一般的应用不应该去捕获的严重问题。可见，丢弃异常这一坏习惯是如此常见，它甚至已经影响到了Java本身的设计。 <br><br>　　那么，应该怎样改正呢？主要有四个选择： <br><br>　　1、处理异常。针对该异常采取一些行动，例如修正问题、提醒某个人或进行其他一些处理，要根据具体的情形确定应该采取的动作。再次说明，调用printStackTrace算不上已经&#8220;处理好了异常&#8221;。 <br><br>　　2、重新抛出异常。处理异常的代码在分析异常之后，认为自己不能处理它，重新抛出异常也不失为一种选择。 <br><br>　　3、把该异常转换成另一种异常。大多数情况下，这是指把一个低级的异常转换成应用级的异常（其含义更容易被用户了解的异常）。 <br><br>　　4、不要捕获异常。 <br><br>　　结论一：既然捕获了异常，就要对它进行适当的处理。不要捕获异常之后又把它丢弃，不予理睬。 <br><br>　　<strong>反例之二：不指定具体的异常 </strong><br><br>　　代码：15行。 <br><br>　　许多时候人们会被这样一种&#8220;美妙的&#8221;想法吸引：用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exception ex)语句。但实际上，在绝大多数情况下，这种做法不值得提倡。为什么呢？ <br><br>　　要理解其原因，我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常，而且希望能够处理该异常。异常类的作用就是告诉 Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生，catch (Exception ex)就相当于说我们想要处理几乎所有的异常。 <br><br>　　再来看看前面的代码例子。我们真正想要捕获的异常是什么呢？最明显的一个是SQLException，这是JDBC操作中常见的异常。另一个可能的异常是IOException，因为它要操作 OutputStreamWriter。显然，在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获 SQLException和IOException就要好多了。这就是说，catch语句应当尽量指定具体的异常类型，而不应该指定涵盖范围太广的 Exception类。 <br><br>　　另一方面，除了这两个特定的异常，还有其他许多异常也可能出现。例如，如果由于某种原因， executeQuery返回了null，该怎么办？答案是让它们继续抛出，即不必捕获也不必处理。实际上，我们不能也不应该去捕获可能出现的所有异常，程序的其他地方还有捕获异常的机会??直至最后由JVM处理。 <br><br>　　结论二：在catch语句中尽可能指定具体的异常类型，必要时使用多个catch。不要试图处理所有可能出现的异常。 <br><br>　　<strong>反例之三：占用资源不释放 </strong><br><br>　　代码：3行-14行。 <br><br>　　异常改变了程序正常的执行流程。这个道理虽然简单，却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源，即使遇到了异常，也要正确释放占用的资源。为此，Java提供了一个简化这类操作的关键词finally。 <br><br>　　finally是样好东西：不管是否出现了异常，Finally保证在try/catch/finally块结束之前，执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally。 <br><br>　　当然，编写finally块应当多加小心，特别是要注意在finally块之内抛出的异常??这是执行清理任务的最后机会，尽量不要再有难以处理的错误。 <br><br>　　结论三：保证所有资源都被正确释放。充分运用finally关键词。</font></p>
<p><font size=2><strong>反例之四：不说明异常的详细信息 <br><br></strong>　　代码：3行-18行。 <br><br>　　仔细观察这段代码：如果循环内部出现了异常，会发生什么事情？我们可以得到足够的信息判断循环内部出错的原因吗？不能。我们只能知道当前正在处理的类发生了某种错误，但却不能获得任何信息判断导致当前错误的原因。 <br><br>　　printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程，但只提供了一些最基本的信息，未能说明实际导致错误的原因，同时也不易解读。 <br><br>　　因此，在出现异常时，最好能够提供一些文字信息，例如当前正在执行的类、方法和其他状态信息，包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。 <br><br>　　结论四：在异常处理模块中提供适量的错误原因信息，组织错误信息使其易于理解和阅读。 <br><br>　　<strong>反例之五：过于庞大的try块 </strong><br><br>　　代码：3行-14行。 <br><br>　　经常可以看到有人把大量的代码放入单个try块，实际上这不是好习惯。这种现象之所以常见，原因就在于有些人图省事，不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子，虽然东西是带上了，但要找出来可不容易。 <br><br>　　一些新手常常把大量的代码放入单个try块，然后再在catch语句中声明Exception，而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难，因为一大段代码中有太多的地方可能抛出Exception。 <br><br>　　结论五：尽量减小try块的体积。 <br><br>　　<strong>反例之六：输出数据不完整</strong> <br><br>　　代码：7行-11行。 <br><br>　　不完整的数据是Java程序的隐形杀手。仔细观察这段代码，考虑一下如果循环的中间抛出了异常，会发生什么事情。循环的执行当然是要被打断的，其次， catch块会执行??就这些，再也没有其他动作了。已经输出的数据怎么办？使用这些数据的人或设备将收到一份不完整的（因而也是错误的）数据，却得不到任何有关这份数据是否完整的提示。对于有些系统来说，数据不完整可能比系统停止运行带来更大的损失。 <br><br>　　较为理想的处置办法是向输出设备写一些信息，声明数据的不完整性；另一种可能有效的办法是，先缓冲要输出的数据，准备好全部数据之后再一次性输出。 <br><br>　　结论六：全面考虑可能出现的异常以及这些异常对执行流程的影响。 <br><br>　　<strong>改写后的代码</strong> <br><br>　　根据上面的讨论，下面给出改写后的代码。也许有人会说它稍微有点?嗦，但是它有了比较完备的异常处理机制。 <br><br></font>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td><font size=2>OutputStreamWriter out = ... <br>java.sql.Connection conn = ... <br>try { <br>　Statement stat = conn.createStatement(); <br>　ResultSet rs = stat.executeQuery( <br>　　"select uid, name from user"); <br>　while (rs.next()) <br>　{ <br>　　out.println("ID：" + rs.getString("uid") + "，姓名: " + rs.getString("name")); <br>　} <br>} <br>catch(SQLException sqlex) <br>{ <br>　out.println("警告：数据不完整"); <br>　throw new ApplicationException("读取数据时出现SQL错误", sqlex); <br>} <br>catch(IOException ioex) <br>{ <br>　throw new ApplicationException("写入数据时出现IO错误", ioex); <br>} <br>finally <br>{ <br>　if (conn != null) { <br>　　try { <br>　　　conn.close(); <br>　　} <br>　　catch(SQLException sqlex2) <br>　　{ <br>　　　System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连接: " + sqlex2.toString()); <br>　　} <br>　} <br><br>　if (out != null) { <br>　　try { <br>　　　out.close(); <br>　　} <br>　　catch(IOException ioex2) <br>　　{ <br>　　　System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文件" + ioex2.toString()); <br>　　} <br>　} <br>} </font></td>
        </tr>
    </tbody>
</table>
<br><font size=2>　　本文的结论不是放之四海皆准的教条，有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心，务必加上详细、全面的注释。 <br><br>　　另一方面，不要笑话这些错误，不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途，原因很简单，因为它们确确实实带来了&#8220;方便&#8221;。所有这些反例都可以看作Java编程世界的恶魔，它们美丽动人，无孔不入，时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事，不足挂齿，但请记住：勿以恶小而为之，勿以善小而不为。 <br></font></p>
<br>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-16 18:09 <a href="http://www.blogjava.net/microlab4321/articles/137356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]提高查询速度方法总结 </title><link>http://www.blogjava.net/microlab4321/articles/137351.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Thu, 16 Aug 2007 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137351.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137351.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137351.html</trackback:ping><description><![CDATA[<div class=postText>
<p>这个帖子主要总结提高查询速度的方法，涉及到减少连接数据库次数、建立索引、优化语句等方面。</p>
<p>关于索引，推荐转载的这篇文章<br><a href="http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx"><font color=#000080>http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx</font></a></p>
<p>改善SQL语句的效率<br><a href="http://community.csdn.net/Expert/topic/5087/5087396.xml?temp=.345669"><font color=#000080>http://community.csdn.net/Expert/topic/5087/5087396.xml?temp=.345669</font></a><br>数据量很大怎样加快索检速度<br><a href="http://community.csdn.net/Expert/topic/5058/5058320.xml?temp=.1229517"><font color=#000080>http://community.csdn.net/Expert/topic/5058/5058320.xml?temp=.1229517</font></a><br>索引建立方法的区别<br><a href="http://community.csdn.net/Expert/topic/5068/5068154.xml?temp=.3010218"><font color=#000080>http://community.csdn.net/Expert/topic/5068/5068154.xml?temp=.3010218</font></a><br>频繁插入删除数据需要更新索引<br><a href="http://community.csdn.net/Expert/topic/4937/4937910.xml?temp=.8428614"><font color=#000080>http://community.csdn.net/Expert/topic/4937/4937910.xml?temp=.8428614</font></a><br>测试了一下sql server 2005 全文检索<br><a href="http://community.csdn.net/Expert/topic/4878/4878430.xml?temp=.6049311"><font color=#000080>http://community.csdn.net/Expert/topic/4878/4878430.xml?temp=.6049311</font></a></p>
<p>其他关于效率的高频问题</p>
<p>判断一个表的数据不在另一个表中最优秀方法？<br><a href="http://community.csdn.net/Expert/topic/5038/5038742.xml?temp=.4704553"><font color=#000080>http://community.csdn.net/Expert/topic/5038/5038742.xml?temp=.4704553</font></a><br>删除千万级表中重复记录的办法<br><a href="http://community.csdn.net/Expert/topic/5089/5089261.xml?temp=.7907068"><font color=#000080>http://community.csdn.net/Expert/topic/5089/5089261.xml?temp=.7907068</font></a></p>
<p>数据库数据查询变得不正常类型问题</p>
<p>大数据量，稳定运行一段时候以后无法得到查询结果。<br><a href="http://community.csdn.net/Expert/topic/4810/4810464.xml?temp=9.014529E-02"><font color=#000080>http://community.csdn.net/Expert/topic/4810/4810464.xml?temp=9.014529E-02</font></a><br></p>
</div>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-16 17:54 <a href="http://www.blogjava.net/microlab4321/articles/137351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC连接数据库经验技巧集萃 </title><link>http://www.blogjava.net/microlab4321/articles/137300.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Thu, 16 Aug 2007 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137300.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137300.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137300.html</trackback:ping><description><![CDATA[Java数据库连接（JDBC）由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API，使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同，所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。<br><br>　　<strong>一、连接各种数据库方式速查表</strong><br><br>　　下面罗列了各种数据库使用JDBC连接的方式，可以作为一个手册使用。 <br><br>　　1、Oracle8/8i/9i数据库（thin模式） <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br>String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID <br>String user="test"; <br>String password="test"; <br>Connection conn= DriverManager.getConnection(url,user,password); </td>
        </tr>
    </tbody>
</table>
<br>　　2、DB2数据库 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br>String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名 <br>String user="admin"; <br>String password=""; <br>Connection conn= DriverManager.getConnection(url,user,password); </td>
        </tr>
    </tbody>
</table>
<br>　　3、Sql Server7.0/2000数据库 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br>String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; <br>//mydb为数据库 <br>String user="sa"; <br>String password=""; <br>Connection conn= DriverManager.getConnection(url,user,password); </td>
        </tr>
    </tbody>
</table>
<br>　　4、Sybase数据库 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br>String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名 <br>Properties sysProps = System.getProperties(); <br>SysProps.put("user","userid"); <br>SysProps.put("password","user_password"); <br>Connection conn= DriverManager.getConnection(url, SysProps); </td>
        </tr>
    </tbody>
</table>
<br>　　5、Informix数据库 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br>String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; <br>user=testuser;password=testpassword"; //myDB为数据库名 <br>Connection conn= DriverManager.getConnection(url); </td>
        </tr>
    </tbody>
</table>
<br>　　6、MySQL数据库 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br>String url ="jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br>//myDB为数据库名 <br>Connection conn= DriverManager.getConnection(url); </td>
        </tr>
    </tbody>
</table>
<br>　　7、PostgreSQL数据库 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("org.postgresql.Driver").newInstance(); <br>String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名 <br>String user="myuser"; <br>String password="mypassword"; <br>Connection conn= DriverManager.getConnection(url,user,password); </td>
        </tr>
    </tbody>
</table>
<br>　　8、access数据库直连用ODBC的<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;<br>String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");<br>Connection conn = DriverManager.getConnection(url,"","");<br>Statement stmtNew=conn.createStatement() ;</td>
        </tr>
    </tbody>
</table>
<br>　　<strong>二、JDBC连接MySql方式</strong><br><br>　　下面是使用JDBC连接MySql的一个小的教程 <br><br>　　1、查找驱动程序<br><br>　　MySQL目前提供的java驱动程序为Connection/J，可以从MySQL官方网站下载，并找到mysql-connector-java-3.0.15-ga-bin.jar文件，此驱动程序为纯java驱动程序，不需做其他配置。<br><br>　　2、动态指定classpath<br><br>　　如果需要执行时动态指定classpath，就在执行时采用－cp方式。否则将上面的.jar文件加入到classpath环境变量中。<br><br>　　3、加载驱动程序<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>try{<br>　Class.forName(com.mysql.jdbc.Driver);<br>　System.out.println(Success loading Mysql Driver!);<br>}catch(Exception e)<br>{<br>　System.out.println(Error loading Mysql Driver!);<br>　e.printStackTrace();<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　4、设置连接的url<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>jdbc：mysql：//localhost/databasename[?pa=va][＆pa=va]</td>
        </tr>
    </tbody>
</table>
<br><span class=f14>　　<strong>三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧</strong><br><br>　　1、在客户端软件开发中使用Thin驱动程序<br><br>　　在开发Java软件方面，Oracle的数据库提供了四种类型的驱动程序，二种用于应用软件、applets、servlets等客户端软件，另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中，我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口（JNI），通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序，它直接与数据库进行通讯。为了获得最高的性能，Oracle建议在客户端软件的开发中使用OCI驱动程序，这似乎是正确的。但我建议使用Thin驱动程序，因为通过多次测试发现，在通常情况下，Thin驱动程序的性能都超过了OCI驱动程序。<br><br>　　2、关闭自动提交功能，提高系统性能<br><br>　　在第一次建立与数据库的连接时，在缺省情况下，连接是在自动提交模式下的。为了获得更好的性能，可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能，如下所示：<br><br>　　conn.setAutoCommit(false);<br><br>　　值得注意的是，一旦关闭了自动提交功能，我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。<br><br>　　3、在动态SQL或有时间限制的命令中使用Statement对象<br><br>　　在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象时，每次执行一个SQL命令时，都会对它进行解析和编译。这可能会使你认为，使用PreparedStatement对象比使用Statement对象的速度更快。然而，我进行的测试表明，在客户端软件中，情况并非如此。因此，在有时间限制的SQL操作中，除非成批地处理SQL命令，我们应当考虑使用Statement对象。<br><br>　　此外，使用Statement对象也使得编写动态SQL命令更加简单，因为我们可以将字符串连接在一起，建立一个有效的SQL命令。因此，我认为，Statement对象可以使动态SQL命令的创建和执行变得更加简单。<br><br>　　4、利用helper函数对动态SQL命令进行格式化<br><br>　　在创建使用Statement对象执行的动态SQL命令时，我们需要处理一些格式化方面的问题。例如，如果我们想创建一个将名字O'Reilly插入表中的SQL命令，则必须使用二个相连的&#8220;''&#8221;号替换O'Reilly中的&#8220;'&#8221;号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法，然后在连接字符串心服用公式表达一个SQL命令时，使用创建的helper方法。与此类似的是，我们可以让helper方法接受一个Date型的值，然后让它输出基于Oracle的to_date()函数的字符串表达式。<br><br>　　5、利用PreparedStatement对象提高数据库的总体效率<br><br>　　在使用PreparedStatement对象执行SQL命令时，命令被数据库进行解析和编译，然后被放到命令缓冲区。然后，每当执行同一个PreparedStatement对象时，它就会被再解析一次，但不会被再次编译。在缓冲区中可以发现预编译的命令，并且可以重新使用。在有大量用户的企业级应用软件中，经常会重复执行相同的SQL命令，使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务，我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。<br><br>　　6、在成批处理重复的插入或更新操作中使用PreparedStatement对象<br><br>　　如果成批地处理插入和更新操作，就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理，只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理，或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制，可以以如下所示的方式调用setExecuteBatch()：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>PreparedStatement pstmt3D null;<br>try {<br>　((OraclePreparedStatement)pstmt).setExecuteBatch(30);<br>　...<br>　pstmt.executeUpdate();<br>} </td>
        </tr>
    </tbody>
</table>
<br>　　调用setExecuteBatch()时指定的值是一个上限，当达到该值时，就会自动地引发SQL命令执行，标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。<br><br>　　7、使用Oracle locator方法插入、更新大对象（LOB）<br><br>　　Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理，尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值，也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB，但需要使用locator才能获取LOB的值。由于存在这二个问题，因此，我建议使用locator的方法来插入、更新或获取LOB的值。<br><br>　　8、使用SQL92语法调用存储过程<br><br>　　在调用存储过程时，我们可以使用SQL92或Oracle PL/SQL，由于使用Oracle PL/SQL并没有什么实际的好处，而且会给以后维护你的应用程序的开发人员带来麻烦，因此，我建议在调用存储过程时使用SQL92。<br><br>　　9、使用Object SQL将对象模式转移到数据库中<br><br>　　既然可以将Oracle的数据库作为一种面向对象的数据库来使用，就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象，将它们的属性映射到关系表中，然后在这些bean中添加方法。尽管这样作在Java中没有什么问题，但由于操作都是在数据库之外进行的，因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术，可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作，然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式，不但Java应用程序可以使用应用软件的对象模式，其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。<br><br>　　10、利用SQL完成数据库内的操作<br><br>　　我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求，而不是使用Java等过程化的编程语言。<br><br>　　如果编程人员要在一个表中查找许多行，结果中的每个行都会查找其他表中的数据，最后，编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务，何必要让数据在网上流来流去的？我建议用户认真学习如何最大限度地发挥SQL的功能。 <br></span>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-16 16:03 <a href="http://www.blogjava.net/microlab4321/articles/137300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP连接mysql数据库(1)</title><link>http://www.blogjava.net/microlab4321/articles/137167.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Thu, 16 Aug 2007 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137167.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137167.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137167.html</trackback:ping><description><![CDATA[<p>一． 软件下载<br>　　Mysql<br>　　下载版本：4.1.11<br>　　<a href="http://dev.mysql.com/downloads/mysql/4.1.html"><u><font color=#0000ff>http://dev.mysql.com/downloads/mysql/4.1.html</font></u></a></p>
<p>　　JDBC驱动<br>　　下载版本：3.1.8<br>　　<a href="http://dev.mysql.com/downloads/connector/j/3.1.html"><u><font color=#0000ff>http://dev.mysql.com/downloads/connector/j/3.1.html</font></u></a></p>
<p>　　Mysql界面插件:mysql-front<br>　　下载版本镜像：HongKong（下回来安装就是中文版了）<br>　　<a href="http://www.mysqlfront.de/download.html"><u><font color=#0000ff>http://www.mysqlfront.de/download.html</font></u></a></p>
<p>二． 软件安装<br>　　1.安装mysql<br>　　请参阅资料版区相关文章</p>
<p>　　<a href="http://info.mysql.cn/install/2006/0208/81.html"><u><font color=#0000ff>http://info.mysql.cn/install/2006/0208/81.html</font></u></a></p>
<p>　　2.JDBC驱动：mysql-connector-java-3.1.8<br>　　这只是一个压缩包，并不需要安装，只要将其解压，我么使用的是文件夹mysql-connector-java-3.1.8里的文件：mysql-connector-java-3.1.8-bin.jar．</p>
<p>　　3. Mysql界面插件:mysql-front<br>　　这是一个安装程序，按照提示安装就可以了．</p>
<p>三． 环境配置<br>　　　首先，我要说明的是我现在tomcat的安装路径是: D:\Program Files\Java\Tomcat；JDK的安装路径是：D:\Program Files\Java\j2sdk。</p>
<p>　　在这里，需要配置环境变量的是JDBC驱动．在配置前先要把刚才说到的mysql-connector-java-3.1.8-bin.jar本地硬盘某处（我放的地方：D:\Program Files\Java\mysqlforjdbc），然后根据你放的地方，配置classpath，我的配置是这样的：</p>
<p>　　D:\Program files\Java\j2sdk\lib\tools.jar;</p>
<p>　　D:\Program Files\Java\j2sdk\lib\mysql-connector-java-3.1.8-bin-g.jar;</p>
<p>　　D:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.8-bin.jar</p>
<p>　　配置这个的目的是让你的java应用程序找到连接mysql的驱动．</p>
<p>　　配置完环境变量后还有很重要一步就是为JSP连接数据库配置驱动，这个其实很简单，就是把mysql-connector-java-3.1.8- bin.jar拷到某些文件夹里就行了，我在网上看了很多资料问了很多人，各种说法都有，我综合了一下，为了保险，我都全做了，呵呵，反正就是拷一个 400K的文件而已，现列出要把mysql-connector-java-3.1.8-bin.jar拷进去的文件夹，如下：<br>　　D:\Program Files\Java\Tomcat\common\lib<br>　　D:\Program Files\Java\Tomcat\shared\lib</p>
<p>四． 数据库的使用</p>
<p>　　Mysql安装完毕以后，还有一些要注意的地方（参考）：</p>
<p>　　<a href="http://info.mysql.cn/install/2006/0208/82.html"><u><font color=#0000ff>http://info.mysql.cn/install/2006/0208/82.html</font></u></a></p>
<p>　　就象在文章提到的，mysql安装好后最重要一样就是要看数据库有没有作为系统服务启动了，所以在大家进行数据库操作前，应要看看，在操作系统的开始－＞运行－＞输入services.msc，确定你在安装时你设置的关于mysql的那个服务已经启动，这样你在操作数据库时不会报连接不上的错误．</p>
<p>　　上面提到了一个较方便的mysql界面插件，但是这个界面是我在已经开始使用mysql后才找到的，刚开始我是在dos下用命令行进行操作的．虽然那个界面也可以进行建库啊，设定权限等操作，但是，我觉得懂得在使用命令行也是一个很重要的技能，所以我先从命令行开始说，怎样简单使用mysql．到后面会谈及mysql－front的使用．</p>
<p>　　现在我想在mysql里建一个数据库shujuku，以及在数据库里建一个表biao．具体的命令如下（假设mysql我是刚安装好的）</p>
<p>　　1. 进入dos状态（记住命令行的要运行在mysql的安装目录下的bin目录的）</p>
<p>　　2. 连接mysql<br>　　输入：mysql &#8211;h localhost &#8211;u root &#8211;p<br>　　输入在安装时已设好的密码，就近入了mysql的命令编辑界面了。</p>
<p>　　3. 使用mysql的基本命令(在mysql命令行编辑每输入完命令后最后一定要有分号，不然会报错)<br>　　显示数据库：show databases;<br>　　使用数据库：use 数据库名；</p>
<p>　　4．建库<br>　　命令：create database shujuku;</p>
<p>　　5.为数据库设置权限（用户和密码）<br>　　命令：grant all privileges on shujuku.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;"><u><font color=#0000ff>test@localhost</font></u></a> identified by &#8220;123456&#8221;;<br>　　当你执行完这个命令以后，只要你再以用户名：test,密码：123456登录时你就只可以对shujuku这个数据库操作，这样避开使用root，对数据库的安全有很大帮助．</p>
<p>　　6.建表<br>　　命令：create table biao(id int(8) primary key,name varchar(10));</p>
<p>　　剩下来的与标准sqsl命令基本上是一样的，具体操作略<br>　　值得一提的是，你在命令行上输入＂？＂，就会有mysql命令的简单帮助，如下：</p>
<p>　　呵呵，那样，我们还可以知道退出，就是＂exit＂，呵呵！</p>
<p>五． 关于mysql-front的使用<br>　　我找了好几个mysql的界面工具，觉得最简洁方便还是mysql-front，可惜的是要收费，不过还好有试用期，呵呵，可以先感受感受一下，最重要一点是mysql-front有简体中文版的，英文不好的我用起来就舒服多了．下面简单说说使用吧．</p>
<p>　　首先，安装就不用说了，有向导，而且很简单．安装好后第一次运行时会跳出来一个要求添加对话的框，在这里你可以添加例如上面已经设定好的shujuku，过程如下:<br>　　当你在注册的复选框里填上你在上面mysql设定好的用户名和密码后，在选择数据库框里就有shujuku 的数据库了，选上，按确定．进入mysql-fron后，你就会看到下面的界面，这是你就可以进行操作了．</p>
<p>　　要说明的是，你还可以把root用户也加进去，这要你在mysql-fron的界面上选设置－＞对话－＞新建，再按上面进行就可以，出了root你还可以加入更多的用户，方法还是一样的，设置不同的用户，是方便对不同数据库进行管理，呵呵，root是权限最高的，可不要随便让别人使用你的root用户，保正你数据库的安全．</p>
<p>六． JSP连接mysql<br>　　现在就是尝试用jsp连接mysql了<br>　　我在eclipse里建了个test_mysql.jsp页面，代码如下：</p>
<p>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;</p>
<p>&lt;%@ page language="java" %&gt;</p>
<p>&lt;%@ page import="com.mysql.jdbc.Driver" %&gt;</p>
<p>&lt;%@ page import="java.sql.*" %&gt;</p>
<p>&lt;%</p>
<p>//驱动程序名</p>
<p>String driverName="com.mysql.jdbc.Driver";</p>
<p>//数据库用户名</p>
<p>String userName="cl41";</p>
<p>//密码</p>
<p>String userPasswd="123456";</p>
<p>//数据库名</p>
<p>String dbName="db";</p>
<p>//表名</p>
<p>String tableName="dbtest";</p>
<p>//联结字符串</p>
<p>String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&amp;password="+userPasswd;</p>
<p>Class.forName("com.mysql.jdbc.Driver").newInstance();</p>
<p>Connection connection=DriverManager.getConnection(url);</p>
<p>Statement statement = connection.createStatement();</p>
<p>String sql="SELECT * FROM "+tableName;</p>
<p>ResultSet rs = statement.executeQuery(sql);</p>
<p>//获得数据结果集合</p>
<p>ResultSetMetaData rmeta = rs.getMetaData();</p>
<p>//确定数据集的列数，亦字段数</p>
<p>int numColumns=rmeta.getColumnCount();</p>
<p>// 输出每一个数据值</p>
<p>out.print("id");</p>
<p>out.print("|");</p>
<p>out.print("num");</p>
<p>out.print("&lt;br&gt;");</p>
<p>while(rs.next()) {</p>
<p>out.print(rs.getString(1)+" ");</p>
<p>out.print("|");</p>
<p>out.print(rs.getString(2));</p>
<p>out.print("&lt;br&gt;");</p>
<p>}</p>
<p>out.print("&lt;br&gt;");</p>
<p>out.print("数据库操作成功，恭喜你");</p>
<p>rs.close();</p>
<p>statement.close();</p>
<p>connection.close();</p>
<p>%&gt;</p>
<p>　　然后把test??_mysql.jsp部署到tomcat处，如何部署可参考"配置Eclpise+tomcat并实现JSP的编写与部署"，在浏览器中就可以看到结果了。</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-16 11:24 <a href="http://www.blogjava.net/microlab4321/articles/137167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql5全新安装手册</title><link>http://www.blogjava.net/microlab4321/articles/136747.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Tue, 14 Aug 2007 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136747.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136747.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136747.html</trackback:ping><description><![CDATA[<p>原文出自:http://bbs.mysql.cn/thread-261-1-1.html<br>本手册是在对colin兄及其它网友的经验总结而来，在此，对大家所做出的贡献表示感谢！<br>闲话少叙，书归正传！我是在Windows XP SP2 环境安装的。<br>首先在站内地址：<a href="http://download.mysql.cn/src/2006/0218/199.html" target=_blank>http://download.mysql.cn/src/2006/0218/199.html</a><br>下载到mysql-5.0.18-win32，如图1：<br><span id=attach_111 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br>双击该图标(先保证你的电脑上安装了WinRAR或者WinZIP等解压缩工具，压缩工具也可以在上面的页面中下载到)，打开rar解压窗口，如图2<br><span id=attach_112 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br>你可以把文件解压都硬盘上，然后再安装。也可以直接在窗口中，双击Setup.exe文件，开始mysql5.0的安装。<br>先是等待，它自己解压文件，直到出现下面的窗口，图3<br><span id=attach_113 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br><br>这里是安装欢迎程序，点击Next开始下一步安装。默认是Typical，建议改成Custom，因为Typical模式不允许改变安装路径，只能安装在C盘。下面会介绍Custom的安装方法，见图4。<br><span id=attach_114 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br>到这一步需要选择组件及更改文件夹位置，组件就用默认的，位置可以选择Change来改变，见图5<br><span id=attach_115 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><span id=attach_116 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br>注意：安装mysql的路径中，不能含有中文！<br>一切就绪，点击Install开始安装。见图6。<br><span id=attach_117 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br><br>开始安装过程，会出现安装进度条，见图7。<br></p>
<p><br><br><br>安装结束后，程序会提示是否要在mysql.com上注册，我们选择跳过，即Skip Sign-Up然后点&#8220;Next&#8221;见图8<br><span id=attach_119 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span><br><br>安装结束，选择现在开始配置mysql服务器。点击Finish继续。图9。<br><br>配置开始，点击Next继续，见图10<br><span id=attach_131 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; LEFT: 213px; POSITION: absolute; TOP: 1800px"></span></p>
<p><br><br><br>选择Detailed Configuration，见图11，点Next继续<br><span id=attach_132 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br><br>下面这个选项是选择mysql应用于何种类型，第一种是开发服务器，将只用尽量少的内存，第二种是普通WEB服务器，将使用中等数量内存，最后一种是这台服务器上面只跑mysql数据库，将占用全部的内存，我这里只是示例，就选择开发服务器，占用尽量少的内存，用户可根据自己的需求，选择其他选项，见图12，点Next继续<br><span id=attach_133 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br><br>下面是选择数据库用途，第一种是多功能用途，将把数据库优化成很好的innodb存储类型和高效率的myisam存储类型，第二种是只用于事务处理类型，最好的优化innodb，但同时也支持myisam，最后一种是非事务处理类型，适合于简单的应用，只有不支持事务的myisam类型是被支持的。一般选择第一种多功能的。见图13<br><span id=attach_134 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; LEFT: 213px; POSITION: absolute; TOP: 2169px"></span></p>
<p><br><br><br>点Next继续，下面是选择InnodDB的数据存放位置，一般默认好了，不需要改动，见图14<br><span id=attach_135 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; LEFT: 213px; POSITION: absolute; TOP: 2262px"></span></p>
<p><br><br><br>下面是选择mysql允许的最大连接数，第一种是最大20个连接并发数，第二种是最大500个并发连接数，最后一种是自定义，你可以根据自己的需要选择，见图15 <br><span id=attach_136 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br><br>点Next继续，下面是选择数据库监听的端口，一般默认是3306，如果改成其他端口，以后连接数据库的时候都要记住修改的端口，否则不能连接mysql数据库，比较麻烦，这里不做修改，用mysq的默认端口：3306，见图<span id=attach_137 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span> </p>
<p><br>点Next继续，这一步设置mysql的默认编码，默认是latin1，见图17<br><span id=attach_138 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br><br>我们可以根据需要，把它改成gb2312，过gbk，见图18<br></p>
<p><br>图18<br><br>注意：如果要用原来数据库的数据，最好能确定原来数据库用的是什么编码，如果这里设置的编码和原来数据库数据的编码不一致，在使用的时候可能会出现乱码。<br>点Next继续，这一步是是否要把mysql设置成windows的服务，一般选择设成服务，这样以后就可以通过服务中启动和关闭mysql数据库了。推荐：下面的复选框也勾选上，这样，在cmd模式下，不必非到mysql的bin目录下执行命令。见图19<br><span id=attach_140 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; LEFT: 213px; POSITION: absolute; TOP: 2837px"></span></p>
<p>点Next继续，这一步是设置mysql的超级用户密码，这个超级用户非常重要，对mysql拥有全部的权限，请设置好并牢记超级用户的密码，下面有个复选框是选择是否允许远程机器用root用户连接到你的mysql服务器上面，如果有这个需求，也请勾选，见图20<br><span id=attach_141 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br>图20<br><br>当两次输入的密码一致后，记住该密码，点Next继续，见图21<br><span id=attach_144 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br>图21<br><br>到现在位置，mysql已经得到了足够的配置条件，如果没有问题即可点击Execute，让mysql进行配置，如果有不妥的地方，点击Back，重新修改配置条件，见图22<br>图22<br><br><br>这样mysql就全部安装好了，见图23。<br><span id=attach_142 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br>图23<br><br>可能出现的问题：<br>如果在第二十步，你出现的界面是像下面这样，见图24：<br><span id=attach_143 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br>图24<br><br>有三个输入密码的地方，则有可能您是在原来基础上安装的。你在第一个文本框输入原来root的密码，后面两个文本框输入root的新密码，点击Next基础，出现下图，见图25：<br><span id=attach_145 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br>图25<br><br>给您推荐几种解决办法：<br>1、&nbsp; &nbsp; &nbsp; &nbsp; 点Retry，重试；<br>2、 &nbsp; &nbsp; &nbsp; &nbsp; 再运行一次设置，看到有关&#8220;移除原设置&#8221;的选项，选择移除，然后在重新设置。<br>3、&nbsp; &nbsp; &nbsp; &nbsp; 重装。<br>重装注意事项：最好删除原来的所有文件，必要的话，可以清一下注册表，如果你机器上没有其它mysql相关的程序。而且一定记得不要保留原有的my.ini文件。还有就是删除原来安装路径下的文件，并删除数据目录下面的ibdata1文件.<br><br>终于发完了，不容易啊，希望能对大家有所帮助，如果有不对的地方，敬请指出，我会尽快修<br><br><span id=attach_120 onmouseover="showMenu(this.id, 0, 1)" style="DISPLAY: none; POSITION: absolute"></span></p>
<p><br>&nbsp;</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-14 17:47 <a href="http://www.blogjava.net/microlab4321/articles/136747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL5 入门知识</title><link>http://www.blogjava.net/microlab4321/articles/136589.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Tue, 14 Aug 2007 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136589.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136589.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136589.html</trackback:ping><description><![CDATA[原文出自:http://bbs.mysql.cn/thread-261-1-1.html<br>作者：yzcdf<br><br>本资料内容来自与MYSQL.CN论坛，谢谢那些默默做出贡献的朋友！<br><br>一、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;关于MySQL5<br>MySQL5系列数据库是MySQL的最新版本的数据库，比较流行的发行版是mysql-5.0.18。MySQL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;英文官方网站是<a href="http://www.mysql.com/" target=_blank><u><font color=#0000ff>http://www.mysql.com</font></u></a><br><br>二、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;获得MySQL5<br>所有的关于MySQL数据库的程序，都可以在它的英文官方网站下载到，但是，鉴于不不是所有人的英文都很好，所以建议大家尽量区MySQL的中文官方网站下载自己所需的程序，如果找不到，再去找英文的网站。<br>MySQL5有安装版和免安装版之分，顾名思义，安装版就是需要安装以后才可以使用；免安装版的MySQL下载下来之后就可以使用，或者进行简单的设置就可以使用。<br>MySQL5安装版下载地址：<br>Windows版本：<a href="http://download.mysql.cn/src/2006/0218/199.html" target=_blank><u><font color=#800080>http://download.mysql.cn/src/2006/0218/199.html</font></u></a><br>Linux版本（源码包）：<a href="http://download.mysql.cn/src/2006/0208/62.html" target=_blank><u><font color=#0000ff>http://download.mysql.cn/src/2006/0208/62.html</font></u></a><br>MySQL5免安装版下载地址：<br>Windows版本：<a href="http://download.mysql.cn/src/2006/0302/205.html" target=_blank><u><font color=#0000ff>http://download.mysql.cn/src/2006/0302/205.html</font></u></a><br><br>三、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;MySQL5安装<br>Windows版安装手册：<a href="http://bbs.mysql.cn/thread-261-1-1.html" target=_blank><u><font color=#800080>http://bbs.mysql.cn/thread-261-1-1.html</font></u></a><br>Linux版本（源码包）安装手册：<a href="http://bbs.mysql.cn/thread-493-1-2.html" target=_blank><u><font color=#0000ff>http://bbs.mysql.cn/thread-493-1-2.html</font></u></a><br><br>MySQL有安装版本和免安装版本，免安装版本解压后的文件夹内没有安装程序，可以直接使用。<br>Windows免安装版本使用手册：<a href="http://bbs.mysql.cn/thread-552-1-1.html" target=_blank><u><font color=#0000ff>http://bbs.mysql.cn/thread-552-1-1.html</font></u></a><br><br>四、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;备份与恢复<br>常规备份命令是mysqldump,这里以tm数据库为例，做简单介绍，详细资料参考<br><a href="http://info.mysql.cn/install/2006/0410/5521.html" target=_blank><u><font color=#800080>http://info.mysql.cn/install/2006/0410/5521.html</font></u></a><br>备份：<br>#mysqldump -u root -p tm &gt; tm_20060101.sql&nbsp;&nbsp;<br>按提示输入密码，这就把tm数据库所有的表结构和数据备份到tm_20060101.sql了，因为要总进行备份工作，如果数据量大会占用很大空间，<br>这是可以利用gzip压缩数据，命令如下：<br>#mysqldump -u root -p tm | gzip &gt; tm_20060101.sql.gz<br>还可以备份到远程机器，用-h制定，如<br>#mysqldump -u root -p tm &gt; tm_20060101.sql -h xxx.xxx.xxx.xxx <br>可以直接备份到IP地址为xxx.xxx.xxx.xxx的远程计算机。<br>系统崩溃，重建系统，或恢复数据库时，可以这样恢复数据：<br>#mysql -u root -p tm &lt; tm_20060101.sql<br>从压缩文件直接恢复：<br>#gunzip &lt; tm_20060101.sql.gz | mysql -u root -p tm<br><br>五、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FAQ<br><br>Q：为什么我下在的&#8220;安装程序&#8221;里面没有安装文件?<br>A：你下载的可能是免安装版本。请给出详细的版本信息。<br><br>Q：如何启动和关闭mysql?<br>A：linux下：比如我的mysql是用源码方式安装在/usr/local/mysql<br>自动：将/usr/local/mysql/share/mysql/mysql.server拷贝到/etc/rc.d/init.d/下，然后<br>chkconfig --add mysql.server就可以开机就启动mysql服务了。<br>手动：以root身份执行/usr/local/mysql/bin/mysqld_safe --user=mysql<br>windows下：<br>自动：<br>用cmd方式，到mysql安装路径的bin文件夹下，执行：mysqld-nt --install<br>手动：直接到到mysql安装路径的bin文件夹下执行net start mysql即可。<br>如果不想让mysql在计算机启动时候就启动服务，执行：mysqld-nt --remove<br>也可以在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services中删除对应服务并重启计算机。<br>关闭mysql：mysqladmin -uroot -p shutdown<br>启动mysql：<br>mysqld-nt --install<br>net start mysql<br><br>Q：如何修改mysql的用户密码?<br>A ：在这里请区分连接mysql数据库的用户密码和系统的用户密码！！<br><br>mysql -uroot -p<br>输入密码<br>#登录mysql<br>&gt;use mysql<br>&gt;update user set password=password("new_pass") where user="userName";&nbsp;&nbsp;#userName换成你要修改的用户名的密码，比如root<br>&gt;flush privileges;<br>&gt;exit;<br><br>Q：如何登录mysql?<br>A：mysql -uroot -p回车后，输入密码，再回车即可。如果自己没有修改的话，默认密码为空。<br><br>Q：mysql如何很好的变成图形化数据库呢?自身有自带的图形化工具没有?<br>A：mysql自带一个字符的客户端，但是还有好多的像mysql_center、SQLyog、phpMyAdmin、Mysql Query Browser，Mysql Administrator、mysqlcc这样好的图形管理工具。<br>mysql_centerd在本站的下载地址：<a href="http://bbs.mysql.cn/thread-517-1-1.html" target=_blank><u><font color=#0000ff>http://bbs.mysql.cn/thread-517-1-1.html</font></u></a><br>SQLyog去网上搜索，很多的，SQLyog407版本不错。<br>phpMyAdmin下载地址：<a href="http://download.mysql.cn/opencode/2006/0207/55.html" target=_blank><u><font color=#800080>http://download.mysql.cn/opencode/2006/0207/55.html</font></u></a><br>mysql.com提供的管理软件下载地址：<a href="http://dev.mysql.com/downloads/gui-tools/5.0.html" target=_blank><u><font color=#800080>http://dev.mysql.com/downloads/gui-tools/5.0.html</font></u></a><br>其它的我就不一一提供下载地址，自己到网上搜索下载。<br><br>Q:为什么用mysql&nbsp;&nbsp;-uusername -p登录mysql服务器时出现如下提示：<br>&nbsp; &nbsp;&nbsp;&nbsp;Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server!("xxx.xxx.xxx.xxx"代表要登录的服务器)<br>A：这是因为你要登录的mysql服务器不允许用户username从xxx.xxx.xxx.xxx这个ip地址登录。<br>解决办法是在服务器登录mysql，操作步骤为：<br>mysql -uroot -p<br>(输入密码)<br>use mysql<br>update user set Host="%" where User="username";<br>flush privileges;<br><br>Q：什么是phpMyAdmin？<br>A：phpMyAdmin 是一个用PHP编写的，可以通过互联网控制和操作MySQL。通过phpMyAdmin可以完全对数据库进行操作，例如建立、复制/删除数据等等。<br>有了phpMyAdmin 就可以完全不使用mysql命令,直接使用phpMyAdmin就能管理mysql的所有数据和数据库<br><br>Q：如何使用phpMyAdmin？<br>A：要使用phpMyAdmin，下载后，把它释放到web服务器的根目录下，取个名字，比如就叫phpMyAdmin，然后在浏览器的地址栏输入:<br><a href="http://x.x.x.x/phpMyAdmin/index.php" target=_blank><u><font color=#0000ff>http://X.X.X.X/phpMyAdmin/index.php</font></u></a><br>就可以了。<br>如果是phpMyAdmin 2.8.0.2以上版本的，这样使用会报错，因为默认没有这个软件需要的配置文件config.default.php,在2.6.X版本下都有这个文件，只是口令不对。对于2.6.X版本的，可以直接用文本编辑器打开这个文件，把其中第一个$cfg中内容修改成自己的用户名及密码就可以了：<br>$cfg['Servers'][$i]['auth_type']&nbsp; &nbsp;&nbsp;&nbsp;= 'config';&nbsp; &nbsp; // Authentication method (config, http or cookie based)?<br>$cfg['Servers'][$i]['user']&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; = 'root';&nbsp; &nbsp;&nbsp; &nbsp;// MySQL user<br>$cfg['Servers'][$i]['password']&nbsp; &nbsp;&nbsp; &nbsp;= '自己的密码';<br>不设置密码的话，系统会提示：<br>Access denied for user 'root'@'localhost' (using password: NO)<br><br>如果是2.8.0.2版本的，程序会提示请运行scripts/setup.php或者index.php这样的文件进行配置以生成config.inc.php文件。<br><br>Q：为什么我使用mysql出现乱码？<br>A：安装mysql5时默认的字符集是瑞典编码latin1，不支持中文。并且出现乱码的原因很多，建议到bbs.mysql.cn论坛寻找答案。发贴的话请详细说明自己的环境、安装过程及使用的信息，以便大家能快速分析你的问题。<br><br>Q：如何修改字符集？<br>A：<br>mysql -uroot -p<br>输入密码<br>选择你的目标数据库<br>mysql&gt; use dbname<br>显示当前字符集<br>mysql&gt; show variables like '%char%';<br>+--------------------------+----------------------------------------+<br>| Variable_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| Value&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br>+--------------------------+----------------------------------------+<br>| character_set_client&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_connection | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_database&nbsp; &nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_results&nbsp; &nbsp; | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_server&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_system&nbsp; &nbsp;&nbsp;&nbsp;| utf8&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>| character_sets_dir&nbsp; &nbsp;&nbsp; &nbsp; | /usr/local/mysql/share/mysql/charsets/ |<br>+--------------------------+----------------------------------------+<br>7 rows in set (0.00 sec)<br>最好是保持字符集统一。如果你要修改哪个字符集，用set命令，如：<br>mysql&gt; set character_set_client gbk;<br>Query OK, 0 rows affected (0.00 sec)<br><br>mysql&gt; show variables like '%char%';<br>+--------------------------+----------------------------------------+<br>| Variable_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| Value&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br>+--------------------------+----------------------------------------+<br>| character_set_client&nbsp; &nbsp;&nbsp;&nbsp;| gbk&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_connection | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_database&nbsp; &nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_results&nbsp; &nbsp; | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_server&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_system&nbsp; &nbsp;&nbsp;&nbsp;| utf8&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>| character_sets_dir&nbsp; &nbsp;&nbsp; &nbsp; | /usr/local/mysql/share/mysql/charsets/ |<br>+--------------------------+----------------------------------------+<br>再改回来：<br>mysql&gt; set character_set_client=gb2312;<br>Query OK, 0 rows affected (0.00 sec)<br><br>mysql&gt; show variables like '%char%';<br>+--------------------------+----------------------------------------+<br>| Variable_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| Value&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br>+--------------------------+----------------------------------------+<br>| character_set_client&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_connection | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_database&nbsp; &nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_results&nbsp; &nbsp; | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_server&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>| character_set_system&nbsp; &nbsp;&nbsp;&nbsp;| utf8&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>| character_sets_dir&nbsp; &nbsp;&nbsp; &nbsp; | /usr/local/mysql/share/mysql/charsets/ |<br>+--------------------------+----------------------------------------+<br>7 rows in set (0.00 sec)<br>自己试试就知道了。<br><br>Q：为什么我的phpmyadmin提示不能载入mysql扩展？<br>A： 一、看下你的PHP目录和PHP\EXT下有没有php_mysql.dll这个文件。<br>&nbsp; &nbsp;&nbsp; &nbsp;二、配制一下环境变量把php_mysql.dll所在的目录加入的PATH里。<br>&nbsp; &nbsp;&nbsp; &nbsp;三、有的php安装程序安装好以后，在安装路径下，并没有ext文件夹（不知道为什么），最好下载个配置的php，然后，将exe文件夹拷贝到安装目录下，再进行相应的配置。<br>&nbsp; &nbsp;&nbsp; &nbsp;四、看一下c:\winnt 或者是 c:\windows下的php.ini文件里的php_mysql.dll前面的；（分号）是否去掉了，如果没有去掉请去掉，然后，将mysql安装路径下bin文件夹下的libmysql.dll放在安装php的根目录一般为C：\php ，同时也在 C:\windows 下也放各一个，之后重新启动IIS或者是APACHE。有的时候总是刷新一页，即使去掉分号也还是不能载入mysql扩展，最后新打开一个窗口，再试。<br><br>Q：为什么提示："没有发现 PHP 的扩展设置mbstring， 而当前系统好像在使用宽字符集。没有 mbstring 扩展的 phpMyAdmin 不能正确识别字符串，可能产生不可意料的结果."<br>A：因为你没有打开mbstring在扩展，解决办法：打开php的配置文件php.ini，将<br>extension=php_mbstring.dll前面的分号";"去掉，并改到正确的路径，一般为<br>ext/php_mbstring.dll<br><br>Q：为什么PHP连接mysql会有下面的提示？<br>&nbsp; &nbsp;&nbsp; &nbsp; Fatal error: Call to undefined function mysql_connect() &#8230;&#8230;<br>A：很有可能是没有载入mysql扩展，如何解决，请参考上面的方法。<br>因为如果你的系统没有载入mysql扩展的话，phpmyadmin能给出提示，而一般的程序则不能给出。<br>如果phpmyadmin没有给出提示，而你恰好用的apache服务器，尝试一下方法：<br>首先是去掉;extension=php_mysql.dll前面的&#8220;;&#8221;（;为注释）<br>第二步是将C:\php\ext中的php_mysql.dll复制到C:\WINDOWS（C:\WINNT）中即可，<br>并重起Apache。<br><br>Q：为什么我不能看孵化池资料？<br>A：MYSQL.CN的孵化池是专门为初学者提供学习的地方，这里我就不多介绍了，详情请访问：<a href="http://bbs.mysql.cn/thread-369-1-1.html" target=_blank><u><font color=#0000ff>http://bbs.mysql.cn/thread-369-1-1.html</font></u></a>。<br><br>Q：能中文数据库名称么？<br>A：可以，但是不推荐，用起来不方便。<br><br>Q：如果我忘记了root密码，怎么办？<br>A：<br>在windows下：<br>打开命令行窗口，停止mysql服务：&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Net stop mysql<br>启动mysql，一般到mysql的安装路径，找到 mysqld-nt.exe<br>执行：mysqld-nt --skip-grant-tables<br>另外打开一个命令行窗口，执行mysql<br>&gt;use mysql<br>&gt;update user set password=password("new_pass") where user="root";<br>&gt;flush privileges;<br>&gt;exit<br>用Ctrl+Alt+Del，找到mysqld-nt的进程杀掉它，在重新启动mysql-nt服务，就可以用新密码登录了<br><br>在linux下：<br>如果 MySQL 正在运行，首先杀之： killall -TERM mysqld。 <br>启动 MySQL ：bin/safe_mysqld --skip-grant-tables &amp; <br>就可以不需要密码就进入 MySQL 了。 <br>然后就是 <br>&gt;use mysql<br>&gt;update user set password=password("new_pass") where user="root";<br>&gt;flush privileges;<br>重新杀 MySQL ，用正常方法启动 MySQL 。<br><br>Q：为什么出现如下的提示：<br>[root@0-8-2-df-fa-ee ~]# mysql<br>ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)<br>注：也可能是其它路径下的mysql.sock<br>A：说明mysql服务没有启动，mysql.sock是mysql服务启动后启动生成的文件，<br>一般先杀掉mysql服务：killall mysql<br>然后，再根据自己的安装情况启动mysql即可。比如，安装的时候，用的是<br>./configure --prefix=/usr/local/mysql的<br>用下面的命令启动：<br>/usr/local/mysql/bin/mysqld_safe --user=mysql &amp;<br>之后再去执行/usr/local/mysql/bin/mysql -u root -p 登录进入mysql数据库<br>还不行的话，一次执行下面的命令：<br>sync<br>reboot&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;；重启计算机，执行时请小心！！！<br><br>Q:为什么出现下面的错误<br>#1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client<br><br>A：你使用的数据库是4.1以上，用命令行连接MySQL数据库后，执行下面的命令：<br>UPDATE mysql.user SET password=OLD_PASSWORD("your_password") WHERE Host="your_host" AND User="your_username" ;<br>即可解决。<br><br>your_password：改成你连接数据库的密码，比如 123<br>your_host：改成你连接数据库的主机，如果是本地的话，就是localhost<br>your_username：改成你连接数据库的用户，比如 root<br><br>Q：为什么mysql提示我：Data too long for column &#8230;&#8230;<br>A：首先确保你的数据大小符合你的字段大小。<br>再检查你的数据库编码，数据库的编码是否与操作数据库工具的编码一致！<br><br><br>不断添加中，如有错误，欢迎指正！<br>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-14 10:42 <a href="http://www.blogjava.net/microlab4321/articles/136589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL数据备份</title><link>http://www.blogjava.net/microlab4321/articles/136576.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Tue, 14 Aug 2007 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136576.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136576.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136576.html</trackback:ping><description><![CDATA[原文出自:http://info.mysql.cn/install/2006/0410/5521.html<br>在数据库表丢失或损坏的情况下，备份你的数据库是很重要的。如果发生系统崩溃，你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。有时，正是 MySQL 管理员造成破坏。管理员已经知道表已破坏，用诸如 vi 或 Emacs 等编辑器试图直接编辑它们，这对表绝对不是件好事！
<p>　　备份数据库两个主要方法是用 mysqldump 程序或直接拷贝数据库文件（如用 cp、cpio 或 tar 等）。每种方法都有其优缺点： </p>
<p>　　mysqldump 与 MySQL 服务器协同操作。直接拷贝方法在服务器外部进行，并且你必须采取措施保证没有客户正在修改你将拷贝的表。如果你想用文件系统备份来备份数据库，也会发生同样的问题：如果数据库表在文件系统备份过程中被修改，进入备份的表文件主语不一致的状态，而对以后的恢复表将失去意义。文件系统备份与直接拷贝文件的区别是对后者你完全控制了备份过程，这样你能采取措施确保服务器让表不受干扰。 </p>
<p>　　mysqldump 比直接拷贝要慢些。 </p>
<p>　　mysqldump 生成能够移植到其它机器的文本文件，甚至那些有不同硬件结构的机器上。直接拷贝文件不能移植到其它机器上，除非你正在拷贝的表使用 MyISAM 存储格式。ISAM 表只能在相似的硬件结构的机器上拷贝。在 MySQL 3.23 中引入的 MyISAM 表存储格式解决了该问题，因为该格式是机器无关的，所以直接拷贝文件可以移植到具有不同硬件结构的机器上。只要满足两个条件：另一台机器必须也运行 MySQL 3.23 或以后版本，而且文件必须以 MyISAM 格式表示，而不是 ISAM 格式。 </p>
<p>　　不管你使用哪种备份方法，如果你需要恢复数据库，有几个原则应该遵守，以确保最好的结果： </p>
<p>　　定期实施备份。建立一个计划并严格遵守。 </p>
<p>　　让服务器执行更新日志。当你在崩溃后需要恢复数据时，更新日志将帮助你。在你用备份文件恢复数据到备份时的状态后，你可以通过运行更新日志中的查询再次运用备份后面的修改，这将数据库中的表恢复到崩溃发生时的状态。 </p>
<p>　　以文件系统备份的术语讲，数据库备份文件代表完全倾倒（full dump），而更新日志代表渐进倾倒（incremental dump）。 </p>
<p>　　使用一种统一的和易理解的备份文件命名机制。象 backup1、buckup2 等不是特别有意义。当实施你的恢复时，你将浪费时间找出文件里是什么东西。你可能发觉用数据库名和日期构成备份文件名会很有用。例如： </p>
<p>　　%mysqldump samp_db &gt;/usr/archives/mysql/samp_db.1999-10-02 </p>
<p>　　%mysqldump menagerie &gt;/usr/archives/mysql/menagerie.1999-10-02 </p>
<p>　　你可能想在生成备份后压缩它们。备份一般都很大！你也需要让你的备份文件有过期期限以避免它们填满你的磁盘，就象你让你的日志文件过期那样。 </p>
<p>　　用文件系统备份备份你的备份文件。如果遇上了一个彻底崩溃，不仅清除了你的数据目录，也清除了包含你的数据库备份的磁盘驱动器，你将真正遇上了麻烦。 </p>
<p>　　也要备份你的更新日志。 </p>
<p>　　将你的备份文件放在不同于用于你的数据库的文件系统上。这将降低由于生成备份而填满包含数据目录的文件系统的可能性。 </p>
<p>　　用于创建备份的技术同样对拷贝数据库到另一台机器有用。最常见地，一个数据库被转移到了运行在另一台主机上的服务器，但是你也可以将数据转移到同一台主机上的另一个服务器。 </p>
<p>　　1 使用 mysqldump 备份和拷贝数据库 </p>
<p>　　当你使用 mysqldumo 程序产生数据库备份文件时，缺省地，文件内容包含创建正在倾倒的表的 CREATE 语句和包含表中行数据的 INSERT 语句。换句话说，mysqldump 产生的输出可在以后用作 mysql 的输入来重建数据库。 </p>
<p>　　你可以将整个数据库倾倒进一个单独的文本文件中，如下： </p>
<p>　　%mysqldump samp_db &gt;/usr/archives/mysql/samp_db.1999-10-02 </p>
<p>　　输出文件的开头看起来象这样： </p>
<p>　　# MySQL Dump 6.0# # Host: localhost Database: samp_db#------------- </p>
<p>　　--------------------------# Server version 3.23.2-alpha-log## Table st </p>
<p>　　ructure for table absence#CREATE TABLE absence( student_id int(10) </p>
<p>　　unsigned DEFAULT 0 NOT NULL, date date DEFAULT 0000-00-00 NOT NUL </p>
<p>　　L, PRIMARY KEY (student_id,date));## Dumping data for table absence </p>
<p>　　#INSERT INTO absence valueS (3,1999-09-03);INSERT INTO absence value </p>
<p>　　S (5,1999-09-03);INSERT INTO absence valueS (10,1999-09-08);...... </p>
<p>　　文件剩下的部分有更多的INSERT和CREATE TABLE语句组成。如果你想压缩备份，使用类似如下的命令： </p>
<p>　　%mysqldump samp_db | gzip &gt;/usr/archives/mysql/samp_db.1999-10-02.gz </p>
<p>　　如果你要一个庞大的数据库，输出文件也将很庞大，可能难于管理。如果你愿意，你可以在 mysqldump 命令行的数据库名后列出单独的表名来倾到它们的内容，这将倾倒文件分成较小、更易于管理的文件。下例显示如何将 samp_db 数据库的一些表倾到进分开的文件中： </p>
<p>　　%mysqldump samp_db student score event absence &gt;grapbook.sql </p>
<p>　　%mysqldump samp_db member president &gt;hist-league.sql </p>
<p>　　如果你生成准备用于定期刷新另一个数据库内容的备份文件，你可能想用 --add- drop-table 选项。这告诉服务器将 DROP TABLE IF EXISTS 语句写入备份文件，然后，当你取出备份文件并把它装载进第二个数据库时，如果表已经存在，你不会得到一个错误。 </p>
<p>　　如果你倒出一个数据库以便能把数据库转移到另一个服务器，你甚至不必创建备份文件。要保证数据库存在于另一台主机，然后用管道倾倒数据库，这样 mysql 能直接读取 mysqldump 的输出。例如：你想从主机 pit- viper.snake.net 拷贝数据库 samp_db 到 boa.snake.net，可以这样很容易做到： </p>
<p>　　%mysqladmin -h boa.snake.net create samp_db </p>
<p>　　%mysqldump samp_db | mysql -h boa.snake.net samp_db </p>
<p>　　以后，如果你想再次刷新 boa.snake.net 上的数据库，跳过 mysqladmin 命令，但要对 mysqldump 加上--add-drop-table 以避免的得到表已存在的错误： </p>
<p>　　%mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db </p>
<p>　　mysqldump 其它有用的选项包括： </p>
<p>　　--flush-logs 和 --lock-tables 组合将对你的数据库检查点有帮助。--lock-tables 锁定你正在倾倒的所有表，而 --flush-logs 关闭并重新打开更新日志文件，新的更新日志将只包括从备份点起的修改数据库的查询。这将设置你的更新日志检查点位备份时间。（然而如果你有需要执行个更新的客户，锁定所有表对备份期间的客户访问不是件好事。） </p>
<p>　　如果你使用 --flush-logs 设置检查点到备份时，有可能最好是倾倒整个数据库。 </p>
<p>　　如果你倾倒单独的文件，较难将更新日志检查点与备份文件同步。在恢复期间，你通常按数据库为基础提取更新日志内容，对单个表没有提取更新的选择，所以你必须自己提取它们。 </p>
<p>　　缺省地，mysqldump 在写入前将一个表的整个内容读进内存。这通常确实不必要，并且实际上如果你有一个大表，几乎是失败的。你可用 --quick 选项告诉 mysqldump 只要它检索出一行就写出每一行。为了进一步优化倾倒过程，使用 --opt 而不是 --quick。--opt 选项打开其它选项，加速数据的倾倒和把它们读回。 </p>
<p>　　用 --opt 实施备份可能是最常用的方法，因为备份速度上的优势。然而，要警告你，--opt 选项确实有代价，--opt 优化的是你的备份过程，不是其他客户对数据库的访问。--opt 选项通过一次锁定所有表阻止任何人更新你正在倾倒的任何表。你可在一般数据库访问上很容易看到其效果。当你的数据库一般非常频繁地使用，只是一天一次地调节备份。 </p>
<p>　　一个具有 --opt 的相反效果的选项是 --dedayed。该选项使得 mysqldump 写出 INSERT DELAYED 语句而不是 INSERT 语句。如果你将数据文件装入另一个数据库并且你想是这个操作对可能出现在该数据库中的查询的影响最小，--delayed 对此很有帮助。 </p>
<p>　　--compress 选项在你拷贝数据库到另一台机器上时很有帮助，因为它减少网络传输字节的数量。下面有一个例子，注意到 --compress 对与远端主机上的服务器通信的程序才给出，而不是对与本地主机连接的程序： </p>
<p>　　%mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db </p>
<p>　　2 使用直接拷贝数据库的备份和拷贝方法 </p>
<p>　　另一种不涉及 mysqldump 备份数据库和表的方式是直接拷贝数据库表文件。典型地，这用诸如 cp、tar 或 cpio 实用程序。本文的例子使用 cp。 </p>
<p>　　当你使用一种直接备份方法时，你必须保证表不在被使用。如果服务器在你则正在拷贝一个表时改变它，拷贝就失去意义。 </p>
<p>　　保证你的拷贝完整性的最好方法是关闭服务器，拷贝文件，然后重启服务器。如果你不想关闭服务器，要在执行表检查的同时锁定服务器。如果服务器在运行，相同的制约也适用于拷贝文件，而且你应该使用相同的锁定协议让服务器&#8220;安静下来&#8221;。 </p>
<p>　　假设服务器关闭或你已经锁定了你想拷贝的表，下列显示如何将整个 samp_db 数据库备份到一个备份目录（DATADIR 表示服务器的数据目录）： </p>
<p>　　%cd DATADIR%cp -r samp_db /usr/archive/mysql </p>
<p>　　单个表可以如下备份： </p>
<p>　　%cd DATADIR/samp_db%cp member.* /usr/archive/mysql/samp_db%cp score.* </p>
<p>　　/usr/archive/mysql/samp_db .... </p>
<p>　　当你完成了备份时，你可以重启服务器（如果关闭了它）或释放加在表上的锁定（如果你让服务器运行）。 </p>
<p>　　要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上，只是将文件拷贝到另一台服务器主机的适当数据目录下即可。要确保文件是 MyIASM 格式或两台机器有相同的硬件结构，否则你的数据库在另一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。 </p>
<p>　　3 复制数据库（Replicating Database） </p>
<p>　　复制（Replication）类似于拷贝数据库到另一台服务器上，但它的确切含义是实时地保证两个数据库的完全同步。这个功能将在 3.23 版中出现，而且还不很成熟，因此本文不作详细介绍。 </p>
<p>　　4 用备份恢复数据 </p>
<p>　　数据库损坏的发生有很多原因，程度也不同。如果你走运，你可能仅损坏一两个表（如掉电），如果你倒霉，你可能必须替换整个数据目录（如磁盘损坏）。在某些情况下也需要恢复，比如用户错误地删除了数据库或表。不管这些倒霉事件的原因，你将需要实施某种恢复。 </p>
<p>　　如果表损坏但没丢失，尝试用 myisamchk 或 isamchk 修复它们，如果这样的损坏可有修复程序修复，你可能根本不需要使用备份文件。</p>
<p>　　恢复过程涉及两种信息源：你的备份文件和个更新日志。备份文件将表恢复到实施备份时的状态，然而一般表在备份与发生问题之间的时间内已经被修改，更新日志包含了用于进行这些修改的查询。你可以使用日志文件作为 mysql 的输入来重复查询。这已正是为什么要启用更新日志的原因。 </p>
<p>　　恢复过程视你必须恢复的信息多少而不同。实际上，恢复整个数据库比单个表跟容易，因为对于数据库运用更新日志比单个表容易。 </p>
<p>　　4.1 恢复整个数据库 </p>
<p>　　首先，如果你想恢复的数据库是包含授权表的 mysql 数据库，你需要用 --skip -grant-table 选项运行服务器。否则，它会抱怨不能找到授权表。在你已经恢复表后，执行 mysqladmin flush-privileges 告诉服务器装载授权标并使用它们。 </p>
<p>　　将数据库目录内容拷贝到其它某个地方，如果你在以后需要它们。 </p>
<p>　　用最新的备份文件重装数据库。如果你用 mysqldump 产生的文件，将它作为 mysql 的输入。如果你用直接从数据库拷贝来的文件，将它们直接拷回数据库目录，然而，此时你需要在拷贝文件之前关闭数据库，然后重启它。 </p>
<p>　　使用更新日志重复做备份以后的修改数据库表的查询。对于任何可适用的更新日志，将它们作为 mysql 的输入。指定 --one-database 选项使得 mysql 只执行你有兴趣恢复的数据库的查询。如果你知道你需要运用所有更新日志文件，你可以在包含日志的目录下使用这条命令： </p>
<p>　　% ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-database db_name </p>
<p>　　ls 命令生成更新日志文件的一个单列列表，根据服务器产生它们的次序排序（主意：如果你修改任何一个文件，你将改变排序次序，这导致更新日志一错误的次序被运用。） </p>
<p>　　很可能你会是运用某几个更新日志。例如，自从你备份以来产生的更新日志被命名为 update.392、update.393 等等，你可以这样重新运行： </p>
<p>　　%mysql --one-database db_name &lt; update.392 </p>
<p>　　%mysql --one-database db_name &lt; update.393 </p>
<p>　　..... </p>
<p>　　如果你正在实施恢复且使用更新日志恢复由于一个错误建议的 DROP DATABASE、DROP TABLE 或 DELETE 语句造成丢失的信息，在运用更新日志之前，要保证从其中删除这些语句。 </p>
<p>　　4.2 恢复单个表 </p>
<p>　　恢复单个表较为复杂。如果你用一个由 mysqldump 生成的备份文件，并且它不包含你感兴趣的表的数据，你需要从相关行中提取它们并将它们用作 mysql 的输入。这是容易的部分。难的部分是从只运用于该表的更新日志中拉出片断。你会发觉 mysql_find_rows 实用程序对此很有帮助，它从更新日志中提取多行查询。 </p>
<p>　　另一个可能性是使用另一台服务器恢复整个数据库，然后拷贝你想要的表文件到原数据库中。这可能真的很容易！当你将文件拷回数据库目录时，要确保原数据库的服务器关闭。 </p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-14 10:07 <a href="http://www.blogjava.net/microlab4321/articles/136576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL里创建外键时错误的解决 (ERROR 1005, errorno:150)[转] </title><link>http://www.blogjava.net/microlab4321/articles/136416.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136416.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136416.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136416.html</trackback:ping><description><![CDATA[原文出处：<a href="http://www.blogjava.net/Andyluo/archive/2006/10/06/73584.html"><u><font color=#638f27>http://www.blogjava.net/Andyluo/archive/2006/10/06/73584.html</font></u></a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在MySQL里创建外键时（Alter table xxx add constraint fk_xxx foreign key），提示错误，但只提示很简单的信息：ERROR 1005 (HY000): Can't create table '.\env_mon\#sql-698_6.frm' (errno: 150)。根本起不到解决问题的作用。<br><br>要看错误的详细提示，可以使用命令：（在MySQL Manual里搜索&#8220;errno 150&#8221;时找到）<br><br><strong>SHOW ENGINE INNODB STATUS;&nbsp;&nbsp;&nbsp;&nbsp; //</strong>针对用INNODB存储方式的数据库<br><br>在信息中有一组【LATEST FOREIGN KEY ERROR】会有最近错误的详细描述和解决办法。<br>如：<br>Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.<br>（译：不能在&#8220;被reference的表&#8221;里找到包含&#8220;被reference字段&#8221;的索引，或者是两个关联字段类型不匹配）<br><br>（我犯的错误是没有在主表中设置主键-_-!，即第一种原因） <br><br><img height=20 src="http://www.blogjava.net/Emoticons/QQ/17.gif" width=20 border=0>呵呵，今天建数据库等时出的错误是由第二种原因引起，即两个关联字段类型不匹配，万能的互联网啊。。。。。。<br>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:59 <a href="http://www.blogjava.net/microlab4321/articles/136416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql语句学习 </title><link>http://www.blogjava.net/microlab4321/articles/136417.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136417.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136417.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136417.html</trackback:ping><description><![CDATA[<ol>
    <li><strong>数据定义语言（DDL）：</strong> </li>
</ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）<strong>创建数据库（create）：</strong>create database database-name;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg. create database test;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）<strong>删除数据库：</strong>drop database dbname;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg.drop database test;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）<strong>创建新表：</strong>create table tabname(col1 type1 [not null] [primary key],col2 type2 [<strong>not</strong> null],..);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eg.根据已有的表创建新表的例子：create table tab_new like tab_old；create table tab_new as select col1,col2&#8230; from tab_old definition only;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）<strong>删除表：</strong>drop table tabname;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5）<strong>增加列：</strong>alter table tabname add column col type;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6）<strong>添加主键</strong>： alter table tabname add primary key(col) ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7）<strong>删除主键</strong>：alter table tabname drop primary key(col) ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8）<strong>创建索引</strong>：create [unique] index idxname on tabname(col&#8230;.) ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9）<strong>删除索引</strong>：drop index idxname;&nbsp; 注：索引是不可更改的，想更改必须删除重新建；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 10）<strong>创建视图</strong>：create view viewname as select statement;</p>
<p><strong>2. 数据操纵语言（DML）</strong> </p>
<p>&nbsp;&nbsp;&nbsp; <strong>1）查询语句（select）</strong></p>
<p>&nbsp;&nbsp; eg1. select * from table1 where field1 like '%value1%';</p>
<p>&nbsp;&nbsp; eg2. select * from table1 order by field1,field2 [desc];</p>
<p>&nbsp;&nbsp; eg3. select count as totalcount from table1;</p>
<p>&nbsp; eg4. select sum(field1) as sumvalue from table1;</p>
<p>&nbsp; eg5. select avg(field1) as avgvalue from table1;</p>
<p>&nbsp; eg6. select max(field1) as maxvalue from table1;</p>
<p>&nbsp; eg7. select min(field1) as minvalue from table1;</p>
<p>&nbsp; eg8. select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c;（注：此为左外连接，结果集中包括连接表的匹配行，也包括左连接表的所有行）</p>
<p>&nbsp;&nbsp; <strong>2）插入语句（insert）</strong></p>
<p>&nbsp; insert into table1(field1,field2) values(value1,value2);</p>
<p>&nbsp; <strong>3）删除语句（delete）</strong></p>
<p>&nbsp;&nbsp; delete from table1 where 范围;</p>
<p>&nbsp; <strong>4）更新语句（update）</strong></p>
<p>&nbsp;&nbsp; update table1 set field1=value1 where 范围;</p>
<p><strong>3. 数据控制语言（DCL）</strong> </p>
<p>&nbsp;&nbsp; <strong>1）授予权限语句（GRANT）</strong></p>
<p><strong>&nbsp;&nbsp; </strong>GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION;</p>
<p>&nbsp;&nbsp; 其中：privileges可为如下限定符：ALTER 修改表和索引、CREATE （创建数据库和表）、DELETE（ 删除表中已有的记录）、DROP （删除数据库和表）、INDEX （创建或删除索引）、INSERT（ 向表中插入新行）、REFERENCE（ 未用）、SELECT （检索表中的记录）、UPDATE （修改现存表记录）、FILE （读或写服务器上的文件）、PROCESS（ 查看服务器中执行的线程信息或杀死线程）、RELOAD （重载授权表或清空日志、主机缓存或表缓存）、SHUTDOWN（ 关闭服务器）、ALL 所有；ALL PRIVILEGES同义词、USAGE （特殊的&#8220;无权限&#8221;权限）</p>
<p>&nbsp; columns：权限运用的列，它是可选的，并且你只能设置列特定的权限。如果命令有多于一个列，应该用逗号分开它们；</p>
<p>&nbsp; what：权限运用的级别。权限可以是全局的（适用于所有数据库和所有表）、特定数据库（适用于一个数据库中的所有表）或特定表的。可以通过指定一个columns字句是权限是列特定的。</p>
<p>&nbsp;&nbsp; user ：权限授予的用户，它由一个用户名和主机名组成。MySQL中的一个用户名就?悄懔臃衿魇敝付ǖ挠没?该名字不必与你的Unix登录名或Windows名联系起来。缺省地，如果你不明确指定一个名字，客户程序将使用<br>你的登录名作为MySQL用户名。这只是一个约定。你可以在授权表中将该名字改为nobody，然后以nobody连接<br>执行需要超级用户权限的操作。</p>
<p>&nbsp;&nbsp; password：赋予用户的口令，它是可选的。如果你对新用户没有指定IDENTIFIED BY子句，该用户不赋给口令（不安全）。对现有用户，任何你指定的口令将代替老口令。如果你不指定口令，老口令保持不变，当你用IDENTIFIED BY<br>时，口令字符串用改用口令的字面含义，GRANT将为你编码口令，不要象你用SET PASSWORD 那样使用password()<br>函数。</p>
<p>&nbsp;&nbsp;&nbsp; WITH GRANT OPTION子句是可选的。如果你包含它，用户可以授予权限通过GRANT语句授权给其它用户。你可以用该子句给与其它用户授权的能力。</p>
<p>&nbsp;&nbsp; 用户名、口令、数据库和表名在授权表记录中是大小写敏感的，主机名和列名不是。<br>&nbsp;&nbsp; eg1. 创建一个超级用户test1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; grant all privilleges on *.* to test1@localhost identified by '123456' with grant option;<br>&nbsp;&nbsp; eg2.&nbsp; 创建一个只能查询的用户 test2<br>mysql&gt; grant select on *.* to test2@localhost identified by '9876543';</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp; 2) 撤权并删除用户（revoke）</strong> <br>&nbsp;&nbsp;&nbsp;&nbsp; 要取消一个用户的权限，使用REVOKE语句。REVOKE的语法非常类似于GRANT语句，除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句：<br><br>&nbsp;&nbsp;&nbsp;&nbsp; revoke privileges (columns) ON what FROM user<br><br>&nbsp;&nbsp;&nbsp;&nbsp; user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配，你可以用GRANT<br>语句授权，然后用REVOKE语句只撤销部分权限。REVOKE语句只删除权限，而不删除用户。即使你撤销了所有<br>权限，在user表中的用户记录依然保留，这意味着用户仍然可以连接服务器。要完全删除一个用户，你必须<br>用一条DELETE语句明确从user表中删除用户记录：<br><br>&nbsp;&nbsp;&nbsp; #mysql -u root mysql<br>&nbsp;&nbsp;&nbsp; DELETE FROM user WHERE User="user_name" and Host="host_name";</p>
<p>&nbsp;&nbsp;&nbsp; FLUSH PRIVILEGES;　<br>&nbsp;&nbsp; DELETE语句删除用户记录，而FLUSH语句告诉服务器重载授权表。（当你使用GRANT和REVOKE语句时，表自动重载，而你直接修改授权表时不是。）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; eg. 删除用户test1<br>&nbsp;&nbsp;&nbsp; &nbsp;revoke all on *.* from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#50;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;"><u><font color=#638f27>test2@localhost</font></u></a>;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; use mysql;<br>&nbsp;&nbsp;&nbsp;&nbsp; delete from user where user='test' and host='localhost';<br>&nbsp;&nbsp;&nbsp;&nbsp; flush privileges;<br><br>&nbsp;&nbsp;<strong>&nbsp;&nbsp;&nbsp;3）提交语句（commit）</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>4）回滚语句（rollback）</strong></p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:59 <a href="http://www.blogjava.net/microlab4321/articles/136417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】关于MYSQL数据的导出导入与版本的转换 </title><link>http://www.blogjava.net/microlab4321/articles/136413.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136413.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136413.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136413.html</trackback:ping><description><![CDATA[原文出处：<a href="http://bbs.mysql.cn/viewthread.php?tid=72&amp;extra=page%3D1%26filter%3Ddigest"><u><font color=#638f27>http://bbs.mysql.cn/viewthread.php?tid=72&amp;extra=page%3D1%26filter%3Ddigest<br></font></u></a><span class=bold>关于MYSQL数据的导出导入与版本的转换</span><br><br>
<div style="FONT-SIZE: 12px">最近看到好多人在询问mysql 导入导出的问题，于是就简单的总结一些我的使用经验，供大家参考，有不合理的地方欢迎交流！<br><br>一、Mysql 数据的导出<br><br>&nbsp; &nbsp;有的站长经常用一种最直接的办法就是拷贝数据库文件夹的办法，这个方法确实简单，但是不提倡，在跨版本或者跨不同字符集系统是很容易出问题。再说了数据库4.1版本有两种存储数据的方式在配置的时候可选，一种是和以前一样的每个数据库存放在单独的文件夹里，另一种叫什么来着我忘了，这种所有的数据库都放在一个文件里，巨大的一个文件！，所以对于后者就不可以用拷贝的方法了，用什么呢？下面介绍：<br><br>&nbsp; &nbsp;就是mysql 自带的工具 mysqldump ，这个工具十分强大，可以导出数据，并且可以导出不同版本的数据、也可以导出用于其他数据库的数据，太牛了。 这个工具实在命令行、cmd下用的 ，如果你的msyql/bin目录没有配置在系统的环境变量里，就先cd到mysql/bin目录。<br>&nbsp; &nbsp;<br>1、&nbsp; &nbsp; 先介绍简单得导出： mysqldump -u 数据库用户名 -p&nbsp;&nbsp;数据库名称 [表名] &gt; 导出到文件的路径名<br><br>&nbsp; &nbsp;例如：我要导出 test_db 这个数据库&nbsp;&nbsp;我的数据库用户为 root 没有密码（没有密码就不用加 -p 了）:<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;mysqldump -u root test_db &gt; c:\test.sql&nbsp; &nbsp; 这样就可以到处test这个数据库了<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;如果我要导出 test 数据库中的user 表&nbsp;&nbsp;用 ajin 这个用户 密码是 123<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;mysqldump -u ajin -p test_db user &gt;c:\test_user_table.sql&nbsp; &nbsp;回车后提示输入密码就可以了<br><br>2、 在导出过程中改变数据库默认的字符集<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br>&nbsp; &nbsp;例如： 我要导出 test_db 这个数据库&nbsp;&nbsp;转换编码为 utf8 (utf8 我最常用的)<br>&nbsp;&nbsp;<br>&nbsp; &nbsp;&nbsp; &nbsp;mysqldump -u ajin -p --default-character-set=utf8&nbsp;&nbsp;test_db &gt;c:\test.sql&nbsp; &nbsp; 就可以了&nbsp;&nbsp;<br>&nbsp; &nbsp;&nbsp;&nbsp;转换成其他字符只需替换 utf8 就可以了<br><br>3、导出不同版本数据或者导出给数据库用的数据<br><br>&nbsp;&nbsp;例如：我的数据库 Mysql 4.1 的 我要导出一个 默认字符集 utf8 的 4.0版本的数据<br><br>&nbsp; &nbsp; mysqldump -u ajin -p test_db --compatible=mysql40 --default-character-set=utf8 test_db &gt;c:\test.sql&nbsp; &nbsp; <br><br>&nbsp; &nbsp;就可完成了所谓的降级 --compatible= 可以跟得参数有 mysql323 mysql40 oracle mssql db2 等等<br><br>导出就介绍这些常用的，其实还有好多好多。。省略一千字.....<br><br>二 数据的导入&nbsp;&nbsp;<br><br>&nbsp; &nbsp;这个相对就比较简单了，&nbsp; &nbsp;这个在命令行、cmd下用的 ，如果你的msyql/bin目录没有配置在系统的环境变量里，就先cd到mysql/bin目录。<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;比如我要导入 test.sql 这个数据到&nbsp;&nbsp;discuz_db 这个数据库<br><br>&nbsp;&nbsp;mysql -u ajin -p discuz_db &lt;c:\test.sql&nbsp;&nbsp;回车提示输入密码 ，如果没有密码的用户 就不用加 -p 了<br><br>好了就先总结这么多，欢迎大家交流，其中不免会有错误，请多指教~~<br><br></div>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:58 <a href="http://www.blogjava.net/microlab4321/articles/136413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql过招 </title><link>http://www.blogjava.net/microlab4321/articles/136410.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136410.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136410.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136410.html</trackback:ping><description><![CDATA[这几天在整MySql，还整出了好几个问题，也学会了几招，共享之，<img height=20 src="http://www.blogjava.net/Emoticons/QQ/14.gif" width=20 border=0><br>1）在Linux上装了MySql后，别的机器用root用户连接时，发现连接不上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可用如下命令解决该问题：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update user set host='%' where user='root' and host='localhost';<br>2)&nbsp; 修改用户密码的命令：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update user set password=PASSWORD('新密码') and user='root';<br>3）恢复mysql数据库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可在命令行下敲下如下命令，具体使用见下例：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql -u root -proot -D 数据库名 &lt; "C:\tmp\backup.sql";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中第一个root为用户名，第二个root为密码；<br>4）备份MySql数据库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在命令行下使用mysqldump命令，举例如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i)&nbsp;&nbsp; mysqldump -u root -proot 数据库名 &gt; backup.sql<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii)&nbsp;&nbsp; mysqldump -u root -proot 数据库名 &gt; C:\tmp\backup.sql 
<img src ="http://www.blogjava.net/microlab4321/aggbug/136410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:46 <a href="http://www.blogjava.net/microlab4321/articles/136410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP通过JDBC驱动MySQL数据库方法 </title><link>http://www.blogjava.net/microlab4321/articles/136408.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136408.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136408.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136408.html</trackback:ping><description><![CDATA[关于MySQL数据库安装请参考下面这篇文章：<br><a class="" title="" href="http://blog.csdn.net/javamxj/archive/2005/01/13/251861.aspx" target=_blank><u><font color=#0000ff>快速上手 MySQL －－图形化操作详解</font></u></a><br><br>关于eclipse的使用，请参考我的blog其他文章。<br><a class="" title="" href="http://blog.csdn.net/rickhunterchen/archive/2005/09/11/477382.aspx" target=_blank><font color=#0000ff><u>在Eclipse3.1中如何配置Lomboz3.1</u></font></a><br><a class="" title="" href="http://blog.csdn.net/rickhunterchen/archive/2005/09/11/477386.aspx" target=_blank><u><font color=#0000ff>在Eclipse3.1中如何使用Lomboz3.1开发JSP</font></u></a><br><br><br>1、首先在MySQL数据库中建立books数据库，再建book表。<br>然后插入数据。SQL语言如下：<br><br>create database books;<br><br>use books;<br>create table book(bookId varchar(50),bookName varchar(50),publisher varchar(100),price float,constraint pk_book primary key(bookId))<span style="FONT-WEIGHT: bold">TYPE=MyISAM,default character set gbk</span>;（加粗字体是我在建表时就对默认字体进行的固定，因为我没有使用javamxj的在windows中加my.ini文件的做法）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>insert into book values('1001','Tomcat与Java Web开发技术详解','电子工业出版社',45.00);<br>insert into book values('1002','精通Struts：基于MVC的Java Web设计与开发','电子工业出版社',49.00);<br>insert into book values('1003','精通Hibernater：Java对象持久化技术详解','电子工业出版社',59.00);<br>insert into book values('1004','精通EJB','电子工业出版社',59.00);<br>insert into book values('1005','J2EE应用与BEA Weblogic Server','电子工业出版社',56.00);<br><br>2、接着在eclipse3.1中建立一个名为MySQL的项目：<br><br>3、建议mysql.jsp文件。输入以下代码：<br>&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"%&gt;<br>&lt;html&gt;<br>&lt;body&gt;<br>以下是从MySQL数据库读取的数据：&lt;hr&gt;<br>&lt;table border=1&gt;<br>&lt;tr&gt;&lt;td&gt;ID&lt;/td&gt;&lt;td&gt;书名&lt;/td&gt;&lt;td&gt;出版社&lt;/td&gt;&lt;td&gt;价格&lt;/td&gt;&lt;/tr&gt;<br><br>&lt;%<br>&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver").newInstance();<br>&nbsp;&nbsp; Connection con=java.sql.DriverManager.getConnection("jdbc:mysql://localhost/BookDB?useUnicode=true&amp;characterEncoding=GBK","t14cwf","cwf");<br>&nbsp;&nbsp; Statement stmt=con.createStatement();<br>&nbsp;&nbsp;&nbsp; ResultSet rst=stmt.executeQuery("select * from book");<br>&nbsp;&nbsp;&nbsp; while(rst.next())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.println("&lt;tr&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.println("&lt;td&gt;"+rst.getString("bookId")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.println("&lt;td&gt;"+rst.getString("bookName")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.println("&lt;td&gt;"+rst.getString("publisher")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.println("&lt;td&gt;"+rst.getFloat("price")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.println("&lt;/tr&gt;");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //关闭连接、释放资源<br>&nbsp;&nbsp;&nbsp; rst.close();<br>&nbsp;&nbsp;&nbsp; stmt.close();<br>&nbsp;&nbsp;&nbsp; con.close();<br>&nbsp;&nbsp;&nbsp; %&gt;<br>&lt;/table&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br><br>4、将mysql-connector-java-3.1.10-bin.jar文件复制到tomcat\common\lib<br><br>5、可以在eclipse中运行jsp文件了。<br><br>6、运行结果：<br><br><img height=472 alt=MySQL.jpg src="http://www.blogjava.net/images/blogjava_net/rickhunter/MySQL.jpg" width=792 border=0><br><br>很多人连接不上数据库最多的原因还在于web.xml文件问题。<br>一下是lomboz自动生成的web.xml：<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;display-name&gt;<br>&nbsp;&nbsp;&nbsp; MySQL&lt;/display-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;<br>&lt;/web-app&gt;<br>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:45 <a href="http://www.blogjava.net/microlab4321/articles/136408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL索引</title><link>http://www.blogjava.net/microlab4321/articles/136407.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136407.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136407.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136407.html</trackback:ping><description><![CDATA[<font size=2>本文介绍了数据库索引，及其优、缺点。针对MySQL索引的特点、应用进行了详细的描述。分析了如何避免MySQL无法使用，如何使用EXPLAIN分析查询语句，如何优化MySQL索引的应用。本文摘自《MySQL 5权威指南》(3rd)的8.9节。(2007.07.05最后更新)<br><br>&nbsp;&nbsp;&nbsp; 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)，它们包含着对数据表里所有记录的引用指针。<br>&nbsp;&nbsp;&nbsp; 注：[1]索引不是万能的！索引可以加快数据检索操作，但会使数据修改操作变慢。每修改数据记录，索引就必须刷新一次。为了在某种程序上弥补这一缺陷，许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新，对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合，DELAY_KEY_WRITE选项的作用将非常明显。[2]另外，索引还会在硬盘上占用相当大的空间。因此应该只为最经常查询和最经常排序的数据列建立索引。注意，如果某个数据列包含许多重复的内容，为它建立索引就没有太大的实际效果。<br>&nbsp;&nbsp;&nbsp; 从理论上讲，完全可以为数据表里的每个字段分别建一个索引，但MySQL把同一个数据表里的索引总数限制为16个。<br>&nbsp;&nbsp;&nbsp; 1. InnoDB数据表的索引<br>&nbsp;&nbsp;&nbsp; 与MyISAM数据表相比，索引对InnoDB数据的重要性要大得多。在InnoDB数据表上，索引对InnoDB数据表的重要性要在得多。在InnoDB数据表上，索引不仅会在搜索数据记录时发挥作用，还是数据行级锁定机制的苊、基础。"数据行级锁定"的意思是指在事务操作的执行过程中锁定正在被处理的个别记录，不让其他用户进行访问。这种锁定将影响到(但不限于)SELECT...LOCK IN SHARE MODE、SELECT...FOR UPDATE命令以及INSERT、UPDATE和DELETE命令。<br>&nbsp;&nbsp;&nbsp; 出于效率方面的考虑，InnoDB数据表的数据行级锁定实际发生在它们的索引上，而不是数据表自身上。显然，数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。<br>&nbsp;&nbsp;&nbsp; 2. 限制<br>&nbsp;&nbsp;&nbsp; 如果WEHERE子句的查询条件里有不等号(WHERE coloum != ...)，MySQL将无法使用索引。<br>&nbsp;&nbsp;&nbsp; 类似地，如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) = ...)，MySQL也将无法使用索引。<br>&nbsp;&nbsp;&nbsp; 在JOIN操作中(需要从多个数据表提取数据时)，MySQL只有在主键和外键的数据类型相同时才能使用索引。<br>&nbsp;&nbsp;&nbsp; 如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP，MySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说，如果查询条件是LIKE 'abc%'，MySQL将使用索引；如果查询条件是LIKE '%abc'，MySQL将不使用索引。<br>&nbsp;&nbsp;&nbsp; 在ORDER BY操作中，MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此，在涉及多个数据表查询里，即使有索引可用，那些索引在加快ORDER BY方面也没什么作用)<br>&nbsp;&nbsp;&nbsp; 如果某个数据列里包含许多重复的值，就算为它建立了索引也不会有很好的效果。比如说，如果某个数据列里包含的净是些诸如"0/1"或"Y/N"等值，就没有必要为它创建一个索引。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 普通索引、唯一索引和主索引<br>&nbsp;&nbsp;&nbsp; 1. 普通索引<br>&nbsp;&nbsp;&nbsp; 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此，应该只为那些最经常出现在查询条件(WHERE column = ...)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能，就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。<br>&nbsp;&nbsp;&nbsp; 2. 唯一索引<br>&nbsp;&nbsp;&nbsp; 普通索引允许被索引的数据列包含重复的值。比如说，因为人有可能同名，所以同一个姓名在同一个"员工个人资料"数据表里可能出现两次或更多次。<br>&nbsp;&nbsp;&nbsp; 如果能确定某个数据列将只包含彼此各不相同的值，在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处：一是简化了MySQL对这个索引的管理工作，这个索引也因此而变得更有效率；二是MySQL会在有新记录插入数据表时，自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了；如果是，MySQL将拒绝插入那条新记录。也就是说，唯一索引可以保证数据记录的唯一性。事实上，在许多场合，人们创建唯一索引的目的往往不是为了提高访问速度，而只是为了避免数据出现重复。<br>&nbsp;&nbsp;&nbsp; 3. 主索引<br>&nbsp;&nbsp;&nbsp; 在前面已经反复多次强调过：必须为主键字段创建一个索引，这个索引就是所谓的"主索引"。主索引与唯一索引的唯一区别是：前者在定义时使用的关键字是PRIMARY而不是UNIQUE。<br>&nbsp;&nbsp;&nbsp; 4. 外键索引<br>&nbsp;&nbsp;&nbsp; 如果为某个外键字段定义了一个外键约束条件，MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。<br>&nbsp;&nbsp;&nbsp; 5. 复合索引<br>&nbsp;&nbsp;&nbsp; 索引可以覆盖多个数据列，如像INDEX(columnA, columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引，就可以使用复合索引INDEX(columnA, columnB)。不过，这种用法仅适用于在复合索引中排列在前的数据列组合。比如说，INDEX(A, B, C)可以当做A或(A, B)的索引来使用，但不能当做B、C或(B, C)的索引来使用。<br>&nbsp;&nbsp;&nbsp; 6. 索引的长度<br>&nbsp;&nbsp;&nbsp; 在为CHAR和VARCHAR类型的数据列定义索引时，可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个字段所允许的最大字符个数)。这么做的好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。在绝大多数应用里，数据库中的字符串数据大都以各种各样的名字为主，把索引的长度设置为10~15个字符已经足以把搜索范围缩小到很少的几条数据记录了。<br>&nbsp;&nbsp;&nbsp; 在为BLOB和TEXT类型的数据列创建索引时，必须对索引的长度做出限制；MySQL所允许的最大索引长度是255个字符。<br><br>&nbsp;&nbsp;&nbsp; 全文索引<br>&nbsp;&nbsp;&nbsp; 文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字，普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现，这对MySQL来说很复杂，如果需要处理的数据量很大，响应时间就会很长。<br>&nbsp;&nbsp;&nbsp; 这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时，MySQL将把在文本中出现的所有单词创建为一份清单，查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建，也可以等日后有必要时再使用下面这条命令添加：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALTER TABLE tablename ADD FULLTEXT(column1, column2)<br>&nbsp;&nbsp;&nbsp; 有了全文索引，就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM tablename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE MATCH(column1, column2) AGAINST('word1', 'word2', 'word3')<br>&nbsp;&nbsp;&nbsp; 上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。<br>&nbsp;&nbsp;&nbsp; 注解：InnoDB数据表不支持全文索引。<br><br>&nbsp;&nbsp;&nbsp; 查询和索引的优化<br>&nbsp;&nbsp;&nbsp; 只有当数据库里已经有了足够多的测试数据时，它的性能测试结果才有实际参考价值。如果在测试数据库里只有几百条数据记录，它们往往在执行完第一条查询命令之后就被全部加载到内存里，这将使后续的查询命令都执行得非常快--不管有没有使用索引。只有当数据库里的记录超过了1000条、数据总量也超过了MySQL服务器上的内存总量时，数据库的性能测试结果才有意义。<br>&nbsp;&nbsp;&nbsp; 在不确定应该在哪些数据列上创建索引的时候，人们从EXPLAIN SELECT命令那里往往可以获得一些帮助。这其实只是简单地给一条普通的SELECT命令加一个EXPLAIN关键字作为前缀而已。有了这个关键字，MySQL将不是去执行那条SELECT命令，而是去对它进行分析。MySQL将以表格的形式把查询的执行过程和用到的索引(如果有的话)等信息列出来。<br>&nbsp;&nbsp;&nbsp; 在EXPLAIN命令的输出结果里，第1列是从数据库读取的数据表的名字，它们按被读取的先后顺序排列。type列指定了本数据表与其它数据表之间的关联关系(JOIN)。在各种类型的关联关系当中，效率最高的是system，然后依次是const、eq_ref、ref、range、index和All(All的意思是：对应于上一级数据表里的每一条记录，这个数据表里的所有记录都必须被读取一遍--这种情况往往可以用一索引来避免)。<br>&nbsp;&nbsp;&nbsp; possible_keys数据列给出了MySQL在搜索数据记录时可选用的各个索引。key数据列是MySQL实际选用的索引，这个索引按字节计算的长度在key_len数据列里给出。比如说，对于一个INTEGER数据列的索引，这个字节长度将是4。如果用到了复合索引，在key_len数据列里还可以看到MySQL具体使用了它的哪些部分。作为一般规律，key_len数据列里的值越小越好(意思是更快)。<br>&nbsp;&nbsp;&nbsp; ref数据列给出了关联关系中另一个数据表里的数据列的名字。row数据列是MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。row数据列里的所有数字的乘积可以让我们大致了解这个查询需要处理多少组合。<br>&nbsp;&nbsp;&nbsp; 最后，extra数据列提供了与JOIN操作有关的更多信息，比如说，如果MySQL在执行这个查询时必须创建一个临时数据表，就会在extra列看到using temporary字样。</font><br>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:44 <a href="http://www.blogjava.net/microlab4321/articles/136407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不用IDE工具使用JDBC连接MySQL </title><link>http://www.blogjava.net/microlab4321/articles/136404.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136404.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136404.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136404.html</trackback:ping><description><![CDATA[最近看到网上不少朋友说用ＪＤＢＣ连不上MySQL．有的说用IDE做没问题，但不用IDE部署，自己部署就不成功．想知道为什么？<br>&nbsp;&nbsp;&nbsp; 确实，我记得我那时也是搞不懂，也很郁闷．其实问题很简单，一、要注意web.xml,这可不是看看而已，写配置文件是j2ee的一件大事。二、注意驱动放置的位置。三、注意项目的结构，你不要把jsp文件丢到WEB-INF文件夹下面去了。<br>&nbsp;&nbsp;&nbsp; tomcat版本: tomcat-5.0.28;<br>&nbsp;&nbsp;&nbsp; mysql版本: mysql-4.1.13-win32;<br><br>&nbsp;&nbsp;&nbsp; 废话少说， 我来演示：<br>&nbsp;&nbsp;&nbsp; 1、启动mysql。<br>&nbsp;&nbsp;&nbsp; <img height=431 alt=Snap1.jpg src="http://www.blogjava.net/images/blogjava_net/rickhunter/mysql/Snap1.jpg" width=668 border=0><br><br>&nbsp;&nbsp;&nbsp; <img height=431 alt=Snap4.jpg src="http://www.blogjava.net/images/blogjava_net/rickhunter/mysql/Snap4.jpg" width=668 border=0><br><br>&nbsp;&nbsp;&nbsp; 2、建数据库，建表，我这都不演示了，请参考相关文章。<br><br>&nbsp;&nbsp;&nbsp; 3、在tomcat中的webapps文件中建一个SQL文件夹,在SQL文件夹中再建一个WEB-INF文件夹,再在WEB-INF文件夹中建一个classes文件夹和web.xml文件。<br><br>&nbsp;&nbsp;&nbsp; 4、web.xml代码如下：<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;?xml version="1.0" ?&gt;<br>&nbsp;&nbsp;&nbsp; &lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;web-app&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;mysql.jsp&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/web-app&gt;<br><br>&nbsp;&nbsp;&nbsp; 5、在SQL文件夹中建一个mysql.jsp。代码如下：<br><br>&nbsp;&nbsp;&nbsp; &lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"%&gt;<br>&nbsp;&nbsp;&nbsp; &lt;html&gt;<br>&nbsp;&nbsp;&nbsp; &lt;body&gt;<br>&nbsp;&nbsp;&nbsp; 以下是从MySQL数据库读取的数据：&lt;hr&gt;<br>&nbsp;&nbsp;&nbsp; &lt;table border=1&gt;<br>&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td&gt;ID&lt;/td&gt;&lt;td&gt;书名&lt;/td&gt;&lt;td&gt;出版社 &lt;/td&gt;&lt;td&gt;价格&lt;/td&gt;&lt;/tr&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;%<br><br>&nbsp; &nbsp;&nbsp; &nbsp; Class.forName("com.mysql.jdbc.Driver").newInstance();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Connection &nbsp;&nbsp;&nbsp; con=java.sql.DriverManager.getConnection("jdbc:mysql://localhost/BookDB?useUnicode=true&amp;characterEncoding=GBK","t14cwf","cwf");<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Statement stmt=con.createStatement();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSet rst=stmt.executeQuery("select * from book");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(rst.next())<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.println("&lt;tr&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.println("&lt;td&gt;"+rst.getString("bookId")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.println("&lt;td&gt;"+rst.getString("bookName")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.println("&lt;td&gt;"+rst.getString("publisher")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; out.println("&lt;td&gt;"+rst.getFloat("price")+"&lt;/td&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.println("&lt;/tr&gt;");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //关闭连接、释放资源<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rst.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stmt.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; con.close();<br>&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/html&gt;<br><br>&nbsp;&nbsp;&nbsp; 6、将mysql-connector-java-3.1.10-bin.jar放到tomcat\common\lib中。<br><br>&nbsp;&nbsp;&nbsp; 7、启动tomcat.<br>&nbsp;&nbsp;&nbsp; <img height=431 alt=Snap2.jpg src="http://www.blogjava.net/images/blogjava_net/rickhunter/mysql/Snap2.jpg" width=668 border=0><br><br>&nbsp;&nbsp;&nbsp; 8、在浏览器中浏览: <br>&nbsp;&nbsp;&nbsp; <img height=742 alt=Snap8.jpg src="http://www.blogjava.net/images/blogjava_net/rickhunter/mysql/Snap8.jpg" width=1024 border=0><br><br>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:43 <a href="http://www.blogjava.net/microlab4321/articles/136404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql乱码问题终极解决 </title><link>http://www.blogjava.net/microlab4321/articles/136403.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136403.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136403.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136403.html</trackback:ping><description><![CDATA[今天要使用mysql做一个功能的实验，但是发现写进去的中文变成了乱码，可是数据库的编码都改成gbk了，而且jdbc连接字符串和my.ini的default-character-set配置项也改成了gbk，但是连接的时候还是乱码，通过mysql的原生客户端连接则不会出现这种情况。最终的解决方法是将所有的字符集都改成utf-8。<br>用gbk、gb2312 之类的时候都可能会出现问题，而utf-8作为一个标准的多语言字符集则解决乱码的终极方案。所以推荐大家在其他遇到中文的情况下也使用utf-8。 
<img src ="http://www.blogjava.net/microlab4321/aggbug/136403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:42 <a href="http://www.blogjava.net/microlab4321/articles/136403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 MySql 的 SQL 语言</title><link>http://www.blogjava.net/microlab4321/articles/136402.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136402.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136402.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136402.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;目前常用的数据库有 Oracle 公司的 Oracle ， Microsoft 公司的 SQL Server ， IBM 公司的 DB2 和 MySql 公司的 MySql, 而免费的数据库目前只有 MySql ，当然盗版的不算。 &nbsp; SQL (Structured Query Language) 结构化查询语言是目前一个国际上标准的数据库专用语言。 不过不同的数据库...&nbsp;&nbsp;<a href='http://www.blogjava.net/microlab4321/articles/136402.html'>阅读全文</a><img src ="http://www.blogjava.net/microlab4321/aggbug/136402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:41 <a href="http://www.blogjava.net/microlab4321/articles/136402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 的命令行来操作 MySQL 的指令(转) </title><link>http://www.blogjava.net/microlab4321/articles/136401.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136401.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136401.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136401.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136401.html</trackback:ping><description><![CDATA[<p>记了一些用 Windows 的命令行来操作 MySQL 的指令。</p>
<p>摘要<br>连结 MySQL<br>-&gt;mysql -u username -p<br>username 是你的帐号名称。</p>
<p>远程连结<br>-&gt;mysql -h hostname -u username -p<br>hostname 是 MySQL 主机的名称。</p>
<p>显示全部的数据库<br>SHOW DATABASES;<br>mysql 是 MySQL 用来储存帐号和权限的数据库，不能删除。</p>
<p>选择数据库<br>USE database_name;</p>
<p>显示数据库里的资料表<br>SHOW TABLES;</p>
<p>显示资料表的信息<br>DESCRIBE table_name;</p>
<p>注销 MySQL 显示器<br>\q</p>
<p>SQL 的执行指令可以从文本文件内输入。<br>SOURCE file_name<br>如果没有登入 MySQL 的显示器，用：<br>-&gt;mysql -u username -p &lt; file_name</p>
<p>Primary key - 用来识别字段的 key。<br>Foreign key - 代表连结的资料表。再另一个资料表里的 primary key。</p>
<p>使用 MySQL<br>建立数据库<br>CREATE DATABASE employee;<br>这会建立一个叫 employee 的数据库。</p>
<p>建立资料表<br>CREATE TABLE table_name (table definition) [type=table_type];<br>完整格式：</p>
<p>程序代码:</p>
<div class=code>
<p>CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name [(create_definition, ...)]<br>[table_options] [select_statement];<br>or<br>CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name LIKE old_table_name;<br>create_definition:<br>col_name TYPE [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]<br>[PRIMARY KEY] [reference_definition]<br>or PRIMARY KEY (index_col_name,...)<br>or KEY [index_name] (index_col_name,...)<br>or INDEX [index_name] (index_col_name,...)<br>or UNIQUE [INDEX] [index_name] (index_col_name,...)<br>or FULLTEXT [INDEX] [index_name] (index_col_name,...)<br>or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)<br>[reference_definition]<br>or CHECK (expression)</p>
</div>
<p>TEMPORARY 关键词是用来建立暂时的资料表，当你的连结阶段结束后会自动删除。<br>CREATE TEMPORARY TABLE table_name;<br>IF NOT EXISTS 只有在资料表不存在时才会建立。<br>CREATE TABLE IF NOT EXISTS table_name;<br>LIKE old_table_name 会依照 old_table_name 的构造来建立新的资料表。<br>字段定义 (column definition) 可用的选项：<br>NOT NULL 或 NULL 来定义字段不能包括 NULL (NOT NULL) 或可以包括 NULL (NULL)。<br>默认值是可以包括 NULL。<br>DEFAULT 可用来宣告字段的默认值。<br>AUTO_INCREMENT 会自动产生连续的数字。产生的数字会大于资料表内的最大数值。<br>每个资料表只能有一个 AUTO_INCREMENT 字段。他必须是索引。<br>任何 PRIMARY KEY 的字段会自动建立索引。<br>PRIMARY KEY 可用来宣告 PRIMARY KEY 的字段。<br>REFERENCES 可用来宣告字段是 FOREIGN KEY，只能用在 InnoDB 资料表。<br>下面的关键词可用来宣告字段的资料：<br>PRIMARY KEY 来设定多字段的 PRIMARY KEY，跟着是字段的名称。<br>INDEX 和 KEY 是一样的关键词，用来设定索引。<br>UNIQUE 表示字段是独特的，一样是索引。<br>FULLTEXT 可用来建立 FULLTEXT 索引，可用于 TEXT, CHAR, VARCHAR 类型。<br>FULLTEXT 只能用在 MyISAM 资料表。<br>FOREIGN KEY 可用来宣告 FOREIGN KEY。<br>下面的选项可以不用，通常是用在最佳化：<br>AUTO_INCREMENT = #<br>设定开始的 AUTO_INCREMENT 数值。<br>AVG_ROW_LENGTH = #<br>可用来估计你要的字段长度。<br>CHECKSUM = 1<br>开启资料表的核对值。可用来修复损坏的资料表。只能用在 MyISAM。<br>COMMENT = "字符串"<br>用来输入资料表的批注。<br>MAX_ROWS = #<br>设定资料表允许的字段值 (最大)。<br>MIN_ROWS = #<br>设定资料表允许的字段值 (最小)。<br>PACK_KEYS = {0 | 1 | DEFAULT}<br>MySQL 的预设是会压缩 CHAR, VARCHAR, 和 TEXT 的字符串。<br>如要关闭选 0。<br>DELAY_KEY_WRITE = {0 | 1}<br>延后 key 的更新，直到关闭数据库。只能用在 MyISAM。<br>ROW_FORMAT = {default | dynamic | fixed | compress}<br>用来设定字段的储存方式。只能用在 MyISAM。<br>RAID_TYPE = {1 | STRIPED | RAID0} RAID_CHUNKS = # RAID_CHUNKSIZE = #<br>RAID 的设定。<br>UNION = (table_name, [table_name...])<br>用于 MERGE 资料表。允许你设定 MERGE 使用的资料表。<br>INSERT_METHOD = {NO | FIRST | LAST}<br>用于 MERGE 资料表。设定要插入资料到哪个资料表。<br>DATA_DIRECTORY = "绝对路径"<br>储存资料的目录。<br>INDEX_DIRECTORY = "绝对路径"<br>储存索引的目录。</p>
<p>字段和数据类型<br>数字类型<br>INT 和 FLOAT<br>范例：salary decimal(10, 2) - 宽度 10 和 2 个小数点。<br>可以用 UNSIGNED 和 ZEROFILL 关键词。<br>UNSIGNED 只能包括零或整数。ZEROFILL 会显示数字前的零数。<br>整数和变化<br>可以缩写成 INT，大小是 4 bytes。<br>TINYINT 是 1 byte，跟 BIT 和 BOOL 相同。<br>SMALLINT 是 2 bytes。<br>MEDIUMINT 是 3 bytes。<br>BIGINT 是 8 bytes。<br>FLOAT 是单精密度的浮点数。<br>DOUBLE 是双精密度的浮点数，跟 REAL 和 DOUBLE PRECISION 相同。<br>字符串和文字类型<br>CHAR 可用来储存固定长度的字符串，如果不设定长度，预设是 CHAR(1)。<br>最大值是 255 个字符。<br>固定长度有时候会比 VARCHAR 来的快。<br>如果跟着的是 BINARY 关键词，比较字符串的时候必须注意大小写。<br>VARCHAR 可用来储存动态的字符串，如果预先不知道字符串的长度，范围是 0 到 255。<br>TEXT 可储存较长的字符串，最大到 65535 个字符或 bytes。<br>BLOB 代表 binary large object，用来储存 binary 资料，最大到 65535 个字符或 bytes。比较字符串时需要注意大小写。<br>TINYTEXT 或 TINYBLOB 可储存小于 255 个字符或 bytes 的字符串。<br>MEDIUMTEXT 或 MEDIUMBLOB 可储存到 16777215 个字符或 bytes 的字符串。<br>LONGTEXT 或 LONGBLOB 可储存到 4294,967,295 个字符或 bytes 的字符串。<br>ENUM 可用来储存自订的值。<br>范例：gender enum('m', 'f')<br>表示储存的直是 m 和 f。也可储存 NULL，所以可能的直是 m, f, NULL, 或 error。<br>SET 跟 ENUM 类似不过可以储存其它的 ENUM 值。<br>日期和时间类型<br>date 可用来储存日期，以 YYYY-MM-DD 显示。<br>time 可用来储存时间，以 HH:MM:SS 显示。<br>datetime 包含了日期和时间，以 YYYY-MM-DD HH:MM:SS 显示。<br>timestamp 储存插入字段或改变的时间。<br>版本 4.0 之前可以用 timestamp(10) 来改变显示的宽度。<br>year 可用来储存年份，可以用 year(2) 或 year(4) 来设定显示格式，预设是 year(4)。<br>year(2) 代表从 1970 到 2069 的年份。</p>
<p>建立索引<br>任何宣告为 PRIMARY KEY, KEY, UNIQUE, 或 INDEX 的字段都会自动建立索引。<br>要将索引建立到字段用：<br>CREATE INDEX name ON employee(name);<br>这会建立一个叫 name 的索引到 employee 资料表里的 name 字段。</p>
<p>删除数据库，资料表，和索引<br>删除整个数据库，包括里面的资料：<br>DROP DATABASE employee;<br>可以在 employee 的前面加上 IF EXISTS。<br>删除一个资料表：<br>DROP TABLE assignment;<br>完整格式：</p>
<p>程序代码:</p>
<div class=code>
<p>DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name...]</p>
<p>删除索引：<br>DROP INDEX index_name ON employee;</p>
</div>
<p>改变资料表结构<br>如果要改变资料表的结构，建立 name 的索引在 employee 里面的 name 字段：<br>ALTER TABLE employee;<br>ADD INDEX name (name);<br>完整格式：</p>
<p>程序代码:</p>
<div class=code>
<p>ALTER [IGNORE] TABLE table_name alter_spec [, alter_spec ...]<br>alter_spec:<br>ADD [COLUMN] create_definition [FIRST | AFTER col_name]<br>or ADD [COLUMN] (create_definition, create_definition,...)<br>or ADD INDEX [index_name] (index_col_name,...)<br>or ADD PRIMARY KEY (index_col_name,...)<br>or ADD UNIQUE [index_name] (index_col_name,...)<br>or ADD FULLTEXT [index_name] (index_col_name,...)<br>or ADD [CONSTRAINT symbol] FOREIGN KYE [index_name] (index_col_name,...)<br>[reference_definition]<br>or ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}<br>or CHANGE [COLUMN] old_col_name create_definition<br>[FIRST | AFTER column_name]<br>or MODIFY [COLUMN] create_definition [FIRST | AFTER col_name]<br>or DROP [COLUMN] col_name<br>or DROP PRIMARY KEY<br>or DROP INDEX index_name<br>or DISABLE KEYS<br>or ENABLE KEYS<br>or RENAME [TO] new_table_name<br>or ORDER BY col_name<br>or table_options</p>
</div>
<p>因为 ALTER 非常有弹性所以有很多的查询子句。<br>CHANGE 和 MODIFY 相同，可以让你改变字段的定义或位置。<br>DROP COLUMN 会删除资料表里的字段。<br>DROP PRIMARY KEY 和 DROP INDEX 会删除相连的字段索引。<br>DISABLE KEYS 会告诉 MySQL 停止更新索引，只能用在 MyISAM。<br>ENABLE KEYS 会继续更新索引。<br>RENAME 可以让你改变资料表的名称。<br>ORDER BY 会重新排序字段。</p>
<p>使用 INSERT<br>INSERT 可以让你输入字段到资料表里。<br>完整格式：</p>
<p>程序代码:</p>
<div class=code>
<p>INSERT [LOW_PRIORITY | DELAYED] [IGNORE]<br>[INTO] table_name [(col_name,...)]<br>VALUES ((expression | DEFAULT),...),(...),...<br>[ON DUPLICATE KEY UPDATE col_name=expression, ...]<br>or<br>INSERT [LOW_PRIORITY | DELAYED] [IGNORE]<br>[INTO] table_name [(col_name,...)]<br>SELECT ...<br>or<br>INSERT [LOW_PRIORITY | DELAYED] [IGNORE]<br>[INTO] table_name<br>SET col_name=(expression | DEFAULT), ...<br>[ON DUPLICATE KEY UPDATE col_name=expression, ...]</p>
</div>
<p>范例：</p>
<p>程序代码:</p>
<div class=code>
<p>INSERT INTO department VALUES<br>(42, 'Finance'),<br>(128, 'Research and Development'),<br>(NULL, 'Human Resources');</p>
</div>
<p>INTO 可以不用。<br>INSERT INTO department<br>SELECT ...<br>可以从其它的资料表里取得资料，存到 department 这个资料表。<br>INSERT INTO department<br>SET name = 'Asset Management';<br>这会输入一个字段的资料，只提供 name 的字段。其它没有资料的字段会是 NULL。<br>其它查询子句：<br>LOW PRIORITY 或 DELAYED 会等其它用户读取完资料后再输入资料。<br>LOW PRIORITY 会阻止要输入资料的用户，所以在跑完查询后需要等待一段时间。<br>DELAYED 不会阻止用户，但是输入资料要等没人使用资料表后才会完成。<br>范例：INSERT DELAYED INTO ...<br>IGNORE 会忽略输入跟字段的 PRIMARY KEY 或 UNIQUE 值的冲突所产生的错误讯息。<br>DEFAULT 会用默认值建立字段。<br>范例：INSERT INTO department VALUES(DEFAULT)<br>ON DUPLICATE KEY UPDATE 会解决跟 PRIMARY KEY 或 UNIQUE 的冲突。<br>范例：<br>INSERT INTO warning (employeeID) <br>VALUES(6651)<br>ON DUPLICATE KEY UPDATE count = count+1;</p>
<p>使用 REPLACE<br>使用方法跟 INSERT 相同。<br>REPLACE 可以解决有冲突的输入。如果有冲突字段会被更新。</p>
<p>使用 DELETE<br>用来删除字段。<br>范例：DELETE FROM department;<br>会删除 department 里面所有的字段。<br>如果要选择哪个字段，用 WHERE。<br>范例：DELETE FROM department WHERE name='Asset Management';<br>如果有开启 --safe-updates 或 --i-am-a-dummy 选项可以避免一次删除全部的字段。<br>所以必须选择要删除的字段。<br>完整格式：</p>
<p>程序代码:</p>
<div class=code>
<p>DELETE [LOW_PRIORITY] [QUICK] FROM table_name<br>[WHERE where_definition]<br>[ORDER BY ...]<br>[LIMIT rows]<br>or<br>DELETE [LOW_PRIORITY] [QUICK] table_name[.*] [, table_name[.*] ...]<br>FROM table-references<br>[WHERE where_definition]</p>
<p>or<br>DELETE [LOW_PRIORITY] [QUICK]<br>FROM table_name[.*] [, table_name[.*] ...]<br>USING table-references<br>[WHERE where_definition]</p>
</div>
<p>后两个格式可以用来删除其它资料表里的字段。<br>范例：</p>
<p>程序代码:</p>
<div class=code>
<p>DELETE employee, employeeSkills<br>FROM employee, employeeSkills, department<br>WHERE employee.employeeID = employeeSkills.employeeID<br>AND employee.departmentID = department.departmentID<br>AND department.name='Finance';</p>
</div>
<p>上面的会删除全部的有在 Finance department 里面工作的 employees，然后删除他们的 employeeSkills。<br>FROM 里面的字段不会被删除，他们只是用来搜寻。只有在 employee 和 employeeSkills 里面的字段会被删除。<br>AND 是包含的条件。employee.employeeID 表示 employee 资料表里的 employeeID 字段。<br>第三个格式跟第二个差不多，但是删除 FROM 里面的资料表，用 USING 来表示被搜寻的资料表。<br>范例：</p>
<p>程序代码:</p>
<p>DELETE FROM employee, employeeSkills<br>USING employee, employeeSkills, department<br>WHERE employee.employeeID = employeeSkills.employeeID<br>AND employee.departmentID = department.departmentID<br>AND department.name='Finance';</p>
<p>跟上面一样，不同的表示方法。<br>额外的查询子句：<br>LOW_PRIORITY 跟 INSERT 里的意思相同。<br>QUICK 可用来加快 DELETE 的速度。<br>ORDER BY 是用来删除字段的顺序。<br>LIMIT 可用来限制被删除的字段数量。</p>
<p>使用 TRUNCATE<br>可用来删除全部的字段。<br>TRUNCATE TABLE employee;<br>速度比 DELETE 还快。</p>
<p>使用 UPDATE<br>可以用来更新字段。</p>
<p>程序代码:</p>
<p class=code>UPDATE employee<br>SET job='DBA'<br>WHERE employeeID='6651';</p>
<p>完整格式：</p>
<p>程序代码:</p>
<div class=code>
<p>UDPATE [LOW_PRIORITY] [IGNORE] table_name<br>SET col_name1=expr1 [, col_name2=expr2 ...]<br>[WHERE where_definition]<br>[ORDER BY ...]<br>[LIMIT rows]<br>or<br>UPDATE [LOW_PRIORITY] [IGNORE] table_name [, table_name ...]<br>SET col_name=expr1 [, col_name2=expr2 ...]<br>[WHERE where_definition]</p>
</div>
<p>WHERE 可以用来选择要更新哪个字段。<br>第二个格式可以用来更新多个资料表。<br>LOW_PRIORITY 和 IGNORE 跟在 INSERT 里的相同，ORDER BY 和 LIMIT 跟在 DELETE 的相同。</p>
<p>用 LOAD DATA INFILE 上传资料文件<br>可以让你用档案来输入资料到一个资料表。<br>数据文件范例：</p>
<p>程序代码:</p>
<div class=code>
<p>42 Finance<br>128 Research and Development<br>NULL Human Resources<br>NULL Marketing</p>
</div>
<p>加载资料文件：</p>
<p>程序代码:</p>
<div class=code>
<p>LOAD DATA LOCAL INFILE 'department_infile.txt'<br>INTO TABLE department;</p>
</div>
<p>LOAD DATA INFILE 需要 FILE 的权限。</p>
<p>完整格式：</p>
<p>程序代码:</p>
<div class=code>
<p>LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'fileName.txt'<br>[REPLACE | IGNORE]<br>INTO TABLE table_name<br>[FIELDS<br>[TERMINATED BY '\t']<br>[[OPTIONALLY] ENCLOSED BY '']<br>[ESCAPED BY '\\']<br>]<br>[LINES TERMINATED BY '\n']<br>[IGNORE number LINES]<br>[(col_name, ...)]</p>
</div>
<p>额外的查询子句：<br>LOW_PRIORITY 跟 INSERT 里的类似，会等用户读取完资料表后在继续。<br>CONCURRENT 允许其它用户读资料表里的资料。<br>LOCAL 表示资料文件在用户的计算机里，如果不用 MySQL 会在主机内读取资料文件。<br>REPLACE 会覆盖旧的字段，IGNORE 会留旧的字段，如果有冲突。<br>FIELDS 和 LINES 可以用来规定资料表的格式，预设的格式是<br>每行一个字段，字段资料用 tabs 来分开，要或不要用单引号，和用 \ 来跳脱字符。<br>IGNORE number LINES 会忽略档案内行数，number 表示行数。<br>最后一个子句可以用来设定只输入资料到某些字段。</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:40 <a href="http://www.blogjava.net/microlab4321/articles/136401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决hibernate+mysql中文问题 </title><link>http://www.blogjava.net/microlab4321/articles/136399.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136399.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136399.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136399.html</trackback:ping><description><![CDATA[<p>在网上有很多这方面文章,依照上面也解决过,但是修改了mysql的配置文件my.ini.感觉在部署时不是很爽.</p>
<p>这里给出另一种解决方法(mysql-4.1.11).低版本的mysql似乎没出现过中文问题(mysql-4.0.17). :)</p>
<p>1.添加一个过滤器,将字符集编码设为UTF-8.<br>修改web.xml:</p>
<p>&nbsp;&lt;filter&gt;<br>&nbsp;&nbsp;&lt;filter-name&gt;SetCharacterEncoding&lt;/filter-name&gt;<br>&nbsp;&nbsp;&lt;filter-class&gt;hxz.filter.SetEncodingFilter&lt;/filter-class&gt;<br>&nbsp;&nbsp;&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-name&gt;encoding&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-value&gt;UTF-8&lt;/param-value&gt;<br>&nbsp;&nbsp;&lt;/init-param&gt;<br>&nbsp;&lt;/filter&gt;<br>&nbsp;<br>&nbsp;&lt;filter-mapping&gt;<br>&nbsp;&nbsp;&lt;filter-name&gt;SetCharacterEncoding&lt;/filter-name&gt;<br>&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br>&nbsp;&lt;/filter-mapping&gt;</p>
<p>新建一个过滤器:<br>package hxz.filter;</p>
<p>import java.io.IOException;</p>
<p>import javax.servlet.*;</p>
<p>public class SetEncodingFilter implements Filter {<br>&nbsp;<br>&nbsp;// default character encoding<br>&nbsp;String defaultEncoding = "UTF-8";&nbsp;<br>&nbsp;<br>&nbsp;public void init(FilterConfig config) throws ServletException {<br>&nbsp;&nbsp;String encoding = config.getInitParameter("encoding");<br>&nbsp;&nbsp;if (encoding != null) {<br>&nbsp;&nbsp;&nbsp;defaultEncoding = encoding;<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {<br>&nbsp;&nbsp;request.setCharacterEncoding(defaultEncoding);<br>&nbsp;&nbsp;chain.doFilter(request, response);<br>&nbsp;}</p>
<p>&nbsp;public void destroy() {<br>&nbsp;&nbsp;defaultEncoding = null;<br>&nbsp;}</p>
<p>}</p>
<p>2.修改hibernate配置文件:<br>&lt;property name="url"&gt;<br>&nbsp; &lt;value&gt;jdbc:mysql://localhost:3306/test?useUnicode=true&amp;amp;characterEncoding=UTF-8&lt;/value&gt;<br>&lt;/property&gt;<br>注意后面的:useUnicode=true&amp;amp;characterEncoding=UTF-8, 在xml中&amp;要改为;amp;</p>
<p>3.在新版本中mysql建表时,你可以选择一种字符集,将它设为utf-8.<br>jsp或servlet中把字符集改为UTF-8.</p>
<p>4.trying...</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:36 <a href="http://www.blogjava.net/microlab4321/articles/136399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL的嵌套查询 </title><link>http://www.blogjava.net/microlab4321/articles/136398.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136398.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136398.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136398.html</trackback:ping><description><![CDATA[<font size=2>最近在MySQL上做了点工作，发现很多人都在询问MySQL嵌套查询的问题，许多人都觉得MySQL不支持嵌套查询，其实MySQl从4.11版后已经完全支持嵌套查询了，那么下面我举些简单的嵌套查询的例子吧（源程序来自MySQL User Manual）：<br><br>1. SELECT语句的子查询:<br>语法:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT ... FROM (subquery) AS name ...<br><br>先创建一个表:<br>CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);<br>INSERT INTO t1 VALUES (1,'1',1.0);<br>INSERT INTO t1 VALUES (2,'2',2.0);<br><br>我们就可以进行以下的嵌套查询了:<br>SELECT sb1,sb2,sb3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE sb1 &gt; 1;<br><br>结果是： </font><font size=2><font color=#000000>2<code>, '2', 4.0</code>. <br></font><br>我们知道下面语句是不会得到正确结果的，因为对经过Group by排序的集合进行求均值是不能得到正确答案的：<br>SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1<br><br>所以我们可以通过下面的嵌套查询实现同样的效果：<br>SELECT AVG(sum_column1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT SUM(column1) AS sum_column1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM t1 GROUP BY column1) AS t1;<br><br>2.行的子查询（Row Subquery）：<br>看下面的例子：<br>SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);<br>这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚，也不去详细介绍了。<br></font><br><font size=2>3.使用Exist和Not Exist参数<br>这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了:<br><br>范例一:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT DISTINCT store_type FROM Stores<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE EXISTS (SELECT * FROM Cities_Stores<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE Cities_Stores.store_type = Stores.store_type);<br>范例二:&nbsp;&nbsp; SELECT DISTINCT store_type FROM Stores<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE NOT EXISTS (SELECT * FROM Cities_Stores<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE Cities_Stores.store_type = Stores.store_type);<br>范例三:&nbsp; 这个例子中嵌套使用了Not Exist语法，稍微注意一下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT DISTINCT store_type FROM Stores S1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE NOT EXISTS (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM Cities WHERE NOT EXISTS (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM Cities_Stores<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE Cities_Stores.city = Cities.city<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND Cities_Stores.store_type = Stores.store_type));<br><br>4.条件关联关系查询：<br>解释起来麻烦，直接看例子吧：<br>SELECT column1 FROM t1 AS x<br>&nbsp;&nbsp;&nbsp;&nbsp; WHERE x.column1 = (SELECT column1 FROM t2 AS x<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE x.column1 = (SELECT column1 FROM t3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE x.column2 = t3.column1));<br>跟其他数据库做法是一样的。<br><br>5.其他使用方法和注意：<br>除了上面这些还有很多很多，不过就不去细讲了，因为这些跟别的数据库差不多，只是为了给大家一个参考，提提就够了。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT (SELECT s1 FROM t2) FROM t1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT (SELECT s2 FROM t1);<br><br>支持子查询的语法有：SELECT，INSERT，UPDATE，DELETE，SET和DO。<br><br>子查询可以使用任何普通查询中使用的关键词：如DINSTINCT，GROUP BY，LIMIT，ORDER BY，UNION，ALL，UNION ALL等。可以使用&lt;,&gt;, &lt;=, &gt;=, =, &lt;&gt;运算符进行比较，也可以使用ANY ，IN和SOME进行集合的匹配。<br></font>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:33 <a href="http://www.blogjava.net/microlab4321/articles/136398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql使用指南 </title><link>http://www.blogjava.net/microlab4321/articles/136396.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136396.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136396.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136396.html</trackback:ping><description><![CDATA[<div class=postbody>
<p>本人最早的一篇网上文章，N年前发于奥索网。最近主要使用MySQL，再次整理帖出。<br>------------------------------------------------------<br>mysql使用指南（上）<br>作者：大金刚</p>
<p>有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。</p>
<p><br>一、连接MYSQL。</p>
<p>格式： mysql -h主机地址 -u用户名 －p用户密码</p>
<p>1、例1：连接到本机上的MYSQL。<br>&nbsp;&nbsp; 首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql&gt;</p>
<p>2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令：&nbsp; <br>&nbsp; mysql -h110.110.110.110 -uroot -pabcd123<br>&nbsp; （注:u与root可以不用加空格，其它也一样）</p>
<p>3、退出MYSQL命令： exit （回车）</p>
<p><br>二、修改密码。</p>
<p>格式：mysqladmin -u用户名 -p旧密码&nbsp; password 新密码</p>
<p>1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令<br>&nbsp;&nbsp; mysqladmin -uroot -password ab12&nbsp; <br>&nbsp; 注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。</p>
<p>2、例2：再将root的密码改为djg345。<br>&nbsp;&nbsp; mysqladmin -uroot -pab12 password djg345</p>
<p><br>三、增加新用户。（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符）</p>
<p>格式：grant select on 数据库.* to 用户名@登录主机 identified by "密码"</p>
<p>例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令：<br>&nbsp; grant select,insert,update,delete on *.* to <a href='&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#49;&#64;&#34;&#37;'><u><font color=#0000ff>test1@"%</font></u></a>" Identified by "abc";<br>但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。</p>
<p>例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问了。<br>&nbsp; grant select,insert,update,delete on mydb.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#50;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;"><u><font color=#0000ff>test2@localhost</font></u></a> identified by "abc";<br>&nbsp; 如果你不想test2有密码，可以再打一个命令将密码消掉。<br>&nbsp; grant select,insert,update,delete on mydb.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#50;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;"><u><font color=#0000ff>test2@localhost</font></u></a> identified by "";&nbsp; </p>
<p>好今天的课程就到这里了，明天有空我再奉上mysql的数据库操作篇</p>
<p><br>在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意：你必须首先登录到MYSQL中，以下操作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。</p>
<p><br>一、操作技巧</p>
<p>&nbsp; 1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。</p>
<p>&nbsp; 2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。</p>
<p><br>二、显示命令</p>
<p>&nbsp; 1、显示数据库列表。<br>&nbsp;&nbsp;&nbsp;&nbsp; show databases;<br>&nbsp; 刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。</p>
<p>&nbsp; 2、显示库中的数据表：<br>&nbsp;&nbsp;&nbsp;&nbsp; use mysql；&nbsp;&nbsp; ／／打开库，学过FOXBASE的一定不会陌生吧<br>&nbsp;&nbsp;&nbsp;&nbsp; show tables;</p>
<p>&nbsp; 3、显示数据表的结构：<br>&nbsp;&nbsp;&nbsp;&nbsp; describe 表名;</p>
<p>&nbsp; 4、建库：<br>&nbsp;&nbsp;&nbsp;&nbsp; create database 库名;</p>
<p>&nbsp; 5、建表：<br>&nbsp;&nbsp;&nbsp;&nbsp; use 库名；<br>&nbsp;&nbsp;&nbsp;&nbsp; create table 表名 (字段设定列表)；</p>
<p>&nbsp; 6、删库和删表:<br>&nbsp;&nbsp;&nbsp;&nbsp; drop database&nbsp; 库名;<br>&nbsp;&nbsp;&nbsp;&nbsp; drop table&nbsp; 表名；</p>
<p>&nbsp; 7、将表中记录清空：<br>&nbsp;&nbsp;&nbsp;&nbsp; delete from 表名;</p>
<p>&nbsp; 8、显示表中的记录：<br>&nbsp;&nbsp;&nbsp;&nbsp; select * from 表名;</p>
<p><br>三、一个建库和建表以及插入数据的实例<br>drop database if exists school; //如果存在SCHOOL则删除<br>create database school;&nbsp;&nbsp; //建立库SCHOOL<br>use school;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开库SCHOOL<br>create table teacher&nbsp;&nbsp; //建立表TEACHER<br>(<br>id int(3) auto_increment not null primary key,<br>name char(10) not null,<br>address varchar(50) default '深圳',<br>year date<br>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建表结束<br>//以下为插入字段&nbsp;&nbsp; <br>insert into teacher values('','glchengang','深圳一中','1976-10-10');<br>insert into teacher values('','jack','深圳一中','1975-12-23');</p>
<p>注：在建表中<br>（1）将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key<br>（2）将NAME设为长度为10的字符字段<br>（3）将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别呢，只有等以后的文章再说了。 （4）将YEAR设为日期字段。<br>&nbsp; 如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:下，并在DOS状态进入目录mysqlbin，然后键入以下命令：<br>&nbsp;&nbsp; mysql -uroot -p密码 &lt; c:school.sql<br>如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。</p>
<p><br>四、将文本数据转到数据库中</p>
<p>1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用n来代替.<br>例：<br>3 rose 深圳二中 1976-10-10<br>4 mike 深圳一中 1975-12-23<br>2、数据传入命令 load data local infile "文件名" into table 表名;<br>注意：你最好将文件复制到mysqlbin目录下，并且要先用use命令打表所在的库。&nbsp; </p>
<p><br>五、备份数据库：（命令在DOS的mysqlbin目录下执行）<br>mysqldump --opt school&gt;school.bbb<br>注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。</p>
<p>&nbsp;&nbsp; 后记：其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异，您最好找本将SQL的书看看。我在这里只介绍一些基本的，其实我也就只懂这些了，呵呵。最好的MYSQL教程还是&#8220;晏子&#8220;译的&#8220;MYSQL中文参考手册&#8220;不仅免费每个相关网站都有下载，而且它是最权威的。可惜不是象"PHP4中文手册 "那样是chm的格式，在查找函数命令的时候不太方便。&nbsp; </p>
</div>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 15:32 <a href="http://www.blogjava.net/microlab4321/articles/136396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习 SQL 语法的好资料: Transact-SQL 参考 </title><link>http://www.blogjava.net/microlab4321/articles/136344.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136344.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136344.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136344.html</trackback:ping><description><![CDATA[<p>这个资料是我上大学时候一直看到现在的, 既可以作为学习资料, 更可以作为开发时候的速查手册. 具体来说就是安装了 SQL Server 2000 后里面自带的帮助文档的一部分. </p>
<p>可以下载这个压缩包(限Windows平台): <a href="http://beansoft.java-cn.org/download/tsqlref.zip"><font color=#1a8bc8>http://beansoft.java-cn.org/download/tsqlref.zip</font></a> 2.1MB CHM 格式, 有索引, 可搜索</p>
<p>那么这个资料的好处是什么呢?</p>
<p>1) 全中文</p>
<p>2) 语法特别详细(当然部分是 MS 特有的, 不太好).. 这里可以带个例子给大家看:</p>
<p>&nbsp;</p>
<p>Transact-SQL 参考 </p>
<h3><a></a>INSERT</h3>
<p>将新行添加到表或视图。
<h6>语法</h6>
<p>INSERT [ INTO]<br>&nbsp;&nbsp;&nbsp;&nbsp;{ <em>table_name</em> WITH <strong>(</strong> &lt; table_hint_limited &gt; [ ...<em>n </em>] <strong>)</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| <em>view_name<br></em>&nbsp;&nbsp;&nbsp;&nbsp;| <em>rowset_function_limited</em><br>&nbsp;&nbsp;&nbsp;&nbsp;}<code><br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;</code>[ <strong>( </strong><em>column_list </em><strong>) </strong>]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ VALUES<br><strong><code>( </code></strong>{<code> DEFAULT | NULL | <em>expression </em></code>}<code> [ <strong>,</strong>...<em>n</em>] <strong>)<br></strong></code>| <em>derived_table<br></em>| <em>execute_statement<br></em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<code><br>&nbsp;&nbsp;&nbsp;&nbsp;} <br></code>| DEFAULT VALUES
<p>&lt; table_hint_limited &gt; ::=<strong><br></strong>{<code> FASTFIRSTROW<br></code>|<strong> </strong>HOLDLOCK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| PAGLOCK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| READCOMMITTED<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| REPEATABLEREAD<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| ROWLOCK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| SERIALIZABLE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| TABLOCK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| TABLOCKX<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| UPDLOCK<code><br>&nbsp;&nbsp;&nbsp;&nbsp;} </code>
<h6>参数</h6>
<p>[INTO]
<p>一个可选的关键字，可以将它用在 INSERT 和目标表之间。
<p><em>table_name</em>
<p>将要接收数据的表或 <strong>table</strong> 变量的名称。
<p>WITH <strong>(</strong>&lt;table_hint_limited&gt; [...<em>n</em>]<strong>)</strong>
<p>指定目标表所允许的一个或多个表提示。需要有 WITH 关键字和圆括号。不允许有 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的更多信息，请参见 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_fa-fz_4ox9.htm"><font color=#1a8bc8>FROM</font></a>。
<p><em>view_name</em>
<p>视图的名称及可选的别名。通过 <em>view_name</em> 来引用的视图必须是可更新的。由 INSERT 语句所做的修改不能影响视图的 FROM 子句中引用的多个基表。例如，在多表视图中的 INSERT 必须使用 <em>column_list</em>，<em>column_list</em> 是只引用来自一个基表的列。有关可更新视图的更多信息，请参见 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_create2_30hj.htm"><font color=#1a8bc8>CREATE VIEW</font></a>。
<p><em>rowset_function_limited</em>
<p>是 OPENQUERY 或 OPENROWSET 函数。有关更多信息，请参见 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_oa-oz_5xix.htm"><font color=#1a8bc8>OPENQUERY</font></a> 以及 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_oa-oz_78z8.htm"><font color=#1a8bc8>OPENROWSET</font></a>。
<p>(<em>column_list</em>)
<p>要在其中插入数据的一列或多列的列表。必须用圆括号将 <em>column_list</em> 括起来，并且用逗号进行分隔。
<p>如果某列不在 <em>column_list</em> 中，则 Microsoft&#174; SQL Server&#8482; 必须能够基于该列的定义提供一个值；否则不能装载行。如果列满足下面的条件，那么 SQL Server 将自动为列提供值：
<ul>
    <li>具有 IDENTITY 属性。使用下一个增量标识值。
    <li>有默认值。使用列的默认值。
    <li>具有 <strong>timestamp </strong>数据类型。使用当前的时间戳值。
    <li>是可空的。使用空值。 </li>
</ul>
<p>当向标识列中插入显式的值时，必须使用 <em>column_list</em> 及 VALUES 列表，并且对于表，SET IDENTITY_INSERT 选项必须是 ON。
<p>VALUES
<p>引入要插入的数据值的列表。对于 <em>column_list</em>（如果已指定）中或者表中的每个列，都必须有一个数据值。必须用圆括号将值列表括起来。
<p>如果 VALUES 列表中的值与表中列的顺序不相同，或者未包含表中所有列的值，那么必须使用 <em>column_list</em> 明确地指定存储每个传入值的列。
<p>DEFAULT
<p>强制 SQL Server 装载为列定义的默认值。如果对于某列并不存在默认值，并且该列允许 NULL，那么就插入 NULL。对于使用 <strong>timestamp</strong><em> </em>数据类型定义的列，插入下一个时间戳值。DEFAULT 对标识列无效。
<p><em>expression</em>
<p>一个常量、变量或表达式。表达式不能包含 SELECT 或 EXECUTE 语句。
<p><em>derived_table</em>
<p>任何有效的 SELECT 语句，它返回将装载到表中的数据行。
<p><em>execute_statement</em>
<p>任何有效的 EXECUTE 语句，它使用 SELECT 或 READTEXT 语句返回数据。
<p>如果将 <em>execute_statement</em> 与 INSERT 一起使用，那么每个结果集都必须与表中或 <em>column_list </em>中的列兼容。<em>execute_statement</em> 可以用来执行同一服务器或远程服务器上的存储过程。执行远程服务器中的过程，然后将结果集返回到本地服务器，并装载到本地服务器的表中。如果 <em>execute_statement</em> 使用 READTEXT 语句返回数据，那么每个单独的 READTEXT 语句最多可以返回 1 MB (1024 KB) 的数据，也可以将 <em>execute_statement</em> 与扩展过程一起使用，并且插入扩展过程的主线程返回的数据。不会插入不是主线程的其它线程中的输出结果。
<p><img height=11 alt="" src="mk:@MSITStore:E:\Books\Database\chm\TSQLREF.CHM::/Basics/note.gif" width=12 border=0>
<p><strong>说明</strong>&nbsp;&nbsp;对于 SQL Server 7.0，<em>execute_statement</em> 不包含返回 <strong>text</strong> 或 <strong>image</strong> 列的扩展存储过程。这个行为是从 SQL Server 早期版本变化而来的。
<p>DEFAULT VALUES
<p>强制新行包含为每个列所定义的默认值。
<h6>注释</h6>
<p>INSERT 将新行追加到表中。若要替换表中的数据，必须在使用 INSERT 装载新数据之前，使用 DELETE 或 TRUNCATE TABLE 语句清除现有的数据。若要修改现有行中的列值，请使用 UPDATE。若要创建新表，并且通过一个步骤给它装载数据，请使用 SELECT 语句的 INTO 选项。
<p><strong>table</strong> 变量在其作用域内可以像常规表一样访问。因此，可以像在 INSERT 语句中将行添加到表一样使用 <strong>table</strong> 变量。有关更多信息，请参见 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_ta-tz_7ysl.htm"><font color=#1a8bc8>table</font></a>。
<p>由 OPENDATASOURCE 函数建立的、作为服务器名部分的四段名称可以作为表源，该表源可以出现在 INSERT 语句中显示表名的所有位置。
<p>使用 <strong>uniqueidentifier</strong> 数据类型创建的列存储特殊格式的 16 字节二进制值。与标识列不同，SQL Server 不会为带有 <strong>uniqueidentifier</strong> 数据类型的列自动地生成值。在插入操作过程中，带有 <strong>uniqueidentifier</strong> 数据类型的变量以及某些字符串常量可以用于 <strong>uniqueidentifier </strong>列（这些字符串常量的形式为：xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx，有 36 个字符，其中包括连字符。x 是十六进制数，范围为 0-9 或 a-f。）。例如，对于 <strong>uniqueidentifier </strong>变量或列，6F9619FF-8B86-D011-B42D-00C04FC964FF 是一个有效值。使用 NEWID() 函数可以获取全局唯一的 ID (GUID)。
<p>插入行时，可以应用下列规则：
<ul>
    <li>如果将值装载到带有 <strong>char</strong>、<strong>varchar</strong> 或 <strong>varbinary</strong> 数据类型的列，尾随空格（对于 <strong>char</strong> 和 <strong>varchar </strong>是空格，对于 <strong>varbinary </strong>是零）的填充和截断是由 SET ANSI_PADDING 设置确定的。该设置是在创建表时为列定义的。有关更多信息，请参见 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_set-set_2uw7.htm"><font color=#1a8bc8>SET ANSI_PADDING</font></a>。
    <p>下表显示 SET ANSI_PADDING 为 OFF 时的默认操作。
    <p>数据类型<br>默认操作
    <p><strong>Char</strong><br>将带有空格的值填充到已定义的列宽。
    <p><strong>Varchar</strong><br>删除最后的非空格字符后面的尾随空格，而对于只由空格组成的字符串，一直删除到只留下一个空格字符。
    <p><strong>Varbinary</strong><br>删除尾随的零。</p>
    <li>如果将一个空字符串 (' ') 装载到带有<strong> varchar</strong> 或 <strong>text</strong> 数据类型的列，那么默认操作是装载一个零长度的字符串。如果数据库的兼容级别小于 70，那么将该值转换成单个空格。有关更多信息，请参见<strong> </strong><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_sp_da-di_5c8c.htm"><font color=#1a8bc8>sp_dbcmptlevel</font></a>。
    <li>如果 INSERT 语句违反约束或规则，或者它有与列的数据类型不兼容的值，那么该语句就会失败，并且 SQL Server 显示错误信息。
    <li>将空值插入到 <strong>text</strong> 或 <strong>image </strong>列不能创建有效的文本指针，也不能预分配 8 KB 的文本页。有关插入 <strong>text</strong><em> </em>和 <strong>image</strong><em> </em>数据的更多信息，请参见<a href="javascript:hhobj_1.Click()"><font color=#1a8bc8>使用 text、ntext 和 image 函数</font></a>。
    <li>如果 INSERT 正在使用 SELECT 或 EXECUTE 装载多行，正在装载的值中出现任何违反规则或约束的行为都会导致整个语句终止，从而不会装载任何行。
    <li>当向远程 SQL Server 表中插入值且没有为所有列指定值时，则用户必须标识将向其中插入指定值的列。 </li>
</ul>
<p>在本地和远程分区视图上，忽略 INSERT 语句的 SET ROWCOUNT 选项的设置。而且，当兼容级别设置为 80 时，在 SQL Server 2000 中的远程表上也不支持 INSERT 语句的 SET ROWCOUNT 选项。
<p>当为表或视图的 INSERT 操作定义了 INSTEAD-OF 触发器时，该触发器就会执行 INSERT 语句中的 <em>instead of</em>。以前的 SQL Server 版本只支持在 INSERT 中定义的 AFTER 触发器，以及其它数据修改语句。
<p>如果在表达式赋值过程中 INSERT 语句遇到算术错误（溢出、被零除或域错误），那么 SQL Server 会处理这些错误，就好像 SET ARITHABORT 是 ON 一样。批处理的其余部分将终止，并且会返回一条错误信息。
<h6>权限</h6>
<p>默认情况下，INSERT 权限被授予 <strong>sysadmin </strong>固定服务器角色成员，<strong>db_owner</strong> 和 <strong>db_datawriter</strong> 固定数据库角色成员，以及表的所有者。<strong>sysadmin</strong>、<strong>db_owner </strong>和 <strong>db_securityadmin</strong> 角色成员和表所有者可以将权限转让给其他用户。
<h6>示例</h6>
<h6>A. 使用简单的 INSERT</h6>
<p>下面的示例创建表 <strong>T1</strong>，并且插入一行。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 VALUES (1, 'Row #1')
</code></pre>
<h6>B. 插入与列顺序不同的数据</h6>
<p>下面的示例使用 <em>column_list</em> 及 VALUES 列表显式地指定将被插入每个列的值。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 (column_2, column_1) VALUES ('Row #1',1)
</code></pre>
<h6>C. 插入值少于列个数的数据</h6>
<p>下面的示例创建一个带有四个列的表。INSERT 语句插入一些行，这些行只有部分列包含值。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1
( column_1 int identity,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('column default'),
column_3 int NULL,
column_4 varchar(40)
)
INSERT INTO T1 (column_4)
VALUES ('Explicit value')
INSERT INTO T1 (column_2,column_4)
VALUES ('Explicit value', 'Explicit value')
INSERT INTO T1 (column_2,column_3,column_4)
VALUES ('Explicit value',-44,'Explicit value')
SELECT *
FROM T1
</code></pre>
<h6>D. 将数据装载到带有标识列的表</h6>
<p>前两个 INSERT 语句允许为新行生成标识值。第三个 INSERT 语句用 SET IDENTITY_INSERT 语句替代列的 IDENTITY 属性，并且将一个显式的值插入到标识列。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int IDENTITY, column_2 varchar(30))
INSERT T1 VALUES ('Row #1')
INSERT T1 (column_2) VALUES ('Row #2')
SET IDENTITY_INSERT T1 ON
INSERT INTO T1 (column_1,column_2)
VALUES (-99,'Explicit identity value')
SELECT *
FROM T1
</code></pre>
<h6>E. 通过视图将数据装载到表</h6>
<p>在下面的示例中，INSERT 语句指定一个视图名；但是将新行插入该视图的基础表中。INSERT 语句中 VALUES 列表的顺序必须与视图的列顺序相匹配。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'V1')
DROP VIEW V1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
GO
CREATE VIEW V1 AS SELECT column_2, column_1
FROM T1
GO
INSERT INTO V1
VALUES ('Row 1',1)
SELECT *
FROM T1
</code></pre>
<h6>F. 使用 DEFAULT VALUES 选项装载数据</h6>
<p>在下面的示例中，CREATE TABLE 语句给每个列定义一个值，当在 INSERT 语句中没有为列指定显式的值时，就可以使用这个值。使用 INSERT 语句的 DEFAULT VALUES 选项，无须提供显式的值就可以添加行。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE DEFAULT bound_default AS 'Bound default value'
GO
CREATE TABLE T1
( column_1 int identity,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('column default'),
column_3 timestamp,
column_4 varchar(30),
column_5 int NULL)
GO
USE master
EXEC sp_bindefault 'bound_default','T1.column_4'
INSERT INTO T1 DEFAULT VALUES
SELECT *
FROM T1
</code></pre>
<h6>G. 使用 SELECT 和 EXECUTE 选项装载数据</h6>
<p>下面的示例演示三种不同的方法，用来从一个表获取数据，并将数据装载到另一个表。每种方法都基于一个多表 SELECT 语句，该语句在列列表中包含一个表达式及一个文字值。
<p>第一个 INSERT 语句使用一个 SELECT 语句直接从源表 (<strong>authors</strong>) 检索数据，并且将结果集存储到 <strong>author_sales</strong> 表。第二个 INSERT 执行一个包含 SELECT 语句的过程，而第三个 INSERT 将 SELECT 语句作为一个文字字符串执行。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'author_sales')
DROP TABLE author_sales
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name = 'get_author_sales' AND type = 'P')
DROP PROCEDURE get_author_sales
GO
USE pubs
CREATE TABLE author_sales
( data_source   varchar(20),
au_id         varchar(11),
au_lname      varchar(40),
sales_dollars smallmoney
)
GO
CREATE PROCEDURE get_author_sales
AS
SELECT 'PROCEDURE', authors.au_id, authors.au_lname,
SUM(titles.price * sales.qty)
FROM authors INNER JOIN titleauthor
ON authors.au_id = titleauthor.au_id INNER JOIN titles
ON titleauthor.title_id = titles.title_id INNER JOIN sales
ON titles.title_id = sales.title_id
WHERE authors.au_id like '8%'
</code>   <code>GROUP BY authors.au_id, authors.au_lname</code>
<code>GO</code>
<code>--INSERT...SELECT example</code>
<code>USE pubs</code>
<code>INSERT author_sales</code>
<code>   SELECT 'SELECT', authors.au_id, authors.au_lname, </code>
<code>      SUM(titles.price * sales.qty) </code>
<code>   FROM authors INNER JOIN titleauthor </code>
<code>      ON authors.au_id = titleauthor.au_id INNER JOIN titles</code>
<code>      ON titleauthor.title_id = titles.title_id INNER JOIN sales</code>
<code>      ON titles.title_id = sales.title_id</code>
<code>   WHERE authors.au_id LIKE '8%'</code>
<code>GROUP BY authors.au_id, authors.au_lname</code>
<code>--INSERT...EXECUTE procedure example</code>
<code>INSERT author_sales EXECUTE get_author_sales</code>
<code>--INSERT...EXECUTE('string') example</code>
<code>INSERT author_sales </code>
<code>EXECUTE </code>
<code>('</code>
<code>SELECT ''EXEC STRING'', authors.au_id, authors.au_lname, </code>
<code>   SUM(titles.price * sales.qty) </code>
<code>   FROM authors INNER JOIN titleauthor </code>
<code>      ON authors.au_id = titleauthor.au_id INNER JOIN titles</code>
<code>      ON titleauthor.title_id = titles.title_id INNER JOIN sales</code>
<code>      ON titles.title_id = sales.title_id</code>
<code>   WHERE authors.au_id like ''8%''</code>
<code>GROUP BY authors.au_id, authors.au_lname</code>
<code>')</code>
<code>--Show results.</code>
<code>SELECT * FROM author_sales</code>
</pre>
<h6>H. 使用 SELECT 语句中的 TOP 子句插入数据</h6>
<p>因为可以在 INSERT 语句中指定 SELECT 语句，所以也可以将 TOP 子句用在 SELECT 语句中。下面的示例将 <strong>authors </strong>表中最上面的 10 个作者插入到名为 <strong>new_authors </strong>的新表中。
<pre><code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'new_authors')
DROP TABLE new_authors
GO
USE pubs
CREATE TABLE new_authors
(
au_id    id,
au_lname varchar(40),
au_fname varchar(20),
phone    char(12),
address  varchar(40),
city     varchar(20),
state    char(2),
zip         char(5),
contract bit
)
INSERT INTO new_authors
SELECT TOP 10 *
FROM authors
</code></pre>
<h6><strong>请参见</strong></h6>
<p><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_create2_8g9x.htm"><font color=#1a8bc8>CREATE TABLE</font></a>
<p><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_ea-ez_05ro.htm"><font color=#1a8bc8>EXECUTE</font></a>
<p><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_fa-fz_4ox9.htm"><font color=#1a8bc8>FROM</font></a>
<p><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_ia-iz_3iex.htm"><font color=#1a8bc8>IDENTITY（属性）</font></a>
<p><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_na-nop_4pt0.htm"><font color=#1a8bc8>NEWID</font></a>
<p><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_sa-ses_9sfo.htm"><font color=#1a8bc8>SELECT</font></a>
<p><a href="http://www.blogjava.net/beansoft/archive/2007/07/10/ts_set-set_0bjo.htm"><font color=#1a8bc8>SET ROWCOUNT</font></a></p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 13:07 <a href="http://www.blogjava.net/microlab4321/articles/136344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 如何配置显示生成的 SQL? </title><link>http://www.blogjava.net/microlab4321/articles/136312.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136312.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136312.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136312.html</trackback:ping><description><![CDATA[<p>今天向一位同学请教了如何在控制台输出 Hibernate 工作过程中生成的 SQL, 非常简单, 不过还是十分感谢分享. 毕竟先知者为师.</p>
<p>简单说就是如下所示:</p>
<p>&nbsp;</p>
<p>&lt;!-- Output sql of hibernate --&gt;<br>&lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;
<p>&nbsp;
<p>这时控制台会显示如下的信息:
<p>Hibernate: select users_seq.nextval from dual<br>Hibernate: insert into users (username, password, age, sex, id) values (?, ?, ?, ?, ?)
<p>可以看到 Hibernate 是用 PreparedStatement 工作的, 跟我以前做的 BeanJDBC Persistence 研究项目用的思路一致.
<p>&nbsp;
<p>一份完整的配置文件:
<p>&nbsp;
<p>&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br>&lt;!DOCTYPE hibernate-configuration PUBLIC<br>"-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br>"<a href='http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"'><font color=#1a8bc8>http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"</font></a>&gt;
<p>&lt;hibernate-configuration&gt;
<p>&lt;session-factory&gt;<br>&lt;!-- localhost mysql config --&gt;<br>&nbsp;<br>&lt;property name="connection.username"&gt;root&lt;/property&gt;<br>&lt;property name="connection.url"&gt;<br>jdbc:mysql://localhost/test<br>&lt;/property&gt;<br>&lt;property name="dialect"&gt;<br>org.hibernate.dialect.MySQLDialect<br>&lt;/property&gt;<br>&lt;property name="myeclipse.connection.profile"&gt;<br>com.mysql.jdbc.Driver<br>&lt;/property&gt;<br>&lt;property name="connection.password"&gt;&lt;/property&gt;<br>&lt;property name="connection.driver_class"&gt;<br>com.mysql.jdbc.Driver<br>&lt;/property&gt;<br>
<p>&lt;!-- Output sql of hibernate --&gt;<br>&lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;
<p>&lt;mapping resource="entity/User.hbm.xml"/&gt;<br>&lt;/session-factory&gt;
<p>&lt;/hibernate-configuration&gt;</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 10:46 <a href="http://www.blogjava.net/microlab4321/articles/136312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>