在其餘地方我已經寫過一個mySql存儲過程的簡單實現http://jianboli.blog.51cto.com/12075002/1884019java
這裏是java調用存儲過程。
mysql
package com.lijianbo.procedure; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Types; /** * @author * 存儲過程MySQL */ public class ProcedureMySql { public static final String DRIVER_CLASS = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/test"; public static final String USERNAME = "root"; public static final String PASSWORD = "root"; public static void main(String[] args) throws Exception { // test1(); // test2(); testIdAdd(); } public static void test1() throws Exception { Class.forName(DRIVER_CLASS); Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); String sql = "{CALL test1(?)}"; //調用存儲過程 CallableStatement cstm = connection.prepareCall(sql); //實例化對象cstm cstm.setString(1, "李"); //存儲過程輸入參數 cstm.execute(); // 執行存儲過程 cstm.close(); connection.close(); } /** * 查詢總的價格 * getTotalByUser2 * call getTotalByUser2(1, true, @total); -- 加稅 *select @total; * @throws Exception */ public static void test2() throws Exception { Class.forName(DRIVER_CLASS); Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); String sql = "{CALL getTotalByUser2(?,?,?)}"; //調用存儲過程 CallableStatement cstm = connection.prepareCall(sql); //實例化對象cstm cstm.setInt(1, 1); //設置第一個傳入參數 cstm.setBoolean(2, true); //設置第二個傳入參數 cstm.registerOutParameter(3, Types.DECIMAL); // 設置返回值類型 即返回值 cstm.execute(); // 執行存儲過程 System.out.println(cstm.getString(3)); cstm.close(); connection.close(); } /** *id自增 * getTotalByUser2 * call getTotalByUser2(1, true, @total); -- 加稅 *select @total; * @throws Exception */ public static void testIdAdd() throws Exception { Class.forName(DRIVER_CLASS); Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); String sql = "{CALL test1(?)}"; //調用存儲過程 CallableStatement cstm = connection.prepareCall(sql); //實例化對象cstm cstm.setString(1, "測試"); //設置第一個傳入參數 cstm.execute(); // 執行存儲過程 cstm.close(); connection.close(); } }
存儲過程既能夠在java中調用,也能夠在觸發器中調用,欲知簡單實現。能夠參考個人上一篇文章「觸發器的簡單實現」。sql
http://jianboli.blog.51cto.com/12075002/1884180ide
Java在sql中調用存儲過程:函數
參數封裝:測試
//存儲過程參數封裝 BatchImportParam batchImportParam = new BatchImportParam(); batchImportParam.setDescn(descn); batchImportParam.setExportName(exportName); batchImportParam.setExportNo(exportNo); batchImportParam.setImportName(importName); batchImportParam.setOrderNo(orderNo); batchImportParam.setImportNo(importNo); batchImportParam.setCreateby(getCurrentUserId(request)); batchImportParam.setCardProductId(cardProductId); batchImportParam.setCardFaceId(cardFaceId); batchImportParam.setCardTotalCount(null);
/* * 調用存儲過程,執行業務 */ //batchImportParam爲調用存儲 //過程的封裝的參數類,這裏也能夠採用一個map,向map中傳參數。 batchImportCardManager.batchImportCardAndUser(batchImportParam); //返回的參數,咱們能夠直接在參數集合中去 //直接獲取 cardTotalCount = batchImportParam.getCardTotalCount(); System.err.println("==================存儲過程成功導入總記錄數爲:"+cardTotalCount);
在BatchImportCardDAOImpl中咱們採用select關鍵字查詢。spa
@Override public Integer batchImportCardAndUser(BatchImportParam batchImportParam) { return getSqlSession().selectOne(getSqlMapNamespace() + ".batch_import_cardanduser",batchImportParam); }
在xml中調用存儲過程。
xml
<!-- 存儲過程 --> <parameterMap id="map_r_process_order" type="java.util.HashMap"> <parameter property="importNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" /> <!-- 輸入參數 --> <parameter property="importName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" /> <parameter property="orderNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" /> <parameter property="exportNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" /> <parameter property="exportName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" /> <parameter property="createby" jdbcType="INTEGER" javaType="int" mode="IN" /> <parameter property="descn" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" /> <parameter property="cardProductId" jdbcType="INTEGER" javaType="int" mode="IN" /> <parameter property="cardFaceId" jdbcType="INTEGER" javaType="int" mode="IN" /> <parameter property="cardTotalCount" jdbcType="INTEGER" javaType="int" mode="OUT" /> <!-- 返回參數 --> </parameterMap> <select id="batch_import_cardanduser" parameterMap="map_r_process_order" statementType="CALLABLE" > <![CDATA[ {call batch_import_cardanduser(?,?,?,?,?,?,?,?,?,?)} <!-- 問號個數必需要和參數的個數匹配 --> ]]> </select>
總結:其實這種在xml中調用也至關於上面的直接在方法中直接調用,都是須要傳入參數,返回參數,只是表現形式不同而已。對象
我這裏只是一個示例,你能夠參考裏面的註釋,具體存儲過程的名字要根據你本身寫的來修改。blog
時間:2016年12月20日16:59:13
-------------快速的向一張表中插入10萬條數據,怎麼作,用sql實現------------
最開始我想寫一句插入的sql,直接循環插入多條數據,結果語法不正確。(sql只能執行一次,不能循環執行,調用一次執行一次)
INSERT INTO test1(id,name) VALUES(1+(SELECT MAX(t.id) FROM test1 t),CONCAT('admin',(SELECT MAX(t1.id)+1 FROM test1 t1))) WHERE ((SELECT MAX(id) from test1) < 10)後面百度、發現用存儲過程比較方便,更易實現。
以下:
-- 存儲過程 delimiter || create procedure myproc() begin declare num int ; set num = 1 ; while num < 100 do insert into test1(id, `name`) values (num, concat("name", num)) ; set num = num + 1 ; end while ; end|| -- 執行這個函數 call myproc() -- 刪除這個存儲過程 drop procedure myproc -- 清空表 DELETE from test1 -- 查詢數據 SELECT * from test1
總結:存儲過程更易寫邏輯,難度更低。咱們有時候寫多條關聯查詢的時候,sql難度比較大,其實能夠寫存儲過程來實現,只是後期維護難度大點。