跳到主要内容

MyBatis 连接 seekdb 示例程序

本文将介绍如何使用 MyBatis 框架和 seekdb 构建一个应用程序,实现创建表、插入数据和查询数据等基本操作。

点击下载 java-oceanbase-mybatis 示例工程

前提条件

  • 您已安装 seekdb。

  • 您已安装 JDK 1.8 和 Maven。

  • 您已安装 IntelliJ IDEA。

    信息

    本文档运行代码使用的工具是 IntelliJ IDEA 2021.3.2 (Community Edition) 版本,您也可以根据个人喜好选择适合自己的工具运行示例代码。

操作步骤

信息

本文中给出的操作步骤是基于 Windows 环境生成。如果您使用的是其他操作系统环境或编译器,那么操作步骤可能会略有不同。

  1. 获取 seekdb 连接串。
  2. 导入 java-oceanbase-mybatis 项目到 IDEA 中。
  3. 修改 java-oceanbase-mybatis 项目中的数据库连接信息。
  4. 运行 java-oceanbase-mybatis 项目。

步骤一:获取 seekdb 连接串

  1. 联系 seekdb 部署人员或者管理员获取相应的数据库连接串。

    mysql -hxx.xx.xx.xx -P2881 -uroot -p**** -A
  2. 根据已部署的 seekdb 填写下面 URL 的对应信息。

    信息

    jdbc.properties 文件中需要这里的 URL 信息。

    jdbc:oceanbase://host:port/schema_name?user=$user_name&password=$password

    参数说明:

    • host:提供 seekdb 的连接 IP。使用实际的 IP 替换,也可以使用本地 IP 及 127.0.0.1。
    • port:提供 seekdb 接端口。使用实际的端口替换,默认是 2881,在部署 seekdb 时可自定义。
    • schema_name:需要访问的 Schema 名称。
    • user_name:通过 -u 参数指定,格式为 用户。默认用户为 root
    • password:提供账户密码。

更多 URL 参数说明信息,请参见 数据库 URL

步骤二:导入 java-oceanbase-mybatis 项目到 IDEA 中

  1. 打开 IntelliJ IDEA,选择 File > Open... 选项。

    file

  2. 在弹出的 Open File or Project 窗口中,选择对应的项目文件,单击 OK 完成项目文件导入。

  3. IntelliJ IDEA 将会自动识别项目中的各类文件,并在 Project 工具窗口中,可以查看项目的目录结构、文件列表、模块列表、依赖关系等信息。Project 工具窗口通常位于 IntelliJ IDEA 界面的最左侧,默认情况下是打开的。如果 Project 工具窗口被关闭了,可以通过点击菜单栏中的 View > Tool Windows > Project 或者使用快捷键 Alt + 1 来重新打开它。

    信息

    当使用 IntelliJ IDEA 导入项目时,IntelliJ IDEA 会自动检测项目中的 pom.xml 文件,并根据文件中描述的依赖关系自动下载所需的依赖库,并将它们添加到项目中。

  4. 查看项目情况。

testmybatis

步骤三:修改 java-oceanbase-mybatis 项目中的数据库连接信息

根据 步骤一:获取 seekdb 连接串 中的信息修改 jdbc.properties 文件中的数据库连接信息。

示例如下:

  • 数据库驱动的名称为:com.oceanbase.jdbc.Driver
  • seekdb 的 IP 地址为 10.10.10.1
  • 访问端口使用的是 2881。
  • 需要访问的 Schema 名称为 test
  • 设置 URL 额外的连接属性为 useServerPrepStmts=true&rewriteBatchedStatements=true
  • 连接账户为 root
  • 密码为 ******

示例代码如下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:oceanbase://10.10.10.1:2881/sys?useServerPrepStmts=true&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=******

步骤四:运行 java-oceanbase-mybatis 项目

运行路径

  1. 在项目结构中找到 src > test > java 中找到 TestMybatis.java 文件。
  2. 在工具菜单栏中选择 运行(U) > 运行 > TestMybatis,或直接单击右上角绿色三角形运行。
  3. 通过 IDEA 的控制台来查看项目的日志信息和输出结果。

运行结果

  1. 运行 testUserMapper 方法输出结果如下:

    User{id=2, name='update'}
    User{id=3, name='insert'}
    User{id=4, name='insert'}
    User{id=5, name='insert'}
    User{id=6, name='insert'}
    User{id=7, name='insert'}
    User{id=8, name='insert'}
    User{id=9, name='insert'}
    User{id=10, name='insert'}
    usersByPage = [User{id=5, name='insert'}, User{id=6, name='insert'}, User{id=7, name='insert'}]
  2. 运行 testSqlSession 方法输出结果如下:

    User{id=2, name='update'}
    User{id=3, name='insert'}
    User{id=4, name='insert'}
    User{id=5, name='insert'}
    User{id=6, name='insert'}
    User{id=7, name='insert'}
    User{id=8, name='insert'}
    User{id=9, name='insert'}
    User{id=10, name='insert'}
  3. 运行 testAppMapper 方法输出结果如下:

    App{id=2, name='update'}
    App{id=3, name='insert3'}
    App{id=4, name='insert4'}
    App{id=5, name='insert5'}
    App{id=6, name='insert6'}
    App{id=7, name='insert7'}
    App{id=8, name='insert8'}
    App{id=9, name='insert9'}
    App{id=10, name='insert10'}
    pageList = Page{count=true, pageNum=2, pageSize=3, startRow=3, endRow=6, total=9, pages=3, reasonable=false, pageSizeZero=true}[App{id=5, name='insert5'}, App{id=6, name='insert6'}, App{id=7, name='insert7'}]
  4. 完整的输出结果如下:

    User{id=2, name='update'}
    User{id=3, name='insert'}
    User{id=4, name='insert'}
    User{id=5, name='insert'}
    User{id=6, name='insert'}
    User{id=7, name='insert'}
    User{id=8, name='insert'}
    User{id=9, name='insert'}
    User{id=10, name='insert'}
    usersByPage = [User{id=5, name='insert'}, User{id=6, name='insert'}, User{id=7, name='insert'}]
    App{id=2, name='update'}
    App{id=3, name='insert3'}
    App{id=4, name='insert4'}
    App{id=5, name='insert5'}
    App{id=6, name='insert6'}
    App{id=7, name='insert7'}
    App{id=8, name='insert8'}
    App{id=9, name='insert9'}
    App{id=10, name='insert10'}
    pageList = Page{count=true, pageNum=2, pageSize=3, startRow=3, endRow=6, total=9, pages=3, reasonable=false, pageSizeZero=true}[App{id=5, name='insert5'}, App{id=6, name='insert6'}, App{id=7, name='insert7'}]
    User{id=2, name='update'}
    User{id=3, name='insert'}
    User{id=4, name='insert'}
    User{id=5, name='insert'}
    User{id=6, name='insert'}
    User{id=7, name='insert'}
    User{id=8, name='insert'}
    User{id=9, name='insert'}
    User{id=10, name='insert'}

常见问题

1. 连接超时

如果遇到连接超时问题,可以在 JDBC URL 中配置连接超时参数:

jdbc:mysql://host:port/database?connectTimeout=30000&socketTimeout=60000

2. 字符集问题

为确保正确的字符编码,在 JDBC URL 中设置正确的字符集参数:

jdbc:mysql://host:port/database?characterEncoding=utf8&useUnicode=true

3. SSL 连接

要启用与 seekdb 的 SSL 连接,在 JDBC URL 中添加以下参数:

jdbc:mysql://host:port/database?useSSL=true&requireSSL=true

4. 账号密码中的特殊字符

如果用户名或密码包含特殊字符(如 #),需要进行 URL 编码:

String encodedPassword = URLEncoder.encode(password, "UTF-8");
提示

使用 MySQL Connector/J 8.x 时,确保账号密码不包含井号(#)。否则,可能会遇到连接错误。

项目代码介绍

点击 java-oceanbase-mybatis 下载项目代码,这是一个名为 java-oceanbase-mybatis 的压缩包。

解压后,得到一个名为 java-oceanbase-mybatis 的文件夹。目录结构如下所示:

│--pom.xml

├─.idea

├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─oceanbase
│ │ │ ├─mapper
│ │ │ │------IAppMapper.java
│ │ │ │------IUserMapper.java
│ │ │ │
│ │ │ └─pojo
│ │ │ │---App.java
│ │ │ └─--User.java
│ │ │
│ │ └─resources
│ │ │--jdbc.properties
│ │ │--mybatis-config.xml
│ │ │
│ │ └─com
│ │ └─oceanbase
│ │ └─mapper
│ │ └─---IUserMapper.xml
│ │
│ └─test
│ └─java
│ └─---TestMybatis.java

└─target

文件说明:

  • pom.xml:Maven 项目的配置文件,包含了项目的依赖、插件、构建等信息。
  • .idea:IDE(集成开发环境)中使用的目录,用于存储项目相关的配置信息。
  • src:通常用于表示项目中存放源代码的目录。
  • main: 存放主要的源代码和资源文件的目录。
  • java: 存放 Java 源代码的目录。
  • com: 存放 Java 包的根目录。
  • oceanbase: 存放项目的根目录。
  • mapper: 存放 MyBatis 的 Mapper 接口和 XML 文件。
  • IAppMapper.java:存放应用数据访问层接口。
  • IUserMapper.java:存放用户数据访问层接口。
  • pojo: 存放 JavaBean 或实体类。
  • App.java:存放应用实体类。
  • User.java:存放用户实体类。
  • resources: 存放资源文件的目录,如配置文件、SQL 文件等。
  • jdbc.properties: 存放数据库连接信息的配置文件。
  • mybatis-config.xml: 存放 MyBatis 的配置文件。
  • IUserMapper.xml:存放用户数据访问层的 XML 配置文件。
  • test: 存放测试代码和资源文件的目录。
  • TestMybatis.java: 存放测试 MyBatis 的 Java 类。
  • target: 存放编译后的 Class 文件、Jar 包等文件的目录。

pom.xml 代码介绍

提示

如果您只是想验证示例,那么请使用默认代码,无需修改。您也可以按照以下讲解,根据自己的需求修改 pom.xml 文件。

pom.xml 配置文件内容如下:

  1. 文件声明语句。

    声明本文件是一个 XML 文件,使用的 XML 版本是 1.0,字符编码方式是 UTF-8

    代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
  2. 配置 POM 的命名空间和 POM 模型版本。

    1. 通过 xmlns 指定 POM 的命名空间为 http://maven.apache.org/POM/4.0.0
    2. 通过 xmlns:xsi 指定 XML 命名空间为 http://www.w3.org/2001/XMLSchema-instance
    3. 通过 xsi:schemaLocation 指定 POM 的命名空间为 http://maven.apache.org/POM/4.0.0,并指定 POM 的 XSD 文件的位置为 http://maven.apache.org/xsd/maven-4.0.0.xsd
    4. 通过 <modelVersion> 元素指定该 POM 文件使用的 POM 模型版本为 4.0.0

    代码如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    </project>
  3. 基本信息配置。

    1. 通过 <groupId> 指定项目标识为 com.oceanbase.example
    2. 通过 <artifactId> 指定项目依赖为 java-oceanbase-mybatis
    3. 通过 <version> 项目的版本号为 1.0-SNAPSHOT

    代码如下:

    <groupId>com.oceanbase.example</groupId>
    <artifactId>java-oceanbase-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
  4. 通过 <build> 定义项目的构建过程。

    1. 通过 <plugins> 指定项目中配置的插件。
    2. 通过 <plugin> 指定项目中配置一个插件。
    3. 通过 <groupId> 指定项目标识为 org.apache.maven.plugins
    4. 通过 <artifactId> 指定项目依赖为 maven-compiler-plugin
    5. 通过 <configuration> 指定配置的插件的参数。
    6. 通过 <source> 指定编译器的源代码版本为 8。
    7. 通过 <target> 指定编译器的源代码版本为 8。

    代码如下:

     <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>8</source>
    <target>8</target>
    </configuration>
    </plugin>
    </plugins>
    </build>
  5. 通过 <dependencies> 定义项目所依赖组件。

    1. 指定依赖项所属的组织为 com.oceanbase,名称为 oceanbase-client,版本号为 2.4.2

      代码如下:

          <dependencies>
      <dependency>
      <groupId>com.oceanbase</groupId>
      <artifactId>oceanbase-client</artifactId>
      <version>2.4.2</version>
      </dependency>
      </dependencies>
    2. 指定依赖项所属测试架构为 junit,名称为 junit,版本号为 4.10

      代码如下:

          <dependencies>
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      </dependency>
      </dependencies>
    3. 指定依赖项所属架构为 org.mybatis,名称为 mybatis,版本号为 3.5.9

      代码如下:

          <dependencies>
      <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.9</version>
      </dependency>
      </dependencies>
    4. 指定依赖项所属插件为 com.github.pagehelper,名称为 pagehelper,版本号为 5.3.0

      代码如下:

          <dependencies>
      <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.0</version>
      </dependency>
      </dependencies>

jdbc.properties 代码介绍

jdbc.properties 是一个属性文件,用于存储与数据库连接相关的配置信息,包括数据库的 URL、用户名、密码等。代码包含的内容如下:

信息

代码中各字段的值从 步骤一:获取 seekdb 连接串 中直接获取。

  • jdbc.driver:数据库驱动程序的类名,用于加载数据库驱动程序。
  • jdbc.url:数据库的 URL 地址,用于指定连接的数据库。
  • jdbc.username:数据库的用户名,用于验证数据库连接。
  • jdbc.password:数据库的密码,用于验证数据库连接。

代码如下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://host:port/TEST?useServerPrepStmts=true&rewriteBatchedStatements=true
jdbc.username=user_name
jdbc.password=******

mybatis-config.xml 介绍

mybatis-config.xml 文件用于配置 MyBatis 框架的全局属性和插件等。

mybatis-config.xml 文件的代码主要包括以下几个部分:

  1. 文件声明。

    声明本文件是一个 XML 文件,这个声明表示当前文档是一个 MyBatis 配置文件,使用的 XML 版本是 1.0,字符编码方式是 UTF-8。版本号为 3.0,语言为英语,使用了 MyBatis 官方网站提供的 DTD(Document Type Definition)文件进行验证。

    声明包含了以下几个部分:

    • version:指定 XML 文件的版本。
    • encoding:指定 XML 文件的编码方式。
    • DOCTYPE:声明类型为文档类型声明。
    • configuration:指定文档类型为 MyBatis 配置文件。
    • PUBLIC:指定文档类型为公共文档类型。
    • mybatis.org:表示 MyBatis 官方网站。
    • DTD Config 3.0:表示 MyBatis 配置文件的版本号。
    • EN:表示文档类型的语言为英语。

    代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  2. 指定要加载的属性文件的路径和文件名。

    <properties resource="jdbc.properties"></properties>
  3. 配置 MyBatis 全局设置。

    MyBatis 全局设置的内容包含以下几个部分:

    • setting:用于配置单个设置项,例如缓存、日志等。
    • cacheEnabled:用于启用或禁用缓存功能,设置为 true
    • lazyLoadingEnabled:用于启用或禁用延迟加载功能,设置为 true
    • aggressiveLazyLoading:用于启用或禁用积极延迟加载功能,设置为 true
    • multipleResultSetsEnabled:用于配置是否启用多结果集的支持,设置为 true
    • useColumnLabel:用于配置否使用列标签作为结果集中的列名,设置为 true
    • useGeneratedKeys:用于配置是否使用自动生成的主键,设置为 true
    • autoMappingBehavior:,用于配置对自动映射的处理行为设置为 PARTIAL
    • defaultExecutorType:用于配置默认的执行器类型,设置为 SIMPLE
    • mapUnderscoreToCamelCase:用于配置是否将数据库列名中的下划线转换为 Java 对象属性名中的驼峰命名法,设置为 true
    • localCacheScope:用于配置本地缓存的作用域,设置为 SESSION
    • jdbcTypeForNull:用于配置在处理空值时使用的 JDBC 类型,设置为 NULL
    信息

    settings 元素中的子元素是可选的,可以根据实际情况进行添加或删除。

    代码如下:

    <settings>
    <!-- Enable or disable caching for global mappers. -->
    <setting name="cacheEnabled" value="true"/>
    <!-- Enable or disable lazy loading globally. When disabled, all associated objects are loaded immediately. -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- When enabled, objects with delayed loading properties will fully load any properties when called. Otherwise, each attribute will be loaded as needed. -->
    <setting name="aggressiveLazyLoading" value="true"/>
    <!-- Allow a single SQL statement to return multiple datasets (depending on driver compatibility) default: true -->
    <setting name="multipleResultSetsEnabled" value="true"/>
    <!-- Can column aliases be used (depending on driver compatibility) default: true -->
    <setting name="useColumnLabel" value="true"/>
    <!-- Allow JDBC to generate primary keys. Drive support is required. If set to true, this setting will force the use of the generated primary key, and some drives may not be compatible but can still be executed. default:false -->
    <setting name="useGeneratedKeys" value="true"/>
    <!-- Specify how MyBatis automatically maps the columns of the data base table NONE: Not Implicit PART: Partial FULL: All -->
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <!-- This is the default execution type (SIMPLE: simple; REUSE: executor may repeatedly use prepared statements; BATCH: executor can repeatedly execute statements and batch updates) -->
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <!-- Convert fields using camel naming. -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- Set the local cache range session: there will be data sharing statement: statement range (so there will be no data sharing) defalut: session -->
    <setting name="localCacheScope" value="SESSION"/>
    <!-- When the JDBC type is set to null, some drivers need to specify a value, default: Other, and there is no need to specify a type when inserting null values -->
    <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
  4. 配置 MyBatis 的插件。

    MyBatis 的插件内容包含以下几部分:

    • plugin:用于配置单个插件。
    • property:用于指定插件的属性。
    • interceptor:用于指定插件的实现类。
    • helperDialect:用于指定所选的数据库。
    • offsetAsPageNum:表示是否将 offset 参数作为 pageNum 参数使用。
    • rowBoundsWithCount:表示是否进行 count 查询。
    • pageSizeZero:表示是否支持 pageSize 为 0 的查询。
    • reasonable:表示是否启用合理化查询。
    • params:表示用于传递分页参数的参数名和参数值的映射关系。
    • supportMethodsArguments:表示是否支持使用方法参数来传递分页参数。
    • returnPageInfo:表示返回值类型。

    代码如下:

    <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <!-- this parameter indicates which database to connect to -->
    <!--MySQLMode dialect<property name="helperDialect" value="mysql"/>-->
    <!--OracleMode dialect -->
    <property name="helperDialect" value="mysql"/>
    <!-- This parameter defaults to false. When set to true, the first parameter offset of RowBounds will be used as the pageNum page number, similar to the pageNum effect in startPage -->
    <property name="offsetAsPageNum" value="true"/>
    <!-- This parameter defaults to false, and when set to true, using RowBounds pagination will result in a count query -->
    <property name="rowBoundsWithCount" value="true"/>
    <!-- When set to true, if pageSize=0 or RowBounds. limit=0, all results will be queried (equivalent to not executing a pagination query, but the returned results are still of type Page) -->
    <property name="pageSizeZero" value="true"/>
    <!-- Version 3.3.0 is available - pagination parameter rationalization is disabled by default as false. When rationalization is enabled, if pageNum<1, the first page will be queried, and if pageNum>pages, the last page will be queried. Rationalization of paging parameters. When rationalization is disabled, if pageNum<1 or pageNum>pages returns empty data -->
    <property name="reasonable" value="false"/>
    <!-- Version 3.5.0 is available - In order to support the startPage (Object params) method, a 'params' parameter has been added to configure parameter mapping, which can be used to retrieve values from Map or ServletRequest. PageNum, pageSize, count, pageSizeZero, reasonable, orderBy can be configured. If mapping is not configured, the default value will be used. If you do not understand the meaning, do not copy this configuration casually -->
    <property name="params" value="pageNum=start;pageSize=limit;"/>
    <!-- Support passing paging parameters through Mapper interface parameters -->
    <property name="supportMethodsArguments" value="true"/>
    <!-- Always always returns PageInfo type, check to check if the return type is PageInfo, and none returns Page -->
    <property name="returnPageInfo" value="check"/>
    </plugin>
  5. 配置 MyBatis 的环境。 MyBatis 的环境内容包含以下几个部分:

    • environment:用于配置单个环境。
    • transactionManager:用于指定事务管理器的实现类。
    • dataSource:用于指定数据源的实现类。
    • property:指定数据库驱动程序的类名。
    信息

    在 MyBatis 的其他配置元素中,可以使用 ${} 占位符来引用环境中配置的数据源、事务管理器和执行器等。

    代码如下:

    <environments default="development">
    <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </dataSource>
    </environment>
    </environments>
  6. 配置 MyBatis 的映射器。

    MyBatis 的映射器常用元素如下:

    • resource:用于指定映射器的 XML 配置文件路径和文件名。
    • class:用于指定映射器的 Java 类名。
    信息

    如果使用 XML 配置文件,需要在 mapper 元素中指定 XML 文件的路径和文件名;如果使用 Java 接口,需要在 mapper 元素中指定 Java 类的全限定名。

    代码如下:

    <mappers>
    <!-- IUserMapper.xml mapping file -->
    <mapper resource="com/alipay/oceanbase/mapper/IUserMapper.xml"></mapper>
    <!-- IAppMapper mapping class -->
    <mapper class="com.oceanbase.mapper.IAppMapper"></mapper>
    </mappers>

IUserMapper.xml 代码介绍

IUserMapper.xml 文件是个映射文件,用于定义与用户对象相关的 SQL 语句。该文件中定义了一个名为 IUserMapper 的命名空间,用于存放与用户对象相关的 SQL 语句。

信息

如果您只是想验证示例,那么请使用默认代码,无需修改。若需要修改,请根据实际情修改。

IUserMapper.xml 文件的代码主要包括以下几个部分:

  1. 文件声明语句。 XML 文件的声明部分,用于指定 XML 文件的版本和编码方式。DTD 文件的声明部分,用于引入 MyBatis 的 DTD 文件。 代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  2. 配置与 IUserMapper.java 的映射关系。

    1. 定义 Mapper 接口的命名空间,用于与 Java 代码中的 Mapper 接口进行对应。
    2. 创建名为 insertUser 的 SQL 语句,向 test_user 表中插入一条记录,包括 idname 两个字段,值分别为 #{id}#{name}parameterType 属性指定了传入的参数类型为 com.oceanbase.pojo.User
    3. 创建名为 deleteUser 的 SQL 语句,从 test_user 表中删除一条记录,根据 id 字段的值匹配相应的记录,值为 #{id}
    4. 创建名为 updateUser 的 SQL 语句,用于更新 test_user 表中的一条记录,将 name 字段的值更新为 #{name},根据 id 字段的值匹配相应的记录,值为 #{id}
    5. 创建名为 selectUsers 的 SQL 语句,用于查询 test_user 表中的所有用户记录。
    6. 创建名为 selectUserByPage 的 SQL 语句,从 test_user 表中查询指定页数的用户对象。使用子查询和 rownum 字段进行分页查询,其中 #{pageNum}#{pageSize} 表示当前页码和每页的记录数。

    代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.oceanbase.mapper.IUserMapper">
    <insert id="insertUser" parameterType="com.oceanbase.pojo.User">
    INSERT INTO test_user (id,name) VALUES (#{id},#{name})
    </insert>
    <delete id="deleteUser" parameterType="long">
    DELETE FROM test_user WHERE id = #{id}
    </delete>
    <update id="updateUser" parameterType="com.oceanbase.pojo.User">
    UPDATE test_user SET name = #{name} WHERE id = #{id}
    </update>
    <select id="selectUsers" resultType="com.oceanbase.pojo.User">
    SELECT id,name FROM test_user
    </select>
    <!-- There are two ways to paginate queries: 1. Use the pagehelper plugin; 2. Use SQL statements to paginate -->
    <!-- SQL statement pagination: Oracle mode does not support the limit keyword, and instead uses the unique field 'rownum'-->
    <select id="selectUserByPage" resultType="com.oceanbase.pojo.User">
    select id,name from ( select row_.*, rownum rownum_ from ( select * from test_user ) row_ where rownum
    <![CDATA[ <= ]]> #{pageNum} * #{pageSize} ) where rownum_ <![CDATA[ >]]> ( #{pageNum}- 1) * #{pageSize}
    </select>
    </mapper>

IAppMapper.java 代码介绍

IAppMapper.java 文件用于定义 SQL 映射关系。

IAppMapper.java 文件的代码主要包括以下几个部分:

  1. 定义 Mapper 包。

    声明当前文件所属的包名为 com.oceanbase.mapperMapper 包中的以下接口和类:

    • App 接口:表示与数据库表进行映射,实现数据的读写操作。
    • org.apache.ibatis.annotations.*:用于导入 MyBatis 的注解类。
    • java.util.List:用于导入 java.util 包中的 List 类。 代码如下:
    package com.oceanbase.mapper;
    import com.oceanbase.pojo.App;
    import org.apache.ibatis.annotations.*;
    import java.util.List;
  2. 定义 IAppMapper 接口。 IAppMapper 接口用于定义 MyBatis 的 Mapper 接口。Mapper 接口用于定义 SQL 映射关系,实现对数据库的增删改查操作。具体来说,IAppMapper 接口定义了对 test_app 表进行增删改查的方法,包括:

    • @Insert 方法:用于向数据库中插入数据。
    • @Update 方法:用于更新数据库中的数据。
    • @Delete 方法:用于删除数据库中的数据。
    • @Select 方法:用于查询数据库中的数据。
    • @Results 方法:表示查询结果的映射关系,用于将查询结果中的字段映射到 Java 对象的属性上。 对数据库的增删改查操作如下:
    1. 插入数据 将 App 对象映射到 test_app 表中的一条记录,App 对象中的属性值使用 #{属性名} 的方式进行占位符表示。Integer 类型的返回值表示 SQL 语句插入数据后返回的自动生成的 ID,即 test_app 表中的 ID 字段对应的值。

      @Insert("insert into test_app(id,name) values(#{id},#{name})")
      Integer insertApp(App app);
    2. 删除数据 从 test_app 表中删除 id 等于 #{id} 的数据。

      @Delete("delete from test_app  where id =#{id}")
      Integer deleteApp(Long id);
    3. 更新数据 对 test_app 表中的记录进行修改需要进行 Update 操作。

      @Update("update test_app set name= #{name} where id = #{id}")
      Integer updateApp(App user);
    4. 查询数据并映射数据 查询 test_app 表中的所有数据。同时,使用 @Results 注解和 @Result 注解将查询结果映射到 App 对象中的 idname 属性中。最终返回一个 App 对象的列表。

      @Update("update test_app set name= #{name} where id = #{id}")
      Integer updateApp(App user);
      @Results({
      @Result(id = true, column = "id", property = "id"),
      @Result(column = "name", property = "name")
      })
      List<App> selectApps();

    代码如下:

    package com.oceanbase.mapper;
    import com.oceanbase.pojo.App;
    import org.apache.ibatis.annotations.*;
    import java.util.List;
    public interface IAppMapper {
    @Insert("insert into test_app(id,name) values(#{id},#{name})")
    Integer insertApp(App app);

    @Delete("delete from test_app where id =#{id}")
    Integer deleteApp(Long id);

    @Update("update test_app set name= #{name} where id = #{id}")
    Integer updateApp(App user);

    @Select("select * from test_app")
    @Results({
    @Result(id = true, column = "id", property = "id"),
    @Result(column = "name", property = "name")
    })
    List<App> selectApps();
    }

IUserMapper.java 代码介绍

IUserMapper.java 文件用于定义数据库操作的方法。

IUserMapper.java 文件的代码主要包括以下几个部分:

  1. 引用其他类和接口。

    声明当前文件包含的接口和类:

    • User 类:表示用户对象。
    • org.apache.ibatis.annotations.Param 类:MyBatis 框架中的参数注解。
    • List 接口:表示列表类型。 代码如下:
    package com.oceanbase.mapper;
    import com.oceanbase.pojo.User;
    import org.apache.ibatis.annotations.Param;
    import java.util.List;
  2. 定义 IUserMapper 接口。

    定义了一个名为 IUserMapper 的接口,其中定义了插入、删除、更新和查询用户数据的方法,以及分页查询用户数据的方法。同时使用了 JavaDoc 注释和 @Param 注解来提高代码的可读性和可维护性。 代码如下:

     public interface IUserMapper {

    Integer insertUser(User user);

    Integer deleteUser(Long id);

    Integer updateUser(User user);

    List<User> selectUsers();

    public List<User> selectUserByPage(@Param("user") User user, @Param("pageNum") Integer pageNum,
    @Param("pageSize") Integer pageSize);
    }

App.java 代码介绍

App.java 文件用于表示 App 应用程序对象。其中包括了 idname 两个属性。类中还定义了属性的访问方法和构造方法,以及将对象转化为字符串的 toString 方法。

App.java 文件的代码主要包括以下几个部分:

  1. 定义 pojo 包。 声明当前文件所属的包名为 com.oceanbase.pojo
  2. 定义 App 类。
    1. 定义了一个类 App,其中包含了两个私有属性 idname,以及一个无参构造方法 public App(){}
    2. 定义一个带参数的构造方法 public App(Long id, String name),用于创建一个具有指定 idname 的应用程序对象。
    3. 定义 getId 方法、setId 方法、getName 方法和 setName 方法,用于获取和设置应用程序名称,通过 setName 方法返回设置应用程序的名称。
    4. 通过重写 toString 方法,将应用程序对象转换为字符串表示,便于输出和调试。

代码如下:

   package com.oceanbase.pojo;

public class App {
private Long id;
private String name;

public App() {
}

public App(Long id, String name) {
this.id = id;
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "App{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

User.java 代码介绍

User.java 文件用于表示用户对象。其中包括了 idname 两个属性。类中还定义了属性的访问方法和构造方法,以及将对象转化为字符串的 toString 方法。 该类的创建同上面 App.java 代码的创建类似。

代码如下:

package com.oceanbase.pojo;

public class User {
private Long id;
private String name;

public User() {
}

public User(Long id, String name) {
this.id = id;
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

TestMyBatis.java 文件介绍

TestMyBatis.java 用于展示如何使用 MyBatis 进行数据操作。测试 MyBatis 框架的基本功能和 SQL 语句的执行情况,以及 Mapper 接口的调用方式和 SQL 语句的参数和返回值等。

  1. 引用其他类和接口。

    用于导入需要使用的类和接口如下:

    • IAppMapper 接口:用于定义与 App 对象相关的 SQL 语句。
    • IUserMapper 接口:用于定义与 User 对象相关的 SQL 语句。
    • App 类:App 对象,用于测试 SQL 语句的执行情况。
    • User 类:User 对象,用于测试 SQL 语句的执行情况。
    • PageHelper 插件:用于实现分页查询功能。
    • PageInfo 插件:用于封装分页查询结果。
    • Resources 类:用于加载 MyBatis 配置文件。
    • SqlSession 类:用于执行 SQL 语句和管理事务。
    • SqlSessionFactory 类:用于创建 SqlSession 对象。
    • SqlSessionFactoryBuilder 类:用于创建 SqlSessionFactory 对象。
    • org.junit.Test:JUnit 测试框架的注解,用于标记测试方法。
    • IOException 类:用于表示输入输出操作中的错误。
    • SQLException 类:用于表示 SQL 操作中的错误。
    • Statement 接口:用于执行 SQL 语句并返回结果。
    • java.util.List 接口:用于表示一个有序的集合,其中的元素可以重复。

    代码如下:

    import com.oceanbase.mapper.IAppMapper;
    import com.oceanbase.mapper.IUserMapper;
    import com.oceanbase.pojo.App;
    import com.oceanbase.pojo.User;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    import java.io.IOException;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.List;
  2. 定义 testUserMapper 方法。

    testUserMapper 方法用于测试 User 对象的 Mapper 接口中定义的 SQL 语句的执行情况。

    1. 使用 SqlSessionFactoryBuilder 类的 build() 方法,创建一个 SqlSessionFactory 实例。用来管理 SqlSession 实例的创建和销毁。
    2. 使用 SqlSessionFactoryopenSession() 方法,创建一个 SqlSession 实例。可以执行各种 SQL 语句,包括查询、插入、更新和删除等操作。
    3. 使用 SqlSession 实例的 getConnection() 方法,获取一个 Connection 实例。可以执行各种数据库操作。
    4. 使用 Connection 实例的 createStatement() 方法,创建一个 Statement 实例。依次执行 SQL 语句。
    5. 使用 Statement 对象的 execute() 方法,执行删除名为 test_user 表的 SQL 语句。
    6. 使用 Statement 对象的 execute() 方法,创建名为 test_user 表。该表包含两个字段,一个是 id,类型为 number(20),作为主键;另一个是 name,类型为 varchar2(100)
    7. 使用 SqlSession 实例的 getMapper() 方法,获取 IUserMapper 接口的实例。定义各种数据库操作方法。
    8. 使用 for 循环插入 10 条数据到 test_user 表,在每次循环中,创建一个新的 User 对象,使用 Mapper 接口的 insertUser() 方法,执行插入操作。将执行插入操作结果会存储在 insertResult 变量中。
    9. test_user 表中的数据进行删除、更新、查询,最后使用 forEach() 方法打印出该用户列表中的每个用户的信息。
    10. 创建名为 insert 的用户,使用 selectUserByPage() 方法查询 test_user 表中所有名称为 "insert" 的用户数据,并返回指定页面的用户列表。查询的是第 2 页,每页显示 3 条数据。并将这些用户数据打印到控制台上。同时关闭 StatementSqlSession 实例,并提交事务,释放资源。

    代码如下:

        public void testUserMapper() throws SQLException, IOException {
    //mybatis xml usecases
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Statement statement = sqlSession.getConnection().createStatement();
    try {
    statement.execute("drop table test_user");
    } catch (SQLException ex) {
    } finally {
    statement.execute("create table test_user(id number(20) primary key,name varchar2(100))");
    }
    IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
    //insert 10 users
    for (int i = 1; i <= 10; i++) {
    User user = new User((long) i, "insert");
    Integer insertResult = mapper.insertUser(user);
    }
    //delete id==1
    Integer deleteResult = mapper.deleteUser(1L);
    //update id==2L name=update
    User updateUser = new User(2L, "update");
    Integer updateResult = mapper.updateUser(updateUser);
    //selectUsers query all
    List<User> userList = mapper.selectUsers();
    userList.forEach(System.out::println);
    //selectUsersByPage:use the rownum keyword in SQL statements to manually perform pagination queries,
    // example: data on page 2 (3 items per page)
    User user = new User();
    user.setName("insert");
    List<User> usersByPage = mapper.selectUserByPage(user, 2, 3);
    System.out.println("usersByPage = " + usersByPage);
    statement.close();
    sqlSession.commit();
    sqlSession.close();
    }
  3. 定义 testSqlSession 方法。

    testSqlSession 方法用于测试 SqlSession 对象的基本功能,包括执行 SQL 语句、提交事务和关闭 SqlSession 对象等。

    1. 使用 SqlSessionFactoryBuilder 类的 build() 方法,创建一个 SqlSessionFactory 实例。用来管理 SqlSession 实例的创建和销毁。
    2. 使用 SqlSessionFactoryopenSession() 方法,创建一个 SqlSession 实例。可以执行各种 SQL 语句,包括查询、插入、更新和删除等操作。
    3. 使用 SqlSession 实例的 getConnection() 方法,获取一个 Connection 实例。可以执行各种数据库操作。
    4. 使用 Connection 实例的 createStatement() 方法,创建一个 Statement 实例。依次执行 SQL 语句。
    5. 使用 Statement 对象的 execute() 方法,执行删除名为 test_user 表的 SQL 语句。
    6. 使用 Statement 对象的 execute() 方法,创建名为 test_user 表。该表包含两个字段,一个是 id,类型为 number(20),作为主键;另一个是 name,类型为 varchar2(100)
    7. 使用 for 循环插入 10 条数据到 test_user 表,在每次循环中,创建一个新的 User 对象,使用 Mapper 接口的 insertUser() 方法,执行插入操作。将执行插入操作结果会存储在 insertResult 变量中。
    8. 使用 sqlSessiondelete() 方法,执行删除操作。通过传入的参数 1L 来设置删除条件。将删除操作的结果存储在 deleteResult 变量中。
    9. 使用 sqlSession 对象执行了数据库更新操作。创建一个 User 对象,调用 update 方法传入 SQL 语句的标识符和参数对象,完成更新操作。具体的 SQL 语句和参数映射关系可以在 "com.oceanbase.mapper.IUserMapper" 接口中的 XML 配置文件中找到。更新操作的结果存储在 updateResult 变量中。
    10. 使用 SqlSessionFactoryopenSession() 方法创建了一个 SqlSession 实例,通过该实例执行了查询操作,并将查询结果存储在 userList 变量中。最后,使用 forEach 方法遍历 userList 并输出到控制台。
    11. 通过 statement.close() 关闭数据库连接中的 Statement 对象。然后,通过 sqlSession.commit() 提交事务,将所有的修改持久化到数据库中。最后,通过 sqlSession.close() 关闭 SqlSession 对象,释放相关的资源并关闭与数据库的连接。

    代码如下:

        public void testSqlSession() throws SQLException, IOException {
    //SqlSession usecases
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Statement statement = sqlSession.getConnection().createStatement();
    try {
    statement.execute("drop table test_user");
    } catch (SQLException ex) {
    } finally {
    statement.execute("create table test_user(id number(20) primary key,name varchar2(100))");
    }
    //insert
    for (int i = 1; i <= 10; i++) {
    User user = new User((long) i, "insert");
    //Integer insertResult = mapper.insertUser(user);
    int insertResult = sqlSession.insert("com.oceanbase.mapper.IUserMapper.insertUser", user);
    }
    //delete
    int deleteResult = sqlSession.delete("com.oceanbase.mapper.IUserMapper.deleteUser", 1L);
    //update
    User updateUser = new User(2L, "update");
    int updateResult = sqlSession.update("com.oceanbase.mapper.IUserMapper.updateUser", updateUser);
    //selectUsers
    List<User> userList = sqlSession.selectList("com.oceanbase.mapper.IUserMapper.selectUsers", null);
    userList.forEach(System.out::println);
    //System.out.println("userList = " + userList);
    statement.close();
    sqlSession.commit();
    sqlSession.close();
    }
  4. 定义 testAppMapper 方法。

    testAppMapper 方法用于测试 AppMapper 的功能。

    1. 使用 SqlSessionFactoryBuilder 类的 build() 方法,创建一个 SqlSessionFactory 实例。用来管理 SqlSession 实例的创建和销毁。
    2. 使用 SqlSessionFactoryopenSession() 方法,创建一个 SqlSession 实例。可以执行各种 SQL 语句,包括查询、插入、更新和删除等操作。
    3. 使用 SqlSession 实例的 getConnection() 方法,获取一个 Connection 实例。可以执行各种数据库操作。
    4. 使用 Connection 实例的 createStatement() 方法,创建一个 Statement 实例。依次执行 SQL 语句。
    5. 使用 Statement 对象的 execute() 方法,执行删除名为 test_app 表的 SQL 语句。
    6. 使用 Statement 对象的 execute() 方法,创建名为 test_app 表。该表包含两个字段,一个是 id,类型为 number(20),作为主键;另一个是 name,类型为 varchar2(100)
    7. 使用 SqlSession 实例的 getMapper() 方法,获取 IAppMapper 接口的实例。定义各种数据库操作方法。
    8. 使用 for 循环插入 10 条数据到 test_app 表,在每次循环中,创建一个新的 App 对象,使用 Mapper 接口的 insertApp() 方法,执行插入操作。将执行插入操作结果会存储在 insertResult 变量中。
    9. 使用 mapperdelete() 方法,执行删除操作。通过传入的参数 1L 来设置删除条件。将删除操作的结果存储在 deleteResult 变量中。
    10. 使用 mapper 对象执行了数据库更新操作。创建一个 App 对象,调用 update 方法传入 SQL 语句的标识符和参数对象,完成更新操作。
    11. 创建一个 App 对象 updateApp,包含 id2Lname 为 "update"。
    12. 调用 mapperupdateApp 方法,并传入 updateApp 对象,执行更新操作。
    13. 调用 sqlSessioncommit 方法,提交数据库事务。
    14. 调用 mapperselectApps 方法,查询所有 App 对象。使用 forEach 方法遍历 userList 并输出到控制台。
    15. 调用 PageHelperstartPage 方法,并传入页码和每页数据条数,设置分页参数。查询所有 App 对象,并返回一个包含所有 App 对象的 List 对象。
    16. 调用 PageInfogetList 方法,获取分页后的 App 对象列表,使用 System.out.println 方法将分页后的 App 对象列表打印输出。
    17. 通过 sqlSession.close() 关闭 SqlSession 对象,释放相关的资源。

    代码如下:

        public void testAppMapper() throws SQLException, IOException {
    //mybatis annotation usecases
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Statement statement = sqlSession.getConnection().createStatement();
    try {
    statement.execute("drop table test_app");
    } catch (SQLException ex) {
    } finally {
    statement.execute("create table test_app(id number(20) primary key,name varchar2(100))");
    }

    IAppMapper mapper = sqlSession.getMapper(IAppMapper.class);

    //insert
    for (int i = 1; i <= 10; i++) {
    App app = new App((long) i, "insert" + i);
    Integer insertResult = mapper.insertApp(app);
    }

    //delete
    Integer deleteResult = mapper.deleteApp(1L);
    //update
    App updateApp = new App(2L, "update");
    Integer updateResult = mapper.updateApp(updateApp);
    //commit
    sqlSession.commit();

    //selectApps
    List<App> appList = mapper.selectApps();
    appList.forEach(System.out::println);

    //selectbyPage
    //set page parameters
    PageHelper.startPage(2, 3);
    //selectApps
    List<App> appList1 = mapper.selectApps();
    //get pageList
    PageInfo pageInfo = new PageInfo(appList1);
    List<App> pageList = pageInfo.getList();
    System.out.println("pageList = " + pageList);

    sqlSession.close();
    }

完整的代码展示

pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.oceanbase.example</groupId>
<artifactId>java-oceanbase-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- pagehelper plug-in -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
</dependencies>
</project>

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:oceanbase://host:port/TEST?useServerPrepStmts=true&rewriteBatchedStatements=true
jdbc.username=user_name
jdbc.password=******

mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">

<property name="helperDialect" value="oracle"/>

<property name="offsetAsPageNum" value="true"/>
<property name="rowBoundsWithCount" value="true"/>
<property name="pageSizeZero" value="true"/>

<property name="reasonable" value="false"/>

<property name="params" value="pageNum=start;pageSize=limit;"/>
<property name="supportMethodsArguments" value="true"/>
<property name="returnPageInfo" value="check"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/alipay/oceanbase/mapper/IUserMapper.xml"></mapper>
<mapper class="com.oceanbase.mapper.IAppMapper"></mapper>
</mappers>
</configuration>

IUserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.oceanbase.mapper.IUserMapper">
<insert id="insertUser" parameterType="com.oceanbase.pojo.User">
INSERT INTO test_user (id,name) VALUES (#{id},#{name})
</insert>
<delete id="deleteUser" parameterType="long">
DELETE FROM test_user WHERE id = #{id}
</delete>
<update id="updateUser" parameterType="com.oceanbase.pojo.User">
UPDATE test_user SET name = #{name} WHERE id = #{id}
</update>
<select id="selectUsers" resultType="com.oceanbase.pojo.User">
SELECT id,name FROM test_user
</select>
<!-- There are two ways to paginate queries: 1. Use the pagehelper plugin; 2. Use SQL statements to paginate -->
<!-- SQL statement pagination: Oracle mode does not support the limit keyword, and instead uses the unique field 'rownum'-->
<select id="selectUserByPage" resultType="com.oceanbase.pojo.User">
select id,name from ( select row_.*, rownum rownum_ from ( select * from test_user ) row_ where rownum
<![CDATA[ <= ]]> #{pageNum} * #{pageSize} ) where rownum_ <![CDATA[ >]]> ( #{pageNum}- 1) * #{pageSize}
</select>
</mapper>

IAppMapper.java

package com.oceanbase.mapper;

import com.oceanbase.pojo.App;
import org.apache.ibatis.annotations.*;

import java.util.List;

//using annotations
public interface IAppMapper {
@Insert("insert into test_app(id,name) values(#{id},#{name})")
Integer insertApp(App app);

@Delete("delete from test_app where id =#{id}")
Integer deleteApp(Long id);

@Update("update test_app set name= #{name} where id = #{id}")
Integer updateApp(App user);

@Select("select * from test_app")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "name", property = "name")
})
List<App> selectApps();
}

IUserMapper.java

package com.oceanbase.mapper;

import com.oceanbase.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

//using XML
public interface IUserMapper {

Integer insertUser(User user);


Integer deleteUser(Long id);

Integer updateUser(User user);


List<User> selectUsers();


public List<User> selectUserByPage(@Param("user") User user, @Param("pageNum") Integer pageNum,
@Param("pageSize") Integer pageSize);
}

App.java

package com.oceanbase.pojo;

public class App {
private Long id;
private String name;

public App() {
}

public App(Long id, String name) {
this.id = id;
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "App{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

User.java

package com.oceanbase.pojo;

public class User {
private Long id;
private String name;

public User() {
}

public User(Long id, String name) {
this.id = id;
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

TestMybatis.java

import com.oceanbase.mapper.IAppMapper;
import com.oceanbase.mapper.IUserMapper;
import com.oceanbase.pojo.App;
import com.oceanbase.pojo.User;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;


public class TestMybatis {
@Test
public void testUserMapper() throws SQLException, IOException {
//mybatis xml usecases
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Statement statement = sqlSession.getConnection().createStatement();
try {
statement.execute("drop table test_user");
} catch (SQLException ex) {
} finally {
statement.execute("create table test_user(id number(20) primary key,name varchar2(100))");
}
IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
//insert 10 users
for (int i = 1; i <= 10; i++) {
User user = new User((long) i, "insert");
Integer insertResult = mapper.insertUser(user);
}
//delete id==1
Integer deleteResult = mapper.deleteUser(1L);
//update id==2L name=update
User updateUser = new User(2L, "update");
Integer updateResult = mapper.updateUser(updateUser);
//selectUsers query all
List<User> userList = mapper.selectUsers();
userList.forEach(System.out::println);
//selectUsersByPage:use the rownum keyword in SQL statements to manually perform pagination queries,
// example: data on page 2 (3 items per page)
User user = new User();
user.setName("insert");
List<User> usersByPage = mapper.selectUserByPage(user, 2, 3);
System.out.println("usersByPage = " + usersByPage);
statement.close();
sqlSession.commit();
sqlSession.close();
}

@Test
public void testSqlSession() throws SQLException, IOException {
//SqlSession usecases
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Statement statement = sqlSession.getConnection().createStatement();
try {
statement.execute("drop table test_user");
} catch (SQLException ex) {
} finally {
statement.execute("create table test_user(id number(20) primary key,name varchar2(100))");
}
//insert
for (int i = 1; i <= 10; i++) {
User user = new User((long) i, "insert");
//Integer insertResult = mapper.insertUser(user);
int insertResult = sqlSession.insert("com.oceanbase.mapper.IUserMapper.insertUser", user);
}
//delete
int deleteResult = sqlSession.delete("com.oceanbase.mapper.IUserMapper.deleteUser", 1L);
//update
User updateUser = new User(2L, "update");
int updateResult = sqlSession.update("com.oceanbase.mapper.IUserMapper.updateUser", updateUser);
//selectUsers
List<User> userList = sqlSession.selectList("com.oceanbase.mapper.IUserMapper.selectUsers", null);
userList.forEach(System.out::println);
//System.out.println("userList = " + userList);
statement.close();
sqlSession.commit();
sqlSession.close();
}

@Test
public void testAppMapper() throws SQLException, IOException {
//mybatis annotation usecases
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Statement statement = sqlSession.getConnection().createStatement();
try {
statement.execute("drop table test_app");
} catch (SQLException ex) {
} finally {
statement.execute("create table test_app(id number(20) primary key,name varchar2(100))");
}

IAppMapper mapper = sqlSession.getMapper(IAppMapper.class);

//insert
for (int i = 1; i <= 10; i++) {
App app = new App((long) i, "insert" + i);
Integer insertResult = mapper.insertApp(app);
}

//delete
Integer deleteResult = mapper.deleteApp(1L);
//update
App updateApp = new App(2L, "update");
Integer updateResult = mapper.updateApp(updateApp);
//commit
sqlSession.commit();

//selectApps
List<App> appList = mapper.selectApps();
appList.forEach(System.out::println);

//selectbyPage
//set page parameters
PageHelper.startPage(2, 3);
//selectApps
List<App> appList1 = mapper.selectApps();
//get pageList
PageInfo pageInfo = new PageInfo(appList1);
List<App> pageList = pageInfo.getList();
System.out.println("pageList = " + pageList);

sqlSession.close();
}
}

相关文档

更多 OceanBase Connector/J 的信息,请参见 OceanBase JDBC 驱动程序