亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mybatis查詢數(shù)據(jù)的項(xiàng)目實(shí)現(xiàn)

 更新時(shí)間:2023年09月08日 10:40:28   作者:Mointor  
MyBatis通過(guò)XML配置文件或注解,把Java對(duì)象映射到對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,實(shí)現(xiàn)對(duì)象關(guān)系和數(shù)據(jù)關(guān)系的互相轉(zhuǎn)換,從而使得Java應(yīng)用程序能夠更簡(jiǎn)單的操作和讀取數(shù)據(jù)庫(kù),本文就詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下

上一篇我們介紹了在pom文件中引入mybatis依賴,配置了mybatis配置文件,通過(guò)讀取配置文件創(chuàng)建了會(huì)話工廠,使用會(huì)話工廠創(chuàng)建會(huì)話獲取連接對(duì)象讀取到了數(shù)據(jù)庫(kù)的基本信息。

如果您需要對(duì)上面的內(nèi)容進(jìn)行了解,可以參考Mybatis引入與使用

 本篇我們?cè)谏弦黄幕A(chǔ)上了解如果使用mybatis查詢數(shù)據(jù):

一、準(zhǔn)備數(shù)據(jù)

這里我們直接使用腳本初始化數(shù)據(jù)庫(kù)中的數(shù)據(jù)

-- 如果數(shù)據(jù)庫(kù)不存在則創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
-- 切換數(shù)據(jù)庫(kù)
USE demo;
-- 創(chuàng)建用戶表
CREATE TABLE IF NOT EXISTS T_USER(
  ID INT PRIMARY KEY,
  USERNAME VARCHAR(32) NOT NULL,
  AGE INT NOT NULL 
);
-- 插入用戶數(shù)據(jù)
INSERT INTO T_USER(ID, USERNAME, AGE)
VALUES(1, '張三', 20),(2, '李四', 22),(3, '王五', 24);

創(chuàng)建了一個(gè)名稱(chēng)為demo的數(shù)據(jù)庫(kù);并在庫(kù)里創(chuàng)建了名稱(chēng)為T(mén)_USER的用戶表并向表中插入了數(shù)據(jù)

二、創(chuàng)建用戶實(shí)體類(lèi)

在cn.horse.demo2包下創(chuàng)建UserInfo實(shí)體類(lèi),為了方便打印用戶的信息這里重寫(xiě)了ToString()方法

package cn.horse.demo2;
public class UserInfo {
    private int id;
    private String username;
    private int age;
    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        result.append('[');
        result.append("id: " + this.id);
        result.append(", ");
        result.append("username: " + this.username);
        result.append(", ");
        result.append("age: " + this.age);
        result.append(']');
        return result.toString();
    }
}

三、配置Mapper文件

這里我在resources下創(chuàng)建了一個(gè)demo2的目錄,并在目錄下創(chuàng)建了一個(gè)UserInfoMapper.xml的配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserInfoMapper">
    <select id="findById" resultType="cn.horse.demo2.UserInfo">
        SELECT *
        FROM T_USER
        WHERE ID = #{id}
    </select>
    <select id="findAll" resultType="cn.horse.demo2.UserInfo">
        SELECT *
        FROM T_USER
    </select>
</mapper>
  • namespace代表的是名稱(chēng)空間;如果有多個(gè)Mapper配置文件,名稱(chēng)空間不允許重復(fù)
  • select查詢標(biāo)簽;
    • id代表的是編號(hào),同一個(gè)名稱(chēng)空間下編號(hào)不允許重復(fù);
    • resultType代表的是結(jié)果類(lèi)型,指將數(shù)據(jù)庫(kù)查詢出來(lái)的數(shù)據(jù)轉(zhuǎn)換成結(jié)果類(lèi)型對(duì)象,轉(zhuǎn)換的前提是結(jié)果類(lèi)型需要提供無(wú)參數(shù)的構(gòu)造方法(用于創(chuàng)建結(jié)果類(lèi)型對(duì)象),數(shù)據(jù)庫(kù)中的列需要與結(jié)果類(lèi)型中的字段一一對(duì)應(yīng)(使用反射的方式進(jìn)行對(duì)象中字段的賦值),否則無(wú)法創(chuàng)建結(jié)果類(lèi)型對(duì)象或者無(wú)法將數(shù)據(jù)綁定到結(jié)果類(lèi)型對(duì)象的字段上。
    • 標(biāo)簽內(nèi)容是SQL語(yǔ)句,代表使用ID查詢用戶信息,其中#{id}是參數(shù);在執(zhí)行當(dāng)前查詢語(yǔ)句時(shí)需要攜帶此參數(shù)。

四、引入Mapper配置

Mapper配置完成后,并沒(méi)有生效;需要在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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="jdbc:mysql://${ip}:${port}/${database}?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="demo2/UserInfoMapper.xml" />
    </mappers>
</configuration>

其中mapper標(biāo)簽是我們引入的配置,resource用于指向Mapper配置文件的位置。

五、查詢一條數(shù)據(jù)

// 讀取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根據(jù)配置創(chuàng)建SqlSession工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 創(chuàng)建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 根據(jù)用戶編號(hào)查詢一條用戶信息
    UserInfo userInfo = sqlSession.selectOne("UserInfoMapper.findById", 2);
    System.out.println(userInfo);
} finally {
    // 關(guān)閉會(huì)話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代碼中我們使用selectOne查詢一條數(shù)據(jù):

第一個(gè)參數(shù)代表的是語(yǔ)句,其實(shí)就是【名稱(chēng)空間.編號(hào)】,根據(jù)名稱(chēng)空間和編號(hào)可以找到我們?cè)贛apper配置文件中配置的SQL語(yǔ)句

第二個(gè)參數(shù)代表的是參數(shù)值,用于解析SQL語(yǔ)句中的參數(shù)

測(cè)試:

執(zhí)行上面代碼的結(jié)果如下:

 查詢的結(jié)果與我們庫(kù)中的數(shù)據(jù)一致。

六、查詢數(shù)據(jù)列表

// 讀取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根據(jù)配置創(chuàng)建SqlSession工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 創(chuàng)建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查詢數(shù)據(jù)列表
    List<UserInfo> userInfoList = sqlSession.selectList("UserInfoMapper.findAll");
    for (UserInfo userInfo: userInfoList) {
        System.out.println(userInfo);
    }
} finally {
    // 關(guān)閉會(huì)話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代碼中我們使用selectList查詢數(shù)據(jù)列表,由于沒(méi)有使用到參數(shù),所以沒(méi)有傳遞任何參數(shù)

測(cè)試:

執(zhí)行上面代碼的結(jié)果如下:

查詢的結(jié)果與我們庫(kù)中的數(shù)據(jù)一致。

七、查詢數(shù)據(jù)Map

// 讀取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根據(jù)配置創(chuàng)建SqlSession工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 創(chuàng)建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查詢數(shù)據(jù)列表
    Map<Integer, UserInfo> userInfoMap = sqlSession.selectMap("UserInfoMapper.findAll", "id");
    for (Map.Entry<Integer, UserInfo> entry: userInfoMap.entrySet()) {
        System.out.println(entry.getKey() + " -> " + entry.getValue());
    }
} finally {
    // 關(guān)閉會(huì)話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代碼中我們使用selectMap查詢數(shù)據(jù)Map,這里需要指定哪個(gè)字段作為Map的Key,這里我是用id字段作為Map的Key;這樣可以直接得到用戶編號(hào)到用戶對(duì)象的Map集合。

需要注意的是Map的Key字段來(lái)源于返回類(lèi)型中的字段而不是數(shù)據(jù)庫(kù)中表的列字段

測(cè)試:

執(zhí)行上面代碼的結(jié)果如下:

查詢的結(jié)果與我們庫(kù)中的數(shù)據(jù)一致。

八、使用結(jié)果處理器查詢數(shù)據(jù)

// 讀取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根據(jù)配置創(chuàng)建SqlSession工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 創(chuàng)建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查詢數(shù)據(jù)列表
    sqlSession.select("UserInfoMapper.findAll", new ResultHandler<UserInfo>() {
        @Override
        public void handleResult(ResultContext<? extends UserInfo> resultContext) {
            System.out.println(resultContext.getResultObject());
        }
    });
} finally {
    // 關(guān)閉會(huì)話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代碼中我們使用select查詢數(shù)據(jù),此方法沒(méi)有返回值,而是使用ResultHandler匿名內(nèi)部類(lèi)直接對(duì)每條數(shù)據(jù)進(jìn)行處理

測(cè)試:

執(zhí)行上面代碼的結(jié)果如下:

查詢的結(jié)果與我們庫(kù)中的數(shù)據(jù)一致。

九、使用游標(biāo)查詢數(shù)據(jù)

// 讀取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根據(jù)配置創(chuàng)建SqlSession工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
Cursor<UserInfo> cursor = null;
try {
    // 創(chuàng)建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查詢數(shù)據(jù)列表
    cursor = sqlSession.selectCursor("UserInfoMapper.findAll");
    for (Iterator<UserInfo> it = cursor.iterator(); it.hasNext();) {
        System.out.println(it.next());
    }
} finally {
    // 關(guān)閉游標(biāo)
    if(Objects.nonNull(cursor)) {
        try {
            cursor.close();
        } catch (IOException e) { }
    }
    // 關(guān)閉會(huì)話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代碼中我們使用selectCursor查詢數(shù)據(jù),此方法返回一個(gè)游標(biāo)對(duì)象,使用迭代器獲取數(shù)據(jù)列表。

需要注意的是游標(biāo)對(duì)象需要關(guān)閉

測(cè)試:

執(zhí)行上面代碼的結(jié)果如下:

查詢的結(jié)果與我們庫(kù)中的數(shù)據(jù)一致。

到此這篇關(guān)于Mybatis查詢數(shù)據(jù)的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Mybatis查詢數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Java 對(duì)象引用和對(duì)象本身

    淺析Java 對(duì)象引用和對(duì)象本身

    這篇文章主要介紹了Java 對(duì)象引用和對(duì)象本身的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • Sentinel結(jié)合Nacos實(shí)現(xiàn)數(shù)據(jù)持久化過(guò)程詳解

    Sentinel結(jié)合Nacos實(shí)現(xiàn)數(shù)據(jù)持久化過(guò)程詳解

    這篇文章主要介紹了Sentinel結(jié)合Nacos實(shí)現(xiàn)數(shù)據(jù)持久化過(guò)程,要持久化的原因是因?yàn)槊看螁?dòng)Sentinel都會(huì)使之前配置的規(guī)則就清空了,這樣每次都要再去設(shè)定規(guī)則顯得非常的麻煩,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • 一篇文章帶你入門(mén)Java數(shù)據(jù)類(lèi)型

    一篇文章帶你入門(mén)Java數(shù)據(jù)類(lèi)型

    下面小編就為大家?guī)?lái)一篇Java的基本數(shù)據(jù)類(lèi)型)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-08-08
  • SpringBoot整合Mybatis-plus實(shí)現(xiàn)多級(jí)評(píng)論功能

    SpringBoot整合Mybatis-plus實(shí)現(xiàn)多級(jí)評(píng)論功能

    本文介紹了如何使用SpringBoot整合Mybatis-plus實(shí)現(xiàn)多級(jí)評(píng)論功能,同時(shí)提供了數(shù)據(jù)庫(kù)的設(shè)計(jì)和詳細(xì)的后端代碼,前端界面使用的Vue2,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-05-05
  • SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證

    SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證

    本文主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Struts2返回json格式數(shù)據(jù)代碼實(shí)例

    Struts2返回json格式數(shù)據(jù)代碼實(shí)例

    這篇文章主要介紹了Struts2返回json格式數(shù)據(jù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Spring boot基于ScheduledFuture實(shí)現(xiàn)定時(shí)任務(wù)

    Spring boot基于ScheduledFuture實(shí)現(xiàn)定時(shí)任務(wù)

    這篇文章主要介紹了Spring boot基于ScheduledFuture實(shí)現(xiàn)定時(shí)任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 基于spring+quartz的分布式定時(shí)任務(wù)框架實(shí)現(xiàn)

    基于spring+quartz的分布式定時(shí)任務(wù)框架實(shí)現(xiàn)

    在Spring中的定時(shí)任務(wù)功能,最好的辦法當(dāng)然是使用Quartz來(lái)實(shí)現(xiàn)。這篇文章主要介紹了基于spring+quartz的分布式定時(shí)任務(wù)框架實(shí)現(xiàn),有興趣的可以了解一下。
    2017-01-01
  • 一文詳解Lombok中@ToString()的使用技巧

    一文詳解Lombok中@ToString()的使用技巧

    在平時(shí)我們工作的時(shí)候,我們經(jīng)常會(huì)使用toString()?方法來(lái)輸出一個(gè)對(duì)象的一些屬性信息。Lombok?給我們提供了一個(gè)自動(dòng)生成?toString()代碼的注解,可以減少代碼行數(shù),本文就來(lái)和大家詳細(xì)聊聊吧
    2023-02-02
  • Spring之SseEmitter實(shí)現(xiàn)讓你的進(jìn)度條實(shí)時(shí)更新

    Spring之SseEmitter實(shí)現(xiàn)讓你的進(jìn)度條實(shí)時(shí)更新

    Spring SseEmitter是一種實(shí)現(xiàn)服務(wù)器端推送事件(SSE)的機(jī)制,支持單向通信,適用于實(shí)時(shí)數(shù)據(jù)傳輸需求,通過(guò)代碼示例和應(yīng)用場(chǎng)景分析,展示了如何在服務(wù)端和客戶端使用SseEmitter進(jìn)行實(shí)時(shí)數(shù)據(jù)推送
    2025-02-02

最新評(píng)論