zoukankan      html  css  js  c++  java
  • MySQL存储过程中的Hibernate JDBC

    (转载:http://developer.51cto.com/art/200907/138824.htm
    本文将介绍MySQL存储过程中的Hibernate JDBC,存储过程是在数据库中预编译好的SQL语句,只需一次编译即可,大大提高了sql 语句执行的速度。
    AD:
    一、如何认识Hibernate JDBC存储过程
    
    存储过程是在数据库中预编译好的SQL语句,只需一次编译即可,大大提高了sql 语句执行的速度。
    
    好处:提高了速度;
    
    坏处:不便于移植。
    
    二、存储过程的语法:
    
    a) 创建一个存储过程
    
    无参:    
    
    Create procedure creatp()   
        Begin  
    Sql 语句;
    
    End;
    
    有参:
    
    Create procedure creatp( 参数名1 参数类型1 ,参数名2 参数类型2 )
    
    Begin
    
    Sql 语句;
    
    End;
    
    例如:
    
    无参:
    
    DELIMITER $$   
    DROP PROCEDURE IF EXISTS `test`.`createp` $$   
    CREATE PROCEDURE `test`.`createp` ( idv int)   
    BEGIN   
      select * from `table_test` where id=idv;   
    END $$   
    DELIMITER ;  
    有参:
    
    DELIMITER $$   
    DROP PROCEDURE IF EXISTS `test`.`queryProV` $$   
    CREATE DEFINER=`root`@`localhost` PROCEDURE `queryProV`(tid integer)   
    BEGIN   
      select * from table_test where id=tid;   
    END $$   
    DELIMITER ;  
    b)     使用存储过程
    
    无参:Call 存储过程名();
    
    有参:Call 存储过程名( 参数值) ;
    
    例如:
    
    call createp(2);
    
    c)     删除存储过程
    
    Drop procedure 存储过程名;
    
    例如:
    
    drop procedure createp;  
    三、Hibernate JDBC使用存储过程
    
    package com.test.dao;   
    import java.sql.CallableStatement;   
    import java.sql.Connection;   
    import java.sql.DriverManager;   
    import java.sql.PreparedStatement;   
    import java.sql.ResultSet;   
    import java.sql.SQLException;   
    import org.hibernate.Session;   
    import com.test.hibernate.HibernateSessionFactory;   
    /**   
      * MySQl 存储过程___   
      *   JDBC   
      * @author Administrator   
      *   
      */   
    public class Test {   
         /**    
           * 获取数据库的连接对象   
           * @return    数据库连接对象   
           */   
         private  Connection getConnection(){        
             final String MYSQL_DRIVER="com.mysql.jdbc.Driver";// 数据库连接的驱动   
             final String MYSQL_USERNAME="root";// 数据库连接的url   
             final String MYSQL_PASSWORD="123456";// 数据库连接的密码   
             final String MYSQL_URL="jdbc:mysql://localhost:3306/test";// 数据库连接的url           
             try{   
                  Class.forName(MYSQL_DRIVER);   
                  return DriverManager.getConnection(MYSQL_URL, MYSQL_USERNAME, MYSQL_PASSWORD);   
              }catch(Exception e){   
                  e.printStackTrace();   
             }   
            return null;   
         }   
         /**   
         ===========================================   
    DELIMITER $$   
    DROP PROCEDURE IF EXISTS `test`.`queryPro` $$   
    CREATE DEFINER=`root`@`localhost` PROCEDURE `queryPro`()   
    BEGIN   
      select * from table_test ;   
    END $$   
    DELIMITER ;   
           ===========================================   
           * 这是一个无参的存储过程jdbc 使用方法   
           * @throws SQLException   
           */   
         public void testQuery() throws SQLException{   
             Connection conn=null;   
             CallableStatement cstmt=null;   
             ResultSet rs=null;   
             try{   
                  conn=this.getConnection();   
                  cstmt =conn.prepareCall("{call queryPro()}");   
                  rs=cstmt.executeQuery();   
                  while(rs.next()){   
                       System.out.println("id:"+rs.getInt(1)+"||name:"+rs.getString(2));   
                  }   
             }catch(Exception e){e.printStackTrace();}   
             finally{   
                  if(rs!=null){   
                       rs.close();   
                  }   
                  if(cstmt!=null){   
                       cstmt.close();   
                  }   
                  if(conn!=null){   
                       conn.close();   
                  }   
             }   
         }   
         /**   
           ===========================================   
    DELIMITER $$   
    DROP PROCEDURE IF EXISTS `test`.`queryProV` $$   
    CREATE DEFINER=`root`@`localhost` PROCEDURE `queryProV`(tid integer)   
    BEGIN   
      select * from table_test where id=tid;   
    END $$   
    DELIMITER ;   
           ===========================================   
           * 这是一个有参的存储过程jdbc 使用方法   
           * @throws SQLException   
           */   
         public void testQueryV() throws SQLException{   
             Connection conn=null;   
             CallableStatement cstmt=null;   
              ResultSet rs=null;   
             try{   
                  conn=this.getConnection();   
                  cstmt =conn.prepareCall("{call queryProV(?)}");   
                  cstmt.setInt(1, 2);// 就是把上句中第一个问号的值设为2   
                  rs=cstmt.executeQuery();   
                  while(rs.next()){   
                       System.out.println("id:"+rs.getInt(1)+"||name:"+rs.getString(2));   
                  }   
             }catch(Exception e){e.printStackTrace();}   
             finally{   
                  if(rs!=null){   
                       rs.close();   
                  }   
                  if(cstmt!=null){   
                       cstmt.close();   
                  }   
                  if(conn!=null){   
                       conn.close();   
                  }   
            }   
         }   
         /**   
          ===========================================   
    DELIMITER $$   
    DROP PROCEDURE IF EXISTS `test`.`delPro` $$   
    CREATE DEFINER=`root`@`localhost` PROCEDURE `delPro`(tid nteger)   
    BEGIN   
      delete from table_test where id=tid;   
    END $$   
    DELIMITER ;   
           ===========================================   
           * 这是一个有参的存储过程jdbc 使用方法   
           * @throws SQLException   
           */   
        public void testDel() throws SQLException{   
             Connection conn=null;   
             CallableStatement cstmt=null;   
             try{   
                  conn=this.getConnection();   
                  cstmt =conn.prepareCall("{call delPro(?)}");   
                  cstmt.setInt(1, 2);// 就是把上句中第一个问号的值设为2   
                  boolean tag=cstmt.execute();       
                  System.out.println(" 删除成功");   
             }catch(Exception e){e.printStackTrace();}   
             finally{   
                     if(cstmt!=null){   
                       cstmt.close();   
                  }   
                  if(conn!=null){   
                       conn.close();   
                  }   
            }   
         }   
         public static void main(String [] args) throws SQLException{   
         Test tset =new Test();   
              }   
    }  
    四、Hibernate  JDBC中使用
    
    4.1 在数据库中创建存储过程;
    
    4.2 在hibernate 中配置存储过程,以及返回的对象
    
    <?xml version="1.0" encoding="utf-8"?>   
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
    <!--   
         Mapping file autogenerated by MyEclipse Persistence Tools   
    -->   
    <hibernate-mapping>   
         <class name="com.test.hibernate.TableTest" table="table_test"   
             catalog="test">   
             <id name="id" type="java.lang.Integer">   
                  <column name="id" />   
                  <generator class="assigned" />   
             </id>   
             <property name="name" type="java.lang.String">   
                 <column name="name" length="45" />   
             </property>   
             <property name="value" type="java.lang.String">   
                  <column name="value" length="45" />   
             </property>   
        </class>   
         <!-- 无参数: Hibernate 存储过程配置 -->   
        <!-- name: 查询语句在hibernate 中的名字, 随便取 -->      
       <sql-query name="queryPro1" callable="true">   
        <!-- alias: 查询返回的对象的别名, 随便取           
        class 查询返回的类的全路径,否则会抱找不到类的错误 -->   
        <return alias="t1" class="com.test.hibernate.TableTest">   
             <!-- 查询中每一个参数的设置,name 表示为别名 -->   
             <return-property  name="c1" column="id" />   
            <return-property  name="c2" column="name" />   
             <return-property  name="c3" column="value" />   
        </return>   
         <!-- mysql 中存储过程 -->   
        { call queryPro()}   
        </sql-query>   
       <!-- 有参数: Hibernate 存储过程配置 -->   
       <!-- name: 查询语句在hibernate 中的名字, 随便取 -->      
        <sql-query name="queryPro2" callable="true">   
        <!-- alias: 查询返回的对象的别名, 随便取           
        class 查询返回的类的全路径,否则会抱找不到类的错误 -->   
        <return alias="TableTest" class="com.test.hibernate.TableTest">   
             <!-- 查询中每一个参数的设置,name 表示为别名 -->   
             <return-property  name="id" column="id" />   
             <return-property  name="name" column="name" />   
             <return-property  name="value" column="value" />   
        </return>   
        <!-- mysql 中存储过程 -->   
        {call queryProV(?)}   
       </sql-query>   
    </hibernate-mapping>   
    4.3. 使用   
    package com.test.dao;   
    import java.sql.CallableStatement;   
    import java.sql.Connection;   
    import java.sql.PreparedStatement;   
    import java.sql.ResultSet;   
    import java.sql.SQLException;   
    import java.util.List;   
    import org.hibernate.Query;   
    import org.hibernate.Session;   
    import com.test.hibernate.HibernateSessionFactory;   
    import com.test.hibernate.TableTest;   
    public class TestDao {   
         /**   
           * 无参数的hibernate 存储过程查询   
           */   
         public void query(){   
            Session session=null;   
            try{   
                  session=HibernateSessionFactory.getSession();             
                  Query qy=session.getNamedQuery("queryPro1");              
                  List<TableTest> list=qy.list();   
                  if(list!=null){   
                       for(int i=0;i<list.size();i++){                      
                           TableTest test=list.get(i);   
                           System.out.println("id="+test.getId()+"||name:"+test.getName());   
                       }   
                 }      
             }catch(Exception e){e.printStackTrace();}   
             finally{   
                  if(session!=null){   
                       session.close();   
                 }   
             }      
         }   
         /**   
           * 有参数的hibernate 的存储过程之查询   
           */   
         public void queryV(){   
            Session session=null;   
             try{   
                  session=HibernateSessionFactory.getSession();             
                  Query qy=session.getNamedQuery("queryPro2");         
                  qy.setInteger(0, 3);// 设置指定位置的参数,注意参数从0 开始。   
                  List<TableTest> list=qy.list();   
                  if(list!=null){   
                       for(int i=0;i<list.size();i++){                      
                           TableTest test=list.get(i);   
                           System.out.println("id="+test.getId()+"||name:"+test.getName());   
                       }   
                  }      
             }catch(Exception e){e.printStackTrace();}   
             finally{   
                  if(session!=null){   
                       session.close();   
                  }   
             }      
         }   
        /**   
          * 此种方法是jdbc 的方法   
           * 优点:不用在在配置文件中进行配置   
          * 缺点:无法返回对象   
           * @throws SQLException   
           */   
         public void queryOther() throws SQLException{   
             Session session=null;   
             Connection conn=null;   
             PreparedStatement pst=null;   
             ResultSet rs=null;   
             try{   
                  session=HibernateSessionFactory.getSession();   
                    conn=session.connection();   
                    pst=conn.prepareCall("{call queryProV(?)}");   
                  pst.setInt(1, 3);   
                    rs=pst.executeQuery();   
                  while(rs.next()){   
                       System.out.println("id="+rs.getInt(1)+"||name:"+rs.getString(2));   
                  }   
                    
            }catch(Exception e){e.printStackTrace();}   
             finally{   
                  if(rs!=null){   
                       rs.close();   
                  }   
                  if(pst!=null){   
                      pst.close();   
                  }   
                  if(conn!=null){   
                       conn.close();   
                  }   
                  if(session!=null){   
                       session.close();   
                  }   
             }      
        }   
         public static void main(String [] args) throws SQLException{   
             TestDao td=new TestDao();   
             td.queryOther();   
         }   
    }  
  • 相关阅读:
    vue中的watch
    css渲染层次理解及实际问题
    css中一些设计总结
    python打包文件(nuitka)
    vue实现前后端文件的上传和下载
    pyqt5使用多线程避免程序假死
    使用python编写shell脚本并运行
    记录一下WordNet多线程下的bug
    利用多线程对大数组进行处理
    nginx配置静态文件
  • 原文地址:https://www.cnblogs.com/OOAbooke/p/2381580.html
Copyright © 2011-2022 走看看