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

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

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

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

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

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

一、準(zhǔn)備工作

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

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

順便用命令行驗(yàn)證一下能不能連上:

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

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

二、項(xiàng)目搭建

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方式對(duì)比:IUserMapper是XML配置,IAppMapper是純注解,方便看看哪種更適合自己的項(xiàng)目。

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>
        <!-- 金倉(cāng)JDBC驅(qū)動(dòng) -->
        <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>
        <!-- 分頁(yè)插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.0</version>
        </dependency>
        <!-- 單元測(cè)試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

關(guān)鍵點(diǎn):金倉(cāng)驅(qū)動(dòng)groupId是cn.com.kingbase,我剛用時(shí)寫成com.kingbase8一直拉不下來(lái)。

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后面加了兩個(gè)參數(shù):useServerPrepStmts開(kāi)啟預(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>

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

三、代碼實(shí)現(xiàn)

3.1 實(shí)體類

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做分頁(yè),代碼比Oracle的rownum簡(jiǎn)潔多了。

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();
}

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

四、測(cè)試驗(yàn)證

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

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);
        
        // 分頁(yè)查詢
        List<User> usersByPage = mapper.selectUserByPage(0, 3);
        System.out.println("分頁(yè)結(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"));
        
        // 分頁(yè)測(cè)試
        PageHelper.startPage(2, 3);
        List<App> appList = mapper.selectApps();
        PageInfo<App> pageInfo = new PageInfo<>(appList);
        System.out.println("分頁(yè)后: " + pageInfo.getList());
        
        sqlSession.commit();
        sqlSession.close();
    }
}

運(yùn)行結(jié)果:

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

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

五、兩種Mapper方式對(duì)比

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

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

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

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

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

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

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

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

七、總結(jié)

從MySQL切到金倉(cāng),MyBatis項(xiàng)目改的地方很少:pom.xml換驅(qū)動(dòng)、配置改URL、分頁(yè)方言改成kingbase8。如果SQL里沒(méi)用數(shù)據(jù)庫(kù)特有語(yǔ)法,基本無(wú)縫遷移。

我的建議是:先跑通demo驗(yàn)證可行性,再考慮分庫(kù)分表、讀寫分離這些高級(jí)特性。金倉(cāng)對(duì)MyBatis的兼容性整體做得不錯(cuò),踩坑的概率比你想象的低。

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

相關(guān)文章

  • 以實(shí)例講解Objective-C中的KVO與KVC機(jī)制

    以實(shí)例講解Objective-C中的KVO與KVC機(jī)制

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

    Java雙重校驗(yàn)鎖單例原理

    大家好,本篇文章主要講的是Java雙重校驗(yàn)鎖單例原理,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    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ī)?lái)一篇java中循環(huán)遍歷刪除List和Set集合中元素的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • Jmail發(fā)送郵件工具類分享

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

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

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

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

    一文詳解Spring?Boot可以同時(shí)處理多少請(qǐng)求

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

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

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

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

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

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

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

最新評(píng)論

东兴市| 黑水县| 礼泉县| 六盘水市| 德阳市| 泉州市| 安丘市| 靖远县| 东丽区| 冷水江市| 讷河市| 百色市| 揭西县| 阳新县| 察隅县| 鄂托克前旗| 新化县| 嘉峪关市| 卫辉市| 洱源县| 西藏| 天门市| 凯里市| 井陉县| 绥化市| 洛宁县| 揭西县| 沙坪坝区| 湾仔区| 鱼台县| 明溪县| 沂南县| 夏津县| 武宁县| 新龙县| 柳江县| 当阳市| 进贤县| 射洪县| 临颍县| 卢湾区|