我的电脑操作系统版本为Win7旗舰版(ServicePack1),Oracle版本为Oracle11g
程序使用的jar包有:mybatis-3.2.2.jar、ojdbc14-10.2.0.2.0.jar
本例中使用的配置文件mybatis-config.xml、PersonInfo类以及Oracle数据库的表结构,可以参见我的另一篇Blog《一个简单的MyBatis连接Oracle数据库的例子》(http://my.oschina.net/Tsybius2014/blog/626206)
这次还需要向数据库中添加一个自定义函数,功能很简单,就是用select语句从person_info表中搜出指定id条目的gender字段内容,代码(get_gender_by_id.sql)如下:
create or replace function get_gender_by_id
(
p_id number,
p_gender out char,
p_error_no out number , --错误号
p_error_info out varchar2 , --错误提示
p_error_id out number , --错误序号
p_error_sysinfo out varchar2 --系统错误信息
)
return char
is PRAGMA AUTONOMOUS_TRANSACTION;
begin
select gender into p_gender from person_info where id = p_id;
p_error_no := 0;
p_error_info := '';
p_error_id := SQLCODE;
p_error_sysinfo := SQLERRM;
return p_gender;
exception
when others then
rollback;
p_error_no := 999;
p_error_info := '函数执行错误';
p_error_id := SQLCODE;
p_error_sysinfo := SQLERRM;
return 'x';
end get_gender_by_id;
/
执行了上面脚本后,可使用PL/SQL调试此自定义函数,如下面输入id为333,返回的结果是'm'
现在来说MyBatis的调用代码。
PersonInfoMapper.java代码如下:
import java.util.Map;
public interface PersonInfoMapper {
void getGenderById(Map<String, Object> paramMap);
}
对应的XML文件,PersonInfoMapper.xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="PersonInfoMapper">
<parameterMap id="paramMapX" type="java.util.Map">
<parameter property="result" javaType="java.lang.String" jdbcType="CHAR" mode="OUT"/>
<parameter property="id" javaType="java.lang.Long" jdbcType="NUMERIC" mode="IN"/>
<parameter property="gender" javaType="java.lang.String" jdbcType="CHAR" mode="OUT"/>
<parameter property="errorNo" javaType="java.lang.Long" jdbcType="NUMERIC" mode="OUT"/>
<parameter property="errorInfo" javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT"/>
<parameter property="errorId" javaType="java.lang.Long" jdbcType="NUMERIC" mode="OUT"/>
<parameter property="errorSysInfo" javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>
<select id="getGenderById" statementType="CALLABLE" parameterMap="paramMapX">
{? = call get_gender_by_id(?,?,?,?,?,?) }
</select>
</mapper>
调用此功能的Java代码如下:
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* MyBatis使用测试
* @author Tsybius2014
* @date 2016年2月29日
* @time 下午11:47:01
* @remark
*
*/
public class MyBatisTest {
public static void main(String[] args) {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
PersonInfoMapper mapper = session.getMapper(PersonInfoMapper.class);
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("id", 333L);
mapper.getGenderById(paramMap);
// 输出错误信息
long errorNo = (Long) paramMap.get("errorNo");
String errorInfo = (String) paramMap.get("errorInfo");
long errorId = (Long) paramMap.get("errorId");
String errorSysInfo = (String) paramMap.get("errorSysInfo");
if (errorNo != 0) {
//TODO 错误处理
}
String gender = (String) paramMap.get("gender");
System.out.println(gender);
} finally {
session.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
这段代码的输出到控制台的结果也是'm'
END