Mybatis调用oracle存储过程

最近使用到了oracle的存储过程, 下面建立一个测试的存储过程:

查询devices表格里面的所有内容, 这里输入的fid没有用到,是为了做其他调试

复制代码
create or replace procedure get_data_by_procedure(
                                                  fid in Integer, 
                                                  v_cursor out sys_refcursor) 
as
begin
  DBMS_OUTPUT.put_line('fid:'||fid);
  open v_cursor 
  for select 
    d.id, d.name, d.age 
    from devices d
    order by d.id asc;
    --where d.id = fid;
end;
复制代码

在pl/sql中看到这个存储过程:

image

下面用mybatis调用存储过程:

注意这里要另写一个resultMap, 如果直接用BaseResultMap, 会提示出错, 所有这里另外写一个;

复制代码
<resultMap id="BaseResultMap" type="com.xum.demo.pojo.Devices" >
    <id column="ID" property="id" jdbcType="NUMERIC" />
    <result column="NAME" property="name" jdbcType="VARCHAR" />
    <result column="AGE" property="age" jdbcType="NUMERIC" />
  </resultMap>
  <resultMap id="ProcedureInfoMap" type="com.xum.demo.pojo.Devices">
    <id column="ID" property="id" jdbcType="NUMERIC" />
    <result column="NAME" property="name" jdbcType="VARCHAR" />
    <result column="AGE" property="age" jdbcType="NUMERIC" />
  </resultMap>
复制代码
<select id="get_data_by_procedure" statementType="CALLABLE" parameterType="java.util.Map">
    {call get_data_by_procedure(#{fid, mode=IN,  jdbcType=NUMERIC},
                                #{v_cursor, jdbcType=CURSOR, mode=OUT, resultMap=ProcedureInfoMap, javaType=java.sql.ResultSet}
    )}
   </select>

写的存储过程注意几个点:

1. mybatis中调用存储过程, 要加上statementType="CALLABLE", 默认的输入参数类型是Map, 可以改变, 如加上parameterType="com.xx.Devices"这种类似的.

2. 这里返回的是游标类型, 所以jdbcType是CURSOR, mode是OUT类型.

3. resultMap是刚才定义的ProcedureInfoMap, 不要使用BaseResultMap.

4. javaType是java.sql.ResultSet类型.

Mapper里面的内容:

public interface DevicesMapper {  ……
    List<Devices> get_data_by_procedure(Map<String, Object> mapPara);
    ……
}

我自己封装了一个service:

复制代码
@Service(value = "devicesService")
@Transactional
public class DevicesServices {

    @Resource
    private DevicesMapper devicesMapper;

    public List<Devices> get_data_by_procedure(Map<String, Object> mapPara) {
        List<Devices> devices = null;
        devices = this.devicesMapper.get_data_by_procedure(mapPara);
        return devices;
    }

}
复制代码

最后在Conttroller里面加入调用的代码,(看到后台打印出来数据就可以了, 我这里是还要Thymeleaf前台显示, 读者可以不用考虑)

复制代码
@Controller
@RequestMapping(value = "/main")
public class MainController {

    private static final Logger LOG = LogManager.getLogger(MainController.class);

    @Autowired
    DevicesServices devicesServices;

    @RequestMapping(value = "/getDataByProcedure")
    public String get_data_by_procedure(ModelMap model) {
        Map<String, Object> mapPara = new HashMap<String, Object>();
        mapPara.put("fid", 1);
        this.devicesServices.get_data_by_procedure(mapPara);
        List<Devices> devices = (List<Devices>)mapPara.get("v_cursor");
        for (int i = 0; i < devices.size(); i++) {
            LOG.info("id:" + devices.get(i).getId() + ",name:" + devices.get(i).getName() + ",age:" + devices.get(i).getAge());
        }
        model.addAttribute("devices", devices);
        String viewName = "main/procedure";
        return  viewName;
    }

}
复制代码

如下打印数据:

2019-11-02 16:01:41.598  INFO 14120 --- [nio-8080-exec-1]   : id:1,name:a,age:111
2019-11-02 16:01:41.598  INFO 14120 --- [nio-8080-exec-1]   : id:2,name:b,age:222
2019-11-02 16:01:41.598  INFO 14120 --- [nio-8080-exec-1]   : id:3,name:c,age:333
2019-11-02 16:01:41.598  INFO 14120 --- [nio-8080-exec-1]   : id:4,name:d,age:444
2019-11-02 16:01:41.598  INFO 14120 --- [nio-8080-exec-1]   : id:5,name:e,age:555

至此, 从java调用Oracle的存储过程流程写完了, Controller里可以做自己的逻辑.


posted on   努力做一个伪程序员  阅读(1565)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示