近期有项目需要通过ibatis访问存储过程,对该需求进行了相关测试,并提供了Mybatis访问DM8数据库存储过程的方法给厂商人员,在这将测试方法做简单记录。
软件 |
版本 |
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 或注解来配置。
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) ;
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;
call PR_ADDUSER('test','test','test',1);
SELECT * FROM "SYSDBA"."USERINFO";
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
com.alibaba
druid-spring-boot-starter
1.1.10
com.dameng
Dm8JdbcDriver18
8.1.1.49
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-web
#下面这些内容是为了让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=*******
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方法。
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);
}
说明:这里使用两种方式调用存储过程,两种方式的区别主要在于参数的使用方式上,第一种方式使用parameterMap,第二种方式使用parameterType。
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";
}
}
登录数据库检查,如下图数据写入成功。
1、MyBatis支持使用存储过程的配置。本次测试使用了两种方式调用存储过程。当使用存储过程时,需要设置一个参数“mode”,其值有IN(输入参数)、OUT(输出参数)和INOUT(输入/输出参数)。
2、因该该实验环境主要从功能方面做的测试,具体性能需要实际测试。
3、该实验环境中引用达梦jdbc驱动的方法为直接引用MAVEN库中的8.1.1.49版本驱动包。
4、需要注意实体类中字段类型要与XML文件中的jdbcType类型对应。