最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis輕松接入金倉數(shù)據(jù)庫的完整步驟教學(xué)

 更新時間:2026年04月27日 08:22:57   作者:碼農(nóng)阿豪@新空間  
這篇文章主要為大家介紹了使用MyBatis實現(xiàn)國產(chǎn)化數(shù)據(jù)庫Kingbase替換的實戰(zhàn)經(jīng)驗,從準(zhǔn)備工作到項目搭建再到代碼實現(xiàn)和測試驗證,感興趣的小伙伴可以了解下

接手國產(chǎn)化改造任務(wù)

去年做一個政務(wù)系統(tǒng)的國產(chǎn)化替換,客戶明確要求數(shù)據(jù)庫必須換成金倉。團(tuán)隊里沒人用過,心里都有點打鼓。

我當(dāng)時先用Spring Boot + JdbcTemplate跑了個demo,發(fā)現(xiàn)挺順利。后來好奇MyBatis能不能也這么絲滑地接進(jìn)去,就專門搭了個項目驗證。結(jié)果從配依賴到跑通CRUD,一個小時不到全搞定。今天就把這次實戰(zhàn)經(jīng)歷整理出來。

一、準(zhǔn)備工作

配置文件里需要填連接信息,先找DBA要到這四項:

  • 數(shù)據(jù)庫IP和端口(默認(rèn)54321)
  • 數(shù)據(jù)庫名
  • 用戶名(默認(rèn)system)
  • 密碼

順便用命令行驗證一下能不能連上:

./ksql -U system -d test -h 192.168.1.100 -p 54321

連上了再繼續(xù)下一步。

二、項目搭建

2.1 目錄結(jié)構(gòu)

mybatis-kingbase/
├── pom.xml
├── src/main/
│   ├── java/com/kingbase/
│   │   ├── mapper/
│   │   │   ├── IUserMapper.java      # XML方式
│   │   │   └── IAppMapper.java       # 注解方式
│   │   └── pojo/
│   │       ├── User.java
│   │       └── App.java
│   └── resources/
│       ├── jdbc.properties
│       ├── mybatis-config.xml
│       └── IUserMapper.xml
└── src/test/java/
    └── TestMybatis.java

用了兩種Mapper方式對比:IUserMapper是XML配置,IAppMapper是純注解,方便看看哪種更適合自己的項目。

2.2 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.kingbase.example</groupId>
    <artifactId>java-kingbase-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!-- 金倉JDBC驅(qū)動 -->
        <dependency>
            <groupId>cn.com.kingbase</groupId>
            <artifactId>kingbase8</artifactId>
            <version>9.0.0</version>
        </dependency>
        <!-- MyBatis核心 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!-- 分頁插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.0</version>
        </dependency>
        <!-- 單元測試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

關(guān)鍵點:金倉驅(qū)動groupId是cn.com.kingbase,我剛用時寫成com.kingbase8一直拉不下來。

2.3 配置文件

jdbc.properties

jdbc.driver=com.kingbase8.Driver
jdbc.url=jdbc:kingbase8://192.168.1.100:54321/test?useServerPrepStmts=true&rewriteBatchedStatements=true
jdbc.username=system
jdbc.password=123456

URL后面加了兩個參數(shù):useServerPrepStmts開啟預(yù)編譯、rewriteBatchedStatements優(yōu)化批量插入,正式環(huán)境建議加上。

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"/>
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="kingbase8"/>
            <property name="reasonable" value="false"/>
        </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="IUserMapper.xml"/>
        <mapper class="com.kingbase.mapper.IAppMapper"/>
    </mappers>
</configuration>

兩個地方需要注意:mapUnderscoreToCamelCase開啟后,數(shù)據(jù)庫字段user_name能自動映射到Java的userName;分頁插件dialect要寫成kingbase8才能生成正確分頁SQL。

三、代碼實現(xiàn)

3.1 實體類

User.java和App.java代碼一樣:

package com.kingbase.pojo;

public class User {
    private Long id;
    private String name;
    
    public User() {}
    
    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    
    // getter/setter省略...
    
    @Override
    public String toString() {
        return "User{id=" + id + ", name='" + name + "'}";
    }
}

3.2 XML方式:IUserMapper

接口

package com.kingbase.mapper;

import com.kingbase.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;

public interface IUserMapper {
    Integer insertUser(User user);
    Integer deleteUser(Long id);
    Integer updateUser(User user);
    List<User> selectUsers();
    List<User> selectUserByPage(@Param("pageNum") Integer pageNum,
                                @Param("pageSize") Integer pageSize);
}

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.kingbase.mapper.IUserMapper">
    <insert id="insertUser" parameterType="com.kingbase.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.kingbase.pojo.User">
        UPDATE test_user SET name = #{name} WHERE id = #{id}
    </update>
    <select id="selectUsers" resultType="com.kingbase.pojo.User">
        SELECT id, name FROM test_user
    </select>
    <select id="selectUserByPage" resultType="com.kingbase.pojo.User">
        SELECT id, name FROM test_user 
        LIMIT #{pageNum}, #{pageSize}
    </select>
</mapper>

LIMIT做分頁,代碼比Oracle的rownum簡潔多了。

3.3 注解方式:IAppMapper

package com.kingbase.mapper;

import com.kingbase.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 app);

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

簡單SQL用注解方便,復(fù)雜查詢還是XML更清晰,看個人習(xí)慣。

四、測試驗證

測試類覆蓋了XML和注解兩種Mapper、以及分頁功能:

import com.kingbase.mapper.IAppMapper;
import com.kingbase.mapper.IUserMapper;
import com.kingbase.pojo.App;
import com.kingbase.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 IOException, SQLException {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder()
            .build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = factory.openSession();
        Statement stmt = sqlSession.getConnection().createStatement();
        
        // 建表
        try {
            stmt.execute("drop table if exists test_user");
        } catch (SQLException e) {}
        stmt.execute("create table test_user(id number(20) primary key, name varchar(100))");
        
        IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
        
        // 插入10條
        for (int i = 1; i <= 10; i++) {
            mapper.insertUser(new User((long) i, "insert"));
        }
        
        // 刪除id=1
        mapper.deleteUser(1L);
        
        // 更新id=2
        mapper.updateUser(new User(2L, "update"));
        
        // 查詢所有
        List<User> userList = mapper.selectUsers();
        userList.forEach(System.out::println);
        
        // 分頁查詢
        List<User> usersByPage = mapper.selectUserByPage(0, 3);
        System.out.println("分頁結(jié)果: " + usersByPage);
        
        stmt.close();
        sqlSession.commit();
        sqlSession.close();
    }
    
    @Test
    public void testAppMapper() throws IOException, SQLException {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder()
            .build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = factory.openSession();
        Statement stmt = sqlSession.getConnection().createStatement();
        
        // 建表
        try {
            stmt.execute("drop table if exists test_app");
        } catch (SQLException e) {}
        stmt.execute("create table test_app(id number(20) primary key, name varchar(100))");
        
        IAppMapper mapper = sqlSession.getMapper(IAppMapper.class);
        
        // 插入10條
        for (int i = 1; i <= 10; i++) {
            mapper.insertApp(new App((long) i, "insert" + i));
        }
        
        // 刪除id=1
        mapper.deleteApp(1L);
        
        // 更新id=2
        mapper.updateApp(new App(2L, "update"));
        
        // 分頁測試
        PageHelper.startPage(2, 3);
        List<App> appList = mapper.selectApps();
        PageInfo<App> pageInfo = new PageInfo<>(appList);
        System.out.println("分頁后: " + pageInfo.getList());
        
        sqlSession.commit();
        sqlSession.close();
    }
}

運行結(jié)果:

User{id=2, name='update'}
User{id=3, name='insert'}
...
分頁后: [App{id=6, name='insert6'}, App{id=7, name='insert7'}, App{id=8, name='insert8'}]

從輸出能看出:建表成功、數(shù)據(jù)正確、分頁按預(yù)期工作。

五、兩種Mapper方式對比

維度XML配置注解
SQL與代碼分離混在一起
復(fù)雜SQL清晰字符串拼接
動態(tài)SQL天然支持需要用Provider
調(diào)試有語法檢查編譯期不檢查
適用場景項目工程簡單demo

建議:簡單CRUD用注解省事,復(fù)雜業(yè)務(wù)查詢用XML更好維護(hù)。

六、生產(chǎn)環(huán)境踩坑記錄

驅(qū)動類名com.kingbase8.Driver,不是com.kingbase.Driver。

分頁方言:PageHelper的helperDialect要寫成kingbase8,寫成mysql語法不對,寫成postgresql也能用,但不如kingbase8穩(wěn)定。

KingbaseMode參數(shù):金倉有Oracle和MySQL兩種兼容模式,連接URL加上KingbaseMode=mysql可以用MySQL方言的LIMIT,不加就用Oracle的rownum。示例用的是默認(rèn)模式,分頁用了LIMIT說明數(shù)據(jù)庫用MySQL模式創(chuàng)建的。

批量操作優(yōu)化:連接URL加上&rewriteBatchedStatements=true,批量插入性能能提升不少。

大小寫問題:表名和字段名建議全部小寫,用雙引號會導(dǎo)致大小寫敏感,各種莫名奇妙的麻煩。

七、總結(jié)

從MySQL切到金倉,MyBatis項目改的地方很少:pom.xml換驅(qū)動、配置改URL、分頁方言改成kingbase8。如果SQL里沒用數(shù)據(jù)庫特有語法,基本無縫遷移。

我的建議是:先跑通demo驗證可行性,再考慮分庫分表、讀寫分離這些高級特性。金倉對MyBatis的兼容性整體做得不錯,踩坑的概率比你想象的低。

到此這篇關(guān)于MyBatis輕松接入金倉數(shù)據(jù)庫的完整步驟教學(xué)的文章就介紹到這了,更多相關(guān)MyBatis接入金倉數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 以實例講解Objective-C中的KVO與KVC機制

    以實例講解Objective-C中的KVO與KVC機制

    這篇文章主要介紹了以實例講解Objective-C中的KVO與KVC機制,即Key-Value-Observing與Key-Value-Coding,需要的朋友可以參考下
    2015-09-09
  • Java雙重校驗鎖單例原理

    Java雙重校驗鎖單例原理

    大家好,本篇文章主要講的是Java雙重校驗鎖單例原理,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Elasticsearch學(xué)習(xí)之Terms?set?查詢

    Elasticsearch學(xué)習(xí)之Terms?set?查詢

    這篇文章主要為大家介紹了Elasticsearch學(xué)習(xí)Terms?set?查詢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • java中循環(huán)遍歷刪除List和Set集合中元素的方法(推薦)

    java中循環(huán)遍歷刪除List和Set集合中元素的方法(推薦)

    下面小編就為大家?guī)硪黄猨ava中循環(huán)遍歷刪除List和Set集合中元素的方法(推薦)。小編覺得挺不錯的,在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Jmail發(fā)送郵件工具類分享

    Jmail發(fā)送郵件工具類分享

    這篇文章主要為大家分享了Jmail發(fā)送郵件工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java線程的start方法回調(diào)run方法的操作技巧

    Java線程的start方法回調(diào)run方法的操作技巧

    面試過程中經(jīng)常會被面試官問到為什么我們調(diào)用start()方法時會執(zhí)行run()方法,為什么不能直接調(diào)用run()方法,問的一頭霧水,今天小編給大家介紹下Java線程的start方法回調(diào)run方法的操作技巧,需要的朋友參考下吧
    2017-11-11
  • 一文詳解Spring?Boot可以同時處理多少請求

    一文詳解Spring?Boot可以同時處理多少請求

    SpringBoot是一個流行的Java開發(fā)框架,它被廣泛用于構(gòu)建Web應(yīng)用程序,但是,開發(fā)人員通常會擔(dān)心它的性能問題,特別是在高負(fù)載條件下,Spring?Boot能夠同時處理多少請求是一個重要的問題,在本文中,我們將討論SpringBoot的請求處理能力,并介紹如何提高性能
    2023-10-10
  • 圖數(shù)據(jù)庫NebulaGraph的Java 數(shù)據(jù)解析實踐與指導(dǎo)詳解

    圖數(shù)據(jù)庫NebulaGraph的Java 數(shù)據(jù)解析實踐與指導(dǎo)詳解

    這篇文章主要介紹了圖數(shù)據(jù)庫NebulaGraph的Java 數(shù)據(jù)解析實踐與指導(dǎo)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • SpringBoot+SPI機制實現(xiàn)可插拔組件

    SpringBoot+SPI機制實現(xiàn)可插拔組件

    本文主要介紹了SpringBoot+SPI機制實現(xiàn)可插拔組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • 淺談Spring Boot、MyBatis、MyBatis-Plus 依賴版本對應(yīng)關(guān)系

    淺談Spring Boot、MyBatis、MyBatis-Plus 依賴版本對應(yīng)關(guān)系

    本文主要介紹了SpringBoot、MyBatis和MyBatis-Plus的依賴版本對應(yīng)關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11

最新評論

阿尔山市| 浮梁县| 二连浩特市| 仙游县| 木里| 收藏| 大新县| 瓦房店市| 白河县| 普定县| 蓝山县| 达拉特旗| 扶余县| 斗六市| 云南省| 柞水县| 肇源县| 威信县| 洪江市| 扬州市| 东山县| 高邮市| 克拉玛依市| 集贤县| 巴楚县| 仁布县| 永平县| 运城市| 璧山县| 鄢陵县| 延吉市| 衡水市| 吴旗县| 新宁县| 林甸县| 沐川县| 凤城市| 永春县| 宜兰市| 临高县| 临猗县|