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

SpringBoot?mybatis-plus使用json字段實(shí)戰(zhàn)指南

 更新時間:2024年01月31日 09:21:50   作者:張三瘋不瘋  
在現(xiàn)代應(yīng)用開發(fā)中經(jīng)常會使用JSON格式存儲和傳輸數(shù)據(jù),為了便捷地處理數(shù)據(jù)庫中的JSON字段,MyBatis-Plus提供了強(qiáng)大的JSON處理器,這篇文章主要給大家介紹了關(guān)于SpringBoot?mybatis-plus使用json字段的相關(guān)資料,需要的朋友可以參考下

1.前言

在springboot項(xiàng)目開發(fā)中,一般使用關(guān)系型數(shù)據(jù)庫作為主庫存儲數(shù)據(jù),有時候業(yè)務(wù)場景需要在既有的表結(jié)構(gòu)上,擴(kuò)展自定義業(yè)務(wù)信息. 這種場景下一般使用json類型存儲。本文總結(jié)springboot項(xiàng)目中,借助mybatis-plus操作json實(shí)踐方案

2.方案分析

2.1 為什么是json

JSON類型相對于傳統(tǒng)的關(guān)系型結(jié)構(gòu),其具有數(shù)據(jù)本身對結(jié)構(gòu)描述、動態(tài)擴(kuò)展和嵌套等特性,能夠更加自由地表示和存儲數(shù)據(jù)

2.2 數(shù)據(jù)庫的選擇

json字段的存儲依賴于底層選擇的數(shù)據(jù)庫, 有的關(guān)系型數(shù)據(jù)庫已經(jīng)支持json,比如MySQL5.7版本中,引入了JSON類型。如果沒有特殊的json類型, 我們可以使用text類型存儲json文本。因此要分兩種情況分析. 這兩種模式區(qū)別:

  • 提供json類型數(shù)據(jù)庫,在查詢靈活程度上更高,比如可以針對json指定key的value進(jìn)行查詢。text之惡能作為普通文本匹配
  • 提供json類型數(shù)據(jù)庫,查詢會部分依賴底層特殊查詢語法. text則是通用的數(shù)據(jù)類型不存在該情況。

3. 實(shí)戰(zhàn)

無論底層數(shù)據(jù)庫使用text類型還是json類型。持久層使用mybatis-plus都要處理json與對象的映射問題。創(chuàng)建一個Account賬號對象為例,增加一個extendJson作為存儲擴(kuò)展數(shù)據(jù)的json對象

@TableName(value = "account", autoResultMap = true)
public class Account {

    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private String username;

    /**
     * 注意?。?必須開啟映射注解
     *
     * @TableName(autoResultMap = true)
     * <p>
     * 以下兩種類型處理器,二選一 也可以同時存在
     * <p>
     * 注意!!選擇對應(yīng)的 JSON 處理器也必須存在對應(yīng) JSON 解析依賴包
     */
    //@TableField(typeHandler = JacksonTypeHandler.class)
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONObject extendJson;

    //setter/getter忽略

以上部分主要參考mp官網(wǎng):https://baomidou.com/ >>字段類型處理器

3.1 使用text字段(h2數(shù)據(jù)庫)

使用text字段測試json字段我們使用h2數(shù)據(jù)庫進(jìn)行測試

  • h2版本: 1.4.200(該版本不支持原生的json字段)

3.1.1 建表語句

使用liquibase管理建表語句

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">

    <changeSet author="demo" id="account.createTable">
        <createTable tableName="account" remarks="賬號表">
            <!--設(shè)置id自增 起始位置從10000 每次加1-->
            <column name="id" remarks="賬戶ID" type="bigint" autoIncrement="true" incrementBy="1" startWith="10000">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <!--用戶名增加唯一索引-->
            <column name="username" remarks="用戶名" type="VARCHAR(32)">
                <constraints nullable="false" unique="true" uniqueConstraintName="uniq_username"/>
            </column>
            <column name="password" remarks="密碼" type="VARCHAR(32)"/>
            <column name="name" remarks="姓名" type="VARCHAR(20)"/>
            <column name="sex" remarks="性別" type="CHAR(1)"/>
            <column name="phone" remarks="手機(jī)" type="VARCHAR(100)"/>
            <column name="email" remarks="郵件" type="VARCHAR(100)"/>
            <column name="create_time" remarks="創(chuàng)建時間" type="datetime(0)"/>
            <column name="update_time" remarks="修改時間" type="datetime(0)"/>
<!--            <column name="extend_json" remarks="拓展字段使用" type="json"/>-->
            <column name="extend_json" remarks="拓展字段使用" type="text"/>
        </createTable>
    </changeSet>

    <!--loadData:加載 csv 文件到已存在的表中-->
    <changeSet author="easy-log-demo" id="account.loadData" >
        <loadData tableName="account" file="db/liquibase/csv/account.csv" >
        </loadData>
    </changeSet>
</databaseChangeLog>

3.1.2 數(shù)據(jù)操作與查詢

text存儲json的數(shù)據(jù)操作與查詢與普通text操作無差別

@Service
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountMapper accountMapper;

    public void createAccount(Account account) {
        account.setUsername(UUID.randomUUID().toString().replace("-", ""));
        this.accountMapper.insert(account);
    }

    public Account updateAccount(Account account) {
        this.accountMapper.updateById(account);
        return this.accountMapper.selectById(account.getId());
    }

    @Override
    public List<Account> listAll() {
        return this.accountMapper.selectList(Wrappers.emptyWrapper());
    }
}

效果:

3.2 使用json字段(mysql數(shù)據(jù)庫)

3.2.1 建表語句

使用liquibase管理建表語句

  • MySQL使用版本: 大于等于5.7
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">

    <changeSet author="demo" id="account.createTable">
        <createTable tableName="account" remarks="賬號表">
            <!--設(shè)置id自增 起始位置從10000 每次加1-->
            <column name="id" remarks="賬戶ID" type="bigint" autoIncrement="true" incrementBy="1" startWith="10000">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <!--用戶名增加唯一索引-->
            <column name="username" remarks="用戶名" type="VARCHAR(32)">
                <constraints nullable="false" unique="true" uniqueConstraintName="uniq_username"/>
            </column>
            <column name="password" remarks="密碼" type="VARCHAR(32)"/>
            <column name="name" remarks="姓名" type="VARCHAR(20)"/>
            <column name="sex" remarks="性別" type="CHAR(1)"/>
            <column name="phone" remarks="手機(jī)" type="VARCHAR(100)"/>
            <column name="email" remarks="郵件" type="VARCHAR(100)"/>
            <column name="create_time" remarks="創(chuàng)建時間" type="datetime(0)"/>
            <column name="update_time" remarks="修改時間" type="datetime(0)"/>
            <column name="extend_json" remarks="拓展字段使用" type="json"/>
        </createTable>
    </changeSet>

    <!--loadData:加載 csv 文件到已存在的表中-->
    <changeSet author="easy-log-demo" id="account.loadData" >
        <loadData tableName="account" file="db/liquibase/csv/account.csv" >
        </loadData>
    </changeSet>


</databaseChangeLog>

3.2.2 數(shù)據(jù)操作與查詢

mysql支持json類型因此借助特定的語法可以實(shí)現(xiàn)json精確查詢及模糊查詢

@Service
public class AccountServiceImpl implements AccountService {
    
    @Autowired
    private AccountMapper accountMapper;
    
    public void createAccount(Account account) {
        account.setUsername(UUID.randomUUID().toString().replace("-", ""));
        this.accountMapper.insert(account);
    }

    public Account updateAccount(Account account) {
        this.accountMapper.updateById(account);

        return this.accountMapper.selectById(account.getId());
    }

    /**
     * json 數(shù)據(jù)模糊查詢
     * @param key extend_json 中的json的key
     * @param value extend_json 中的json的key對應(yīng)value
     * @return
     */
    public List<Account> listByJsonLike(String key, String value) {
//        QueryChainWrapper<Account> queryWrapper = new QueryChainWrapper<>(this.accountMapper);
        LambdaQueryWrapper<Account> queryWrapper = Wrappers.<Account>lambdaQuery();

        //json字段模式查詢
        queryWrapper.apply("JSON_EXTRACT(extend_json, '$." + key + "') LIKE {0}", "%" + value + "%")
                .ge(Account::getId, 10000);
        return this.accountMapper.selectList(queryWrapper);

    }

    /**
     * json 數(shù)據(jù)精確查詢
     * @param key extend_json 中的json的key
     * @param value extend_json 中的json的key對應(yīng)value
     * @return
     */
    public List<Account> listByJsonEquals(String key, String value) {
        LambdaQueryWrapper<Account> queryWrapper = Wrappers.<Account>lambdaQuery();
        //json字段精確查詢
        queryWrapper.apply("JSON_EXTRACT(extend_json, '$." + key + "') = {0}", value);
        return this.accountMapper.selectList(queryWrapper);

    }

    @Override
    public List<Account> listAll() {
        return this.accountMapper.selectList(Wrappers.emptyWrapper());
    }
}
  • 效果:測試json內(nèi)部字段模糊查詢

4. 附錄

4.1 MySQL JSON索引用法

TODO MySQLJSON索引用法介紹

4.2 mybatis-plus json查詢用法

public class YourService {

    @Autowired
    private YourMapper yourMapper;

    public YourEntity getByJsonKey(String key, String value) {
        QueryWrapper&lt;YourEntity&gt; queryWrapper = Wrappers.&lt;YourEntity&gt;lambdaQuery()
                .apply("json_data-&gt;'$.key' = {0}", value);

        return yourMapper.selectOne(queryWrapper);
    }
}

在上述示例中,.apply(“json_data->‘$.key’ = {0}”, value) 中的 {0} 將會被 MyBatis-Plus 自動處理為預(yù)編譯參數(shù),保證了 SQL 的安全性。

請確保你的 MyBatis-Plus 版本支持 .apply() 方法,該方法可以用于執(zhí)行自定義的 SQL 查詢條件。

5. 參考文檔

總結(jié) 

到此這篇關(guān)于SpringBoot mybatis-plus使用json字段的文章就介紹到這了,更多相關(guān)mybatis-plus使用json字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中jar打包并部署到Tomcat

    SpringBoot中jar打包并部署到Tomcat

    最近做了一個SpringBoot項(xiàng)目,今天介紹一下SpringBoot中jar打包并部署到Tomcat,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • SpringSecurity自定義登錄界面

    SpringSecurity自定義登錄界面

    這篇文章主要為大家詳細(xì)介紹了SpringSecurity自定義登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java8 Stream中對集合數(shù)據(jù)進(jìn)行快速匹配和賦值的代碼示例

    Java8 Stream中對集合數(shù)據(jù)進(jìn)行快速匹配和賦值的代碼示例

    這篇文章主要介紹了Java8 Stream中如何對集合數(shù)據(jù)進(jìn)行快速匹配和賦值,文中通過代碼示例為大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-06-06
  • java算法題解LeetCode30包含min函數(shù)的棧實(shí)例

    java算法題解LeetCode30包含min函數(shù)的棧實(shí)例

    這篇文章主要為大家介紹了java算法題解LeetCode30包含min函數(shù)的棧實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Spring Boot集成Quartz注入Spring管理的類的方法

    Spring Boot集成Quartz注入Spring管理的類的方法

    本篇文章主要介紹了Spring Boot集成Quartz注入Spring管理的類的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • RabbitMQ的基礎(chǔ)知識

    RabbitMQ的基礎(chǔ)知識

    本文詳細(xì)介紹了RabbitMQ的基礎(chǔ)知識,通過本文,我們可以了解到MQ工作原理、交換機(jī)等相關(guān)知識,有需要的朋友可以參考一下
    2021-08-08
  • java中反射詳解及實(shí)際應(yīng)用場景

    java中反射詳解及實(shí)際應(yīng)用場景

    Java反射允許運(yùn)行時動態(tài)獲取和操作類信息,支持私有成員訪問、動態(tài)加載類、序列化、依賴注入及動態(tài)代理等場景,這篇文章主要給大家介紹了關(guān)于java中反射詳解及實(shí)際應(yīng)用場景
    2025-07-07
  • 解析mybatis-plus中的resultMap簡單使用

    解析mybatis-plus中的resultMap簡單使用

    mybatis-plus也只是聽過,可是終究沒有使用過。于是自己花幾天晚上的時間研究mybatis-plus的使用。這篇文章主要介紹了mybatis-plus的resultMap簡單使用,需要的朋友可以參考下
    2021-11-11
  • java大文件上傳處理方法實(shí)例代碼

    java大文件上傳處理方法實(shí)例代碼

    在Java中實(shí)現(xiàn)大文件上傳功能,確實(shí)需要考慮到文件大小可能超出內(nèi)存限制、網(wǎng)絡(luò)傳輸穩(wěn)定性等因素,這篇文章主要介紹了java大文件上傳處理方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • spring-data-redis自定義實(shí)現(xiàn)看門狗機(jī)制

    spring-data-redis自定義實(shí)現(xiàn)看門狗機(jī)制

    redission看門狗機(jī)制是解決分布式鎖的續(xù)約問題,本文主要介紹了spring-data-redis自定義實(shí)現(xiàn)看門狗機(jī)制,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03

最新評論

莒南县| 高阳县| 五寨县| 买车| 普安县| 公安县| 六安市| 武义县| 尉犁县| 荔浦县| 平塘县| 柘荣县| 普格县| 灵石县| 武平县| 屏山县| 达拉特旗| 文水县| 兴城市| 璧山县| 潜山县| 福贡县| 那曲县| 马龙县| 云和县| 胶州市| 垫江县| 义乌市| 长治县| 花莲县| 西华县| 漳浦县| 安国市| 灯塔市| 高雄市| 汨罗市| 奎屯市| 新河县| 屏南县| 象山县| 阳原县|