Mybatis访问DM8存储过程

近期有项目需要通过ibatis访问存储过程,对该需求进行了相关测试,并提供了Mybatis访问DM8数据库存储过程的方法给厂商人员,在这将测试方法做简单记录。

1、环境介绍:

软件

版本

DM数据库

1-1-126-20.09.04-126608-ENT 

IDEA

IntelliJ IDEA 2020.2.2 x64

JDK

1.8

Maven

apache-maven-3.6.1

Spring Boot

2.3.7-RELEASE

mybatis

mybatis-2.1.4

DM8数据库:新一代大型通用关系型数据库,全面支持 ANSI SQL 标准和主流编程语言接口/开发框架。行列融合存储技术,在兼顾 OLAP 和 OLTP 的同时,满足 HTAP 混合应用场景。

IntelliJ IDEA:简称 IDEA,由 JetBrains 公司开发,是 Java 编程语言开发的集成环境,具有美观,高效等众多特点。

Maven:Apache Maven是一个(特别是Java编程)项目管理及自动构建工具。

Spring Boot:由Pivotal团队提供的全新框架,用来简化Spring应用的初始搭建以及开发过程。有两个非常重要的策略:开箱即用和约定优于配置。

MyBatis:是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。可以通过简单的 XML 或注解来配置。

2、表结构:

CREATE TABLE "SYSDBA"."USERINFO"
(
"USER_ID" INT IDENTITY(1, 1) NOT NULL,
"USERNAME" VARCHAR(50),
"PASSWORD" VARCHAR(50),
"NAME" VARCHAR(50),
"INPUT_TIME" TIMESTAMP(6) DEFAULT SYSDATE NOT NULL,
CLUSTER PRIMARY KEY("USER_ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;

3、存储过程:

CREATE OR REPLACE PROCEDURE "SYSDBA"."PR_ADDUSER"(
"V_USERNAME" IN VARCHAR(50),
"V_PASSWORD" IN VARCHAR(50),
"V_NAME" IN VARCHAR(50),
"V_OUT_ID" OUT INTEGER)
as
 BEGIN
   --插入
   INSERT INTO SYSDBA.USERINFO (username,password,name) VALUES (v_username,v_password,v_name);
   COMMIT;
      --返回最大的id
   SELECT max(user_id) FROM userinfo;
    EXCEPTION
          WHEN OTHERS THEN
          v_out_id :=-1;
          print v_out_id;
          ROLLBACK;
END;

 4、测试存储过程是否可用

call PR_ADDUSER('test','test','test',1);
SELECT * FROM "SYSDBA"."USERINFO";

5、搭建项目结构如下图:

5.1 引入需要的依赖

<!--基于Spring Boot的MyBatis应用程序-->
<dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>2.1.4</version>
 </dependency>
 <!--druid连接池-->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid-spring-boot-starter</artifactId>
     <version>1.1.10</version>
 </dependency>
 <!--DM8驱动程序-->
 <dependency>
     <groupId>com.dameng</groupId>
     <artifactId>Dm8JdbcDriver18</artifactId>
     <version>8.1.1.49</version>
 </dependency>
 <!--实体类bean快速生成get set方法,从而不用手动添加-->
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
 </dependency>
 <!--关于web的依赖-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

5.2  在application.properties中配置数据库连接和mybatis的相关信息

#下面这些内容是为了让MyBatis映射
#debug日志配置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*.xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.dameng.mybatis_demo.model
#开启驼峰命名转换
mybatis.configuration.map-underscore-to-camel-case=false
mybatis.configuration.jdbc-type-for-null=null
# 数据库驱动:
spring.datasource.druid.driver-class-name=dm.jdbc.driver.DmDriver
# 数据源名称
spring.datasource.name=dm
# 数据库连接地址
spring.datasource.druid.url=jdbc:dm://127.0.0.1:5236 
# 数据库用户名&密码:
spring.datasource.druid.username=SYSDBA
spring.datasource.druid.password=*******

5.3 创建Userinfo

package com.dameng.mybatis_demo.model;

import lombok.Data;
/*构造set,get,无参有参和toString方法*/
@Data
public class Userinfo {
        private Integer user_id;
        private String username;
        private String password;
        private String name;
        private String input_time;
}

 注意:本项目中引用了Lombok项目,所以不需要在代码中写get和set方法。

5.4 创建Mapper,添加user和user2方法 

package com.dameng.mybatis_demo.mapper;

import com.dameng.mybatis_demo.model.Userinfo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
@Repository //dao层组件注解
public interface UserinfoMapper{
    //通过HashMap 作为参数实现
    void User(HashMap user);
    //通过实体类作为参数实现
    Integer User2(Userinfo userinfo);
}

5.5  在Dmreplace.xml中调用PR_ADDUSER存储过程

<!--namespace对应mapper接口所在的位置-->
<mapper namespace="com.dameng.mybatis_demo.mapper.UserinfoMapper">
    <!-- 通过HashMap 作为参数实现 -->
    <select id="User" statementType="CALLABLE" parameterMap="userInfomation" resultType="java.lang.Integer">
    {call PR_ADDUSER(?,?,?,?)}
  </select>
    <parameterMap id="userInfomation" type="java.util.HashMap">
        <parameter property="username" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
        <parameter property="password" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
        <parameter property="name" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
        <parameter property="user_id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
    </parameterMap>
    <!-- 通过实体类作为参数实现 -->
    <select id="User2" statementType="CALLABLE" parameterType="com.dameng.mybatis_demo.model.Userinfo" resultType="java.lang.Integer">
    {call PR_ADDUSER(#{username,mode=IN,jdbcType=VARCHAR},
                     #{password,mode=IN,jdbcType=VARCHAR},
                     #{name,mode=IN,jdbcType=VARCHAR},
                     #{user_id,mode=OUT,jdbcType=INTEGER}
      )}
  </select>
</mapper>

说明:这里使用两种方式调用存储过程,两种方式的区别主要在于参数的使用方式上,第一种方式使用parameterMap,第二种方式使用parameterType。

5.6 创建UserinfoController

package com.dameng.mybatis_demo.controller;

import com.dameng.mybatis_demo.mapper.UserinfoMapper;
import com.dameng.mybatis_demo.model.Userinfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;

@RestController
public class UserinfoController {

    @Autowired
    private UserinfoMapper userinfoMapper;

   @RequestMapping(value = "/testuser")
    public String testUser() {
        HashMap user = new HashMap();
        user.put("username", "lishi");
        user.put("password", "lishi");
        user.put("name", "lishi");
        user.put("user_id", 0);
        System.out.println(user);
        userinfoMapper.User(user);
        return "sussess";
    }
    @RequestMapping(value = "/testuser2")
    public String testUser2(){
        Integer v_out_id = 0;
        Userinfo userinfo = new Userinfo();
        userinfo.setUsername("张三");
        userinfo.setPassword("asdfa");
        userinfo.setName("zhang");
        Integer a = userinfoMapper.User2(userinfo);
        System.out.println("添加成功,增加的userid=" + a);
        return "sussess";
    }
}

 6、启动工程项目

 6.1 调用User方法测试

 6.2 调用User2方法测试 

 登录数据库检查,如下图数据写入成功。

 总结:

1、MyBatis支持使用存储过程的配置。本次测试使用了两种方式调用存储过程。当使用存储过程时,需要设置一个参数“mode”,其值有IN(输入参数)、OUT(输出参数)和INOUT(输入/输出参数)。

2、因该该实验环境主要从功能方面做的测试,具体性能需要实际测试。

3、该实验环境中引用达梦jdbc驱动的方法为直接引用MAVEN库中的8.1.1.49版本驱动包。

4、需要注意实体类中字段类型要与XML文件中的jdbcType类型对应。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值