欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

 本篇我們在上一篇的基礎(chǔ)上了解如果使用mybatis查詢數(shù)據(jù):

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

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

-- 如果數(shù)據(jù)庫不存在則創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
-- 切換數(shù)據(jù)庫
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)建了一個名稱為demo的數(shù)據(jù)庫;并在庫里創(chuàng)建了名稱為T_USER的用戶表并向表中插入了數(shù)據(jù)

二、創(chuàng)建用戶實體類

在cn.horse.demo2包下創(chuàng)建UserInfo實體類,為了方便打印用戶的信息這里重寫了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)建了一個demo2的目錄,并在目錄下創(chuàng)建了一個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代表的是名稱空間;如果有多個Mapper配置文件,名稱空間不允許重復(fù)
  • select查詢標(biāo)簽;
    • id代表的是編號,同一個名稱空間下編號不允許重復(fù);
    • resultType代表的是結(jié)果類型,指將數(shù)據(jù)庫查詢出來的數(shù)據(jù)轉(zhuǎn)換成結(jié)果類型對象,轉(zhuǎn)換的前提是結(jié)果類型需要提供無參數(shù)的構(gòu)造方法(用于創(chuàng)建結(jié)果類型對象),數(shù)據(jù)庫中的列需要與結(jié)果類型中的字段一一對應(yīng)(使用反射的方式進(jìn)行對象中字段的賦值),否則無法創(chuàng)建結(jié)果類型對象或者無法將數(shù)據(jù)綁定到結(jié)果類型對象的字段上。
    • 標(biāo)簽內(nèi)容是SQL語句,代表使用ID查詢用戶信息,其中#{id}是參數(shù);在執(zhí)行當(dāng)前查詢語句時需要攜帶此參數(shù)。

四、引入Mapper配置

Mapper配置完成后,并沒有生效;需要在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ù)用戶編號查詢一條用戶信息
    UserInfo userInfo = sqlSession.selectOne("UserInfoMapper.findById", 2);
    System.out.println(userInfo);
} finally {
    // 關(guān)閉會話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

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

第一個參數(shù)代表的是語句,其實就是【名稱空間.編號】,根據(jù)名稱空間和編號可以找到我們在Mapper配置文件中配置的SQL語句

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

測試:

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

 查詢的結(jié)果與我們庫中的數(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)閉會話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

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

測試:

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

查詢的結(jié)果與我們庫中的數(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)閉會話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

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

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

測試:

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

查詢的結(jié)果與我們庫中的數(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)閉會話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

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

測試:

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

查詢的結(jié)果與我們庫中的數(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)閉會話
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

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

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

測試:

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

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

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

相關(guān)文章

  • 淺析Java 對象引用和對象本身

    淺析Java 對象引用和對象本身

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

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

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

    一篇文章帶你入門Java數(shù)據(jù)類型

    下面小編就為大家?guī)硪黄狫ava的基本數(shù)據(jù)類型)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-08-08
  • SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能

    SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論