KingbaseES客户端编程开发框架-MyBatis.pdf
KingbaseES 客户端编程开发框架-MyBatis 金仓数据库管理系统 KingbaseES 文档版本:V9(V009R001C001B0024) 发布日期:2023 年 10 月 12 日 北京人大金仓信息技术股份有限公司 目 目 录 录 第 1 章 前言 1 1.1 适用读者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 相关文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 术语 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.4 手册约定 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 2 章 概述 3 第 3 章 MyBatis 配置说明 4 第 4 章 MyBatis 程序示例 7 4.1 接口和实例开发示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4.2 存储过程的使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 第 5 章 MyBatis 注意点 12 版权声明 13 服务周期承诺 14 I 第 1 章 前言 1 第 章 前言 本文档描述了 KingbaseES 数据库对于 MyBatis 框架的支持情况和配置说明。 前言部分包含以下主题: • 适用读者 • 相关文档 • 术语 • 手册约定 1.1 适用读者 《KingbaseES MyBatis 指南》面向所有使用 KingbaseES 数据库的用户,主要是数据库管理员和应用程序开发 人员。 1.2 相关文档 有关 MyBatis 的更多信息,请参阅以下资源: MyBatis 中文网 1.3 术语 $KINGBASE_HOME :KingbaseES 数据库的安装路径。 1 第 1 章 前言 1.4 手册约定 本文档中可能出现“注意、提示、警告、另请参阅”等标志,它们所代表的含义如下: 注意: 用于突出重要/关键信息、最佳实践等。 提示: 用于突出小窍门、捷径等。 警告: 用于传递设备或环境安全警示信息,若不避免,可能会导致设备损坏、数据丢失、设备性能降低或其 它不可预知的结果。 另请参阅: 用于突出参考、参阅等。 以下程序代码书写约定适用于本文档: 符号 说明 [] 表示包含一个或多个可选项。不需要输入中括号本身。 {} 表示包含两个以上(含两个)的候选,必须在其中选取一个。不需要输入花括号本身。 | 分割中括号或者花括号中的两个或两个以上选项。不需要输入“|”本身。 ... 表示其之前的元素可以被重复。 斜体 表示占位符或者需要提供特定值的变量。 大写 表示系统提供的元素,以便与用户定义的元素相互区分。除出现在方括号中的元素外,应当按 照顺序逐字输入。当然,部分元素在系统中是大小写不敏感的,因此用户可以根据系统说明以 小写形式输入。 小写 表示由用户提供的元素。 2 第 2 章 概述 2 第 章 概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口 和 Java 的 POJOs(Plain Old Java Objects, 普通的 Java 对象) 映射成数据库中的记录。 在本章中详细说明了 KingbaseES 对 MyBatis 的支持情况,以及使用时应该注意的问题。 本章内容主要是基于 MyBatis 3 及后续版本支持情况的详细描述。 3 第 3 章 MYBATIS 配置说明 3 第 章 MyBatis 配置说明 Mybatis 的 jar 包可以从官方网站下载,Mybatis 所使用的 JDBC 包 kingbase8-9.0.0.jar 位于 $KINGBASE_HOME/Interface/jdbc 目录下。使用时将 Mybatis 包和 JDBC 包导入到项目的 Libraries 中并定义相关配 置项即可。 图 3.1: Mybatis 使用原理图 定义 Mybatis 配置文件,根据用户选择,更改一下配置文件。 a. 在 config.xml 中配置 JDBC 的驱动信息参数,数据库服务器信息参数和登陆用户信息参数。当然,这些参数也 可以根据用户应用需求,单独生成 property 文件,针对不用的应用场景,导入不同的属性文件。这里以 property 为例说明下 config.xml 的配置使用。 在 property 中增加如下声明: jdbc.driverClassName=com.kingbase8.Driver jdbc.url=jdbc:kingbase8://localhost:54321/TEST 4 第 3 章 MYBATIS 配置说明 jdbc.username= 登录名 jdbc.password= 登录密码 在 config.xml 中增加如下声明: b. 在 mapper.xml 中,主要是配置 SQL 映射关系,根据用户的需求,自定义映射关系。这里以一个简单的配置为 例。 在 mapper.xml 中增加如下声明: DROP TABLE IF EXISTS ${sql} CASCADE ${sql} insert into t_num(id,age,name,wage,cost) values(#{userId},#{userAge},#{userName},#{userWage},#{userCost}) update t_num set age=#{userAge},name=#{userName},wage=#{userWage}, cost=#{userCost}where id=#{userId} delete from t_num where id=#{value} delete from t_num 至此,MyBatis 的属性文件和映射文件的配置工作已经完成,接下来是来完成 Java 中对应的接口和实例 的开发工作。 6 第 4 章 MYBATIS 程序示例 4 第 章 MyBatis 程序示例 • 接口和实例开发示例 • 存储过程的使用 您可以前往 人大金仓官网 下载 MyBatis 测试用例 。 4.1 接口和实例开发示例 a. 在 Java 中读取 property 和 config 属性,配置到 sqlSessionFactory: @BeforeClass public static void setUpClass() throws Exception { InputStream fis = null; InputStream inputStream = null; try { Properties prop = new Properties(); fis = Resources.getResourceAsStream("propertty"); prop.load(fis); inputStream = Resources.getResourceAsStream("MyConfig.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development", prop); } catch(Exception e) { e.printStackTrace(); } } b. 在 Java 中配置 mapper.xml 对应的 namespace,为 Interface 类型: public interface MybatisDao { int createNewTableMap(Map param); int dropTable(Map param); 7 第 4 章 MYBATIS 程序示例 /* * new number table */ public List selectNumTable(); public NumEntity selectNumTableByID(int id); public List selectNumTableByAge(int age); public List selectNumTableByName(String name); public void insertNumTable(NumEntity user); public void updateNumTableById(NumEntity user); public void deleteNumTableById(int id); public void deleteNumTable(); } c. 在 Java 中进行表的查询操作: public void testNumTable() { SqlSession session = sqlSessionFactory.openSession(); int i = 1; try { MybatisDao userOperation = session.getMapper(MybatisDao.class); List users = userOperation.selectNumTable(); for (NumEntity user : users) { System.out.println(user); Assert.assertEquals(i, user.getId()); Assert.assertEquals(AGE+i, user.getUserAge()); Assert.assertEquals(name[i], user.getUserName()); Assert.assertEquals("yes",WAGE+(double)(i*100)/(double)(3.0), user.getUserWage(),0.000001); Assert.assertEquals("yes",COST+(double)(i*100)/(double)(3.0), user.getUserCost(),0.01); i++; } } finally { session.close(); } } d. 在 Java 中进行表的插入操作: public void testInsertNumTable() { int i = 1 ; SqlSession session = sqlSessionFactory.openSession(); try { MybatisDao userOperation = session.getMapper(MybatisDao.class); NumEntity user = new NumEntity(); 8 第 4 章 MYBATIS 程序示例 name[1] = " 张三"; name[2] = " 李四"; name[3] = " 王五"; name[4] = " 赵二"; name[5] = " 小北"; name[6] = " 小东"; name[7] = " 小西"; name[8] = " 小南"; name[9] = " 小明"; for (i=1;i<10;i++) { user.setId(i); user.setUserAge(AGE+i); user.setUserName(name[i]); user.setUserWage(WAGE+(double)(i*100)/(double)(3.0)); user.setUserCost(COST+(double)(i*100)/(double)(3.0)); userOperation.insertNumTable(user); session.commit(); System.out.println(user); } } finally { session.close(); } } e. 在 Java 中进行表的更新操作: public void testUpdateNumTable() { int i = 1 ; SqlSession session = sqlSessionFactory.openSession(); try { MybatisDao userOperation = session.getMapper(MybatisDao.class); NumEntity user = new NumEntity(); user = userOperation.selectNumTableByID(1); user.setUserAge(AGE+i); user.setUserName(name[0]); user.setUserWage(WAGE+(double)(i*100)/(double)(3.0)); user.setUserCost(COST+(double)(i*100)/(double)(3.0)); userOperation.updateNumTableById(user); session.commit(); } finally { session.close(); } } 9 第 4 章 MYBATIS 程序示例 f. 在 Java 中进行表的删除操作: public void testDeleteNumTable() { int i = 1 ; SqlSession session = sqlSessionFactory.openSession(); try { MybatisDao userOperation = session.getMapper(MybatisDao.class); userOperation.deleteNumTable(); session.commit(); } finally { session.close(); } } 到这里为止,在 Java 中对数据库的表操作就完成了,这里只是简单的示例,可能实际的应用场景的业务 逻辑比较复杂,SQL 的语句也比较复杂,但是 MyBatis 的使用精髓就是这些,可以在这些基础上去实现 丰富的应用。 4.2 存储过程的使用 如果开发过程中需使用数据库的存储过程,可在 mapper.xml 中增加如下内容: 创建表和数据: create or replace function getPerson(b out refcursor) as $$ begin open b for select * from person; end; $$ language plsql; 10 第 4 章 MYBATIS 程序示例 调用存储过程: Map map = mapper.getPerson2(null, null, null); ResultSet o = (ResultSet) map.get("getperson2"); o.next(); System.out.println(o.getString(1)); System.out.println(o.getString(2)); System.out.println(o.getString(3)); 11 第5章 MYBATIS 注意点 5 第 章 MyBatis 注意点 a. KingbaseES 支持 array 数据类型,在 MyBatis 中需要增加 ArrayTypeHandler 来处理这一特殊类型; b. KingbaseES 支持 json 数据类型,在 Mybatis 中需要增加 JsonTypeHandler 来处理这一特殊类型; c. KingbaseES 支持 hstore 数据类型,在 Mybatis 中需要增加 HstoreTypeHandler 来处理这一特殊类型; d. KingbaseES 支持 XML 数据类型,在 Mybatis 的映射中,需要对 xml 数据类型做标注,如: insert into t_xml(value) values ((#{content})::xml) e. KingbaseES 适配 Mybatis 的 pagehelper 插件时,由于无法通过连接自动获取数据库类型,需要将 helperDialect 设置成 postgresql,配置如下: 12 版权声明 版权声明 北京人大金仓信息技术股份有限公司(简称:人大金仓)版权所有,并保留对本手册及本声明的一切权利。 未得到人大金仓的书面许可,任何人不得以任何方式或形式对本手册内的任何部分进行复制、摘录、备份、修 改、传播、翻译成其他语言、将其全部或部分用于商业用途。 免责声明 本手册内容依据现有信息制作,由于产品版本升级或其他原因,其内容有可能变更。人大金仓保留在没有任何通 知或者提示的情况下对手册内容进行修改的权利。 本手册仅作为使用指导,人大金仓在编写本手册时已尽力保证其内容准确可靠,但并不确保手册内容完全没有错 误或遗漏,本手册中的所有信息也不构成任何明示或暗示的担保。 技术支持 • 人大金仓官方网站:http://www.kingbase.com.cn/ • 人大金仓文档中心:http://help.kingbase.com.cn/ • 全国服务热线:400-601-1188 • 人大金仓技术支持与反馈信箱:support@kingbase.com.cn 13 服务周期承诺 服务周期承诺 由于市场需求在不断变化,技术创新和发展的进程不断加剧,产品的版本更迭不可避免。人大金仓对于产品版本 生命周期的有效管理,有助于您提前规划项目,更好地从产品服务终止上过渡。 表 1: KingbaseES 产品生命周期里程碑 关键里程碑点 定义 产品发布日期 产品正式发布版本,即 GA(general availability)版本的发布日期。 停止销售日期 正式停止销售的日期,版本停止接受订单日。该日之后,产品将不再销售。 停止功能升级日期 在该日期之后,不再提供新特性和新硬件支持。但依旧提供错误修复、安全修复、功 能维护等服务。 停止功能维护日期 在该日期之后,不再维护功能,修复问题。但依旧提供安全修复等服务 停止安全维护日期 在该日期之后,不再发布补丁版本修复中高风险漏洞,仅提供有限的支持。 产品服务终止日期 停止提供产品服务和支持的日期。包括软件维护版本,缺陷修复,以及针对该产品的 所有服务支持(包括服务热线和远程/现场支持)。 服务周期策略 金仓数据库管理系统 KingbaseES 产品确保以下的服务周期: 1)产品自发布之日起至产品停止功能升级(包含新特性、新硬件支持)之日不少于 5 年。 2)产品停止功能升级之日起至产品停止功能维护(主要包括问题修复)之日不少于 4 年。 3)产品功能维护停止之日起至产品停止安全维护(包括中高风险漏洞修复)之日不少于 2 年。 服务终止策略 金仓数据库管理系统 KingbaseES 产品确保在销售后,至少提供 6 年的服务支持。 注意: 人大金仓将会综合各方因素来确定产品服务终止日期。并将在实际产品服务终止日期之前至少 90 天,通过公 14 服务周期承诺 开方式宣布产品服务终止日期。 15