输入参数:parameterType
- 输入参数为简单类型时#{}和${}的使用
- 对象类型 写法是一样的: #{属性名} ${属性名}
输入对象为HashMap:
select * from student where studentAge= #{studentAge}
用map中key的值 匹配 占位符#{studentAge}
如果匹配成功 就用map的value替换占位符
mybatis调用存储过程
<select id="queryCountByGradeWithProcedure" statementType="CALLABLE" parameterType="HashMap" >
{
CALL queryCountByGradeWithProcedure(
#{gName,jdbcType=VARCHAR,mode=IN},
#{scount,jdbcType=INTEGER,mode=OUT}
)
}
</select>
其中
- 通过statementType="CALLABLE"设置SQL的执行方式是存储过程。
- 存储过程的输入参数gName需要通过HashMap来指定
- 在使用时,通过hashmap的put方法传入输入参数的值;通过hashmap的Get方法 获取输出参数的值。
ps.
-
要注意Jar问题:ojdbc6.jar不能在 调存储过程时 打回车、tab,但是ojdbc7.jar可以。
-
如果报错: No enum constant org.apache.ibatis.type.JdbcType.xx,则说明mybatis不支持xx类型,需要查表👉 Mybatis中 javaType和jdbcType对应关系
-
存储过程 无论输入参数是什么值,语法上都需要 用map来传递该值;
-
只要是
<transactionManager type="JDBC" />
,则增删改都需要手工commit ;
每次开发的步骤都是mapper.xml->mapper接口->测试方法
demo
1.查询某个年级的 学生总数
输入:年级
输出:该年级的学生总数
sql处理方式:
create or replace procedure queryCountByGradeWithProcedure(gName in varchar, scount out number )
as
begin
select count(*) into scount from student where graname = gname ;
end;
/
StudentMapper.xml
<!-- 通过调用[存储过程] 实现查询
statementType="CALLABLE",默认preparedStatement,
存储过程的输入参数,在mybatis用Map来传递(HashMap)
-->
<select id="queryCountByGradeWithProcedure" statementType="CALLABLE" parameterType="HashMap" >
{
CALL queryCountByGradeWithProcedure(
#{gName,jdbcType=VARCHAR,mode=IN},
#{scount,jdbcType=INTEGER,mode=OUT}
)
}
</select>
Mapper.java
//根据存储过程查询某个年级的学生总数
void queryCountByGradeWithProcedure(Map<String,Object> params );
Test.java
//根据存储过程查询某个年级的学生总数
public static void queryCountByGradeWithProcedure() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml") ;
SqlSessionFactory sessionFacotry = new SqlSessionFactoryBuilder().build(reader,"development") ;
SqlSession session = sessionFacotry.openSession() ;
StudentMapper studentMapper = session.getMapper( StudentMapper.class) ;
//通过map给 存储过程指定输入参数
Map<String,Object> params = new HashMap<>();
params.put("gName", "g1") ;//指定存储过程的输入参数gName的值是g1
//存储值返回值不能这么处理: int count= studentMapper.queryCountByGradeWithProcedure(params) ;
//调用存储过程,并传入输入参数
studentMapper.queryCountByGradeWithProcedure(params);
//获取存储过程的输出参数
Object count = params.get("scount") ;
System.out.println(count);
session.close();
}
2.根据学号删除学生
sql:
create or replace procedure deleteStuBynoWithProcedure(sno in number)
as
begin
delete from student where stuno = sno ;
end;
/
Mapper.xml:
<!-- 通过存储过程实现删除 -->
<delete id="deleteStuBynoWithProcedure" statementType="CALLABLE" parameterType="HashMap">
{
CALL deleteStuBynoWithProcedure(
#{sno,jdbcType=INTEGER,mode=IN}
)
}
</delete>
StudentMap.java
//根据存储过程查询某个年级的学生总数
void deleteStuBynoWithProcedure(Map<String,Object> params );
Test.java
//根据学号 删除学生(存错过程)
public static void deleteStudentByStunoWithProcedure() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml") ;
SqlSessionFactory sessionFacotry = new SqlSessionFactoryBuilder().build(reader,"development") ;
SqlSession session = sessionFacotry.openSession() ;
StudentMapper studentMapper = session.getMapper( StudentMapper.class) ;
Map<String,Object> map = new HashMap<>();
map.put("sno", 3) ;
studentMapper.deleteStuBynoWithProcedure( map) ;
session.commit();
session.close();
}