在其他地方我已經寫過一個mySql存儲過程的簡單實作http://jianboli.blog.51cto.com/12075002/1884019
這裡是java調用存儲過程。
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中調用,也可以在觸發器中調用,欲知簡單實作。可以參考我的上一篇文章“觸發器的簡單實作”。
http://jianboli.blog.51cto.com/12075002/1884180
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關鍵字查詢。
@Override
public Integer batchImportCardAndUser(BatchImportParam batchImportParam) {
return getSqlSession().selectOne(getSqlMapNamespace() + ".batch_import_cardanduser",batchImportParam);
}
在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中調用也相當于上面的直接在方法中直接調用,都是需要傳入參數,傳回參數,隻是表現形式不一樣而已。
我這裡隻是一個示例,你可以參考裡面的注釋,具體存儲過程的名字要根據你自己寫的來修改。
時間: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