http://lohasle.iteye.com/blog/1669879
存儲過程都是一樣的,只是根據自己的喜好,可以用MAP或者JAVABEAN傳遞參數。
- -- --------------------------------------------------------------------------------
- -- Routine DDL
- -- Note: comments before and after the routine body will not be stored by the server
- -- --------------------------------------------------------------------------------
- DELIMITER $$
- CREATE DEFINER=`root`@`localhost` PROCEDURE `selectCount`(
- IN pcsId int,
- IN drId int,
- IN partnerId int,
- IN customerId int,
- OUT pcsCount int,
- OUT drCount int
- )
- BEGIN
- select count(md.id) into @pcsC from mdm_device md
- left join mdm_device_security mds on mds.device_id = md.id
- where mds.device_rooted = pcsId
- and md.partner_id = partnerId and md.customer_id = customerId;
- set pcsCount = @pcsC;
- select count(md.id) into @drC from mdm_device md
- where md.managed_status = drId and DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(md.un_manage_date)
- and md.partner_id = partnerId and md.customer_id = customerId;
- set drCount = @drC;
- END
1.java調用傳入MAP。獲取通過MAP獲取。
1.1 mapper文件寫法
- <parameterMap type="map" id="homeVO">
- <parameter property="pcsId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="drId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="partnerId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="customerId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="pcsCount" jdbcType="INTEGER" mode="OUT"/>
- <parameter property="drCount" jdbcType="INTEGER" mode="OUT"/>
- </parameterMap>
- <select id="selectForHome" parameterMap="homeVO"
- statementType="CALLABLE">
- {call selectCount(
- ?,?,?,?,?,?
- )}
- </select>
1.2 java調用寫法
- @Override
- public StringselectHomeCount(HomeVO home) throws Exception {
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("pscId", 0);
- map.put("drId", 1);
- map.put("partnerId", 25);
- map.put("customerId", 50);
- map.put("isolation", 1);
- selectOne("Mapper.selectForHome", map);
- System.out.println(map.get("pcsCount"));
- return map.get("drCount");
- }
2.java調用傳入javaBean。返回值通過javaBean屬性獲取
2.1 通過javabean傳遞參數 mapper寫法
- <parameterMap type="com.polysaas.mdm.device.entity.HomeVO" id="home">
- <parameter property="pcsId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="drId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="partnerId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="customerId" jdbcType="INTEGER" mode="IN"/>
- <parameter property="pcsCount" jdbcType="INTEGER" mode="OUT"/>
- <parameter property="drCount" jdbcType="INTEGER" mode="OUT"/>
- </parameterMap>
javaBean可以通過兩種來進行映射
- <resultMap type="com.polysaas.mdm.device.entity.HomeVO" id="home">
- <result column="partnerId" property="partnerId" jdbcType="INTEGER"/>
- <result column="customerId" property="customerId" jdbcType="INTEGER" />
- <result column="pcsId" property="pcsId" jdbcType="INTEGER" />
- <result column="drId" property="drId" jdbcType="INTEGER" />
- <result column="pcsCount" property="pcsCount" jdbcType="INTEGER" />
- <result column="drCount" property="drCount" jdbcType="INTEGER" />
- </resultMap>
- <select id="selectForHome2" parameterType="com.polysaas.mdm.device.entity.HomeVO"
- statementType="CALLABLE">
- {call selectCount(
- #{pcsId,jdbcType=INTEGER, mode=IN},
- #{drId, jdbcType=INTEGER,mode=IN},
- #{partnerId, jdbcType=INTEGER,mode=IN},
- #{customerId, jdbcType=INTEGER,mode=IN},
- #{pcsCount, jdbcType=INTEGER,mode=OUT},
- #{drCount, jdbcType=INTEGER,mode=OUT}
- )}
- </select>
2.2 通過javabean傳遞參數 java調用寫法
- @Override
- public HomeVO selectHomeCount(HomeVO home) throws Exception {
- HomeVO vo = new HomeVO();
- vo.setPcsId(0);
- vo.setDrId(0);
- vo.setPartnerId(25);
- vo.setCustomerId(50);
- vo.setPcsCount(0);
- vo.setDrCount(0);
- selectOne("com.polysaas.mdm.device.mapper.MdmDeviceMapper.selectForHome2", vo);
- return vo;
- }
遇到異常很多。。記得的寫下
1.通過javaBean的時候,#{pcsId, mode=IN, javaType=INTEGER},javaType這個屬性是必須的。
2.使用javaBean傳遞。輸出參數不需要初始值。個人喜好並建議使用javaBean,因為定義更清晰,封裝性。
3.map可以用占位符問號,javaBean不可以。 會有異常 No value specified for parameter 1
4. 說不認識某個參數。。可能是沒有創建存儲過程,這個發生在多個庫的時候
5. read Only 這個可能是事務控制只讀。。我是因為存儲過程有set 語句,而方法叫做selectAaaa()。