MyBatis输入参数问题

输入参数:parameterType

  1. 输入参数为简单类型时#{}和${}的使用
  2. 对象类型 写法是一样的: #{属性名} ${属性名}

输入对象为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();
 		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值