MyBatis中的介面代理機制及其使用

来源:https://www.cnblogs.com/TheMagicalRainbowSea/p/18227154
-Advertisement-
Play Games

1. MyBatis中的介面代理機制及其使用 @目錄1. MyBatis中的介面代理機制及其使用2. 實操2.1 準備工作2.2 insert 增加操作2.3 delete 刪除操作2.4 update 修改操作2.5 select 查詢一條記錄操作2.6 select 查詢多條記錄操作3. 總結: ...


1. MyBatis中的介面代理機制及其使用

@

目錄


MyBatis 中的介面代理類機制,MyBatis 框架中使用了動態代理的設計模式,讓我們可以不用寫,對應XxxMapper.java 介面的實現類,而是通過動態代理的方式,讓MyBatis 自動為我們生成對應實現了該 XxxMapper.java介面的實現類,這個動態代理實現的類,我們可以直接使用。

核心代碼:

 		// 獲取到 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 獲取到SqlSessionFactory 對象
        // SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
		// 需要註意的是參數的 Xxxmapper.class 和 返回值是保持一致的。
        XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
		mapper.xxx(); // 執行的是該XxxMapper介面中的方法
		// 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
		// 需要註意的是參數的 Xxxmapper.class 和 返回值是保持一致的。
        XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
		mapper.xxx(); // 執行的是該XxxMapper介面中的方法

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)介面的全限定名稱一致,id 必須和 dao(mapper) 介面中方法名一致。

比如:我們這裡的是:

CarMappe.xml

  • XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)介面的全限定名稱一致

在這裡插入圖片描述

  • 對應的介面上的方法名,id 必須dao(mapper) 介面中方法名一致。

在這裡插入圖片描述

  • 使用的是 POJO 屬性類賦值的話,#{} 的括弧中的值,必須是 POJO類當中的屬性名,比如這裡我們用的是 Car ,則#{}括弧中的值,則必須是 Car 的屬性名。同時 #{} 括弧中一定要有值(就算只有一個參數,也要有值(隨便寫都要有值),才行,不然編譯無法通過)

在這裡插入圖片描述

2. 實操

下麵我們使用 MyBatis 的介面代理機制,對資料庫進行CRUD,(增刪改查)的操作。

2.1 準備工作

數據表結構的設計,數據表名為:t_car

在這裡插入圖片描述

t_car 表中的數據信息:

在這裡插入圖片描述

pom.xml 文件當中配置相關的依賴的 jar 包如下:

在這裡插入圖片描述

<?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.rainbowsea</groupId>
    <artifactId>mybatis-005-crud-blog</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <!--        mybatis 的依賴-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>

        <!--        mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!--        引入 logback的依賴,這個日誌框架實現了slf4j 規範-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
        </dependency>
    </dependencies>

</project>

配置 logback 的配置文件,用於列印顯示,我們的日誌信息,方便我們查看我們的運行過程,效果。

在這裡插入圖片描述

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="false">
    <!-- 控制台輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字元寬度%msg:日誌消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--mybatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

    <!-- 日誌輸出級別,logback日誌級別包括五個:TRACE < DEBUG < INFO < WARN < ERROR -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>

</configuration>

配置 MyBatis 的核心配置文件,

在這裡插入圖片描述

<?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>
    <!--    起別名-->
    <typeAliases>
        <!--  使用 <package>	還可以將這個包下的所有的類的全部自動起別名,別名就是簡名,不區分大小寫 -->
        <package name="com.rainbowsea.mybatis.pojo"/>
    </typeAliases>
    <environments default="mybatis">

        <environment id="mybatis">
            <!--            MANAGED 沒有用第三框架管理的話,都是會被提交的,沒有事務上的管理了 -->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="MySQL123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 這裡也是可以使用 package 包名掃描,但是同樣的:對應介面路徑要一致,介面名一致-->
        <mapper resource="CarMapper.xml"></mapper>
    </mappers>
</configuration>

對照 t_car 創建的ORM 映射的 Car 類

註意:在MyBatis 當中對應的ORM ,一般在框架里對應的 Bean實體類,一定要實現該 set 和 get 方法以及無參數構造方法,無法框架無法使用反射機制,進行操作

建議用包裝類,這樣可以防止 Null的問題,因為(簡單類型 int num = null ,是不可以賦值為 null)的編譯無法通過

在這裡插入圖片描述

package com.rainbowsea.mybatis.pojo;

public class Car {
    // 資料庫表當中的欄位應該和pojo類的屬性一一對應
    // 建議使用包裝類,這樣可以防止null的問題
    private Long id;
    private String carNum;
    private String brand;
    private Double guidePrice;
    private String produceTime;
    private String carType;

    public Car() {
    }

    public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
        this.id = id;
        this.carNum = carNum;
        this.brand = brand;
        this.guidePrice = guidePrice;
        this.produceTime = produceTime;
        this.carType = carType;
    }

    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", carNum='" + carNum + '\'' +
                ", brand='" + brand + '\'' +
                ", guidePrice=" + guidePrice +
                ", produceTime='" + produceTime + '\'' +
                ", catType='" + carType + '\'' +
                '}';
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCarNum() {
        return carNum;
    }

    public void setCarNum(String carNum) {
        this.carNum = carNum;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Double getGuidePrice() {
        return guidePrice;
    }

    public void setGuidePrice(Double guidePrice) {
        this.guidePrice = guidePrice;
    }

    public String getProduceTime() {
        return produceTime;
    }

    public void setProduceTime(String produceTime) {
        this.produceTime = produceTime;
    }

    public String getcarType() {
        return carType;
    }

    public void setcarType(String catType) {
        this.carType = catType;
    }
}

對應操作實現CRUD(增刪改查)的介面(這裡是:CarMapper介面),在MyBtis 當中 ,關於 CRUD(增刪改查)操作的介面/實現類,都是 mapper 結尾的作為持久層,而在 MVC的三層架構中,則是以 dao 為尾碼作為CRUD(增刪改查)操作的介面/實現類。

在這裡插入圖片描述

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.Car;

import java.util.List;

public interface CarMapper {


    /**
     * 新增 Car
     * @param car
     * @return
     */
    int insert(Car car);


    /**
     * 根據id 刪除 Car
     * @param id
     * @return
     */
    int deleteById(Long id);


    /**
     * 修改汽車信息
     * @param car
     * @return
     */
    int update(Car car);


    /**
     * 根據id查詢汽車信息
     * @param id
     * @return
     */
    Car selectById(Long id);


    /**
     * 獲取所有的汽車信息
     * @return
     */
    List<Car> selectAll();
}

2.2 insert 增加操作

對應 CarMapper 介面中的 insert( ) 抽象方法。

在這裡插入圖片描述


public interface CarMapper {


    /**
     * 新增 Car
     * @param car
     * @return
     */
    int insert(Car car);
}

對應 CarMapper.xml SQL語句映射文件,上編寫 insert 插入的 SQL語句。

在這裡插入圖片描述

<?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">

<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">

    <!--	id 要是 namespace 對應介面上的方法名: -->
    <insert id="insert" parameterType="com.rainbowsea.mybatis.pojo.Car">
        insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>

</mapper>

Java當中編程運行程式:

註意:因為是對資料庫進行了修改,所以需要 commit() 提交給資料庫,以及 close() 關閉資源

在這裡插入圖片描述

package com.rainbowsea.mybatis.test;

import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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;

public class CarMapperTest {

    @Test
    public void testInsert() throws IOException {
        // 獲取到 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 獲取到SqlSessionFactory 對象
        // SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        int count = mapper.insert(car);

        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();


    }
}

在這裡插入圖片描述

2.3 delete 刪除操作

根據 id 刪除一條記錄,刪除id為 124的一條記錄。

在這裡插入圖片描述

對應 CarMapper 介面中的 deleteById( Long id) 抽象方法。

在這裡插入圖片描述


public interface CarMapper {


    /**
     * 新增 Car
     * @param car
     * @return
     */
    int insert(Car car);


    /**
     * 根據id 刪除 Car
     * @param id
     * @return
     */
    int deleteById(Long id);
}

對應 CarMapper.xml SQL語句映射文件,上編寫 delete 刪除的 SQL語句。

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)介面的全限定名稱一致,id 必須和 dao(mapper) 介面中方法名一致。

在這裡插入圖片描述

<?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">

<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


<!--    如果只有一個參數需要傳的話,#{} 括弧中的值,可以隨便寫,但最後見名知意-->
    <delete id="deleteById" >
        delete from t_car where id=#{id}
    </delete>




</mapper>

Java當中編程運行程式:

註意:因為是對資料庫進行了修改,所以需要 commit() 提交給資料庫,以及 close() 關閉資源

刪除id為 124的一條記錄。

在這裡插入圖片描述

import org.junit.Test;

import java.io.IOException;

public class CarMapperTest {

    @Test
    public void testDeleteById() throws IOException {
        // 獲取到 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 獲取到SqlSessionFactory 對象
        // SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);

        // 刪除id為 124的一條記錄。
        int count = mapper.deleteById(124L);
        sqlSession.commit(); // 提交給資料庫
        sqlSession.close(); // 關閉資源
        System.out.println(count);

    }
}

在這裡插入圖片描述

2.4 update 修改操作

根據 id 修改記錄信息。

將 id 為 128的 brand 改為小米su7, guide_price 改為 21.00 , 時間改為 2024-03-28

在這裡插入圖片描述

對應 CarMapper 介面中的 update( ) 抽象方法。

在這裡插入圖片描述

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.Car;

import java.util.List;

public interface CarMapper {


    /**
     * 修改汽車信息
     * @param car
     * @return
     */
    int update(Car car);

}

對應 CarMapper.xml SQL語句映射文件,上編寫 update 修改的 SQL語句。

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)介面的全限定名稱一致,id 必須和 dao(mapper) 介面中方法名一致。

在這裡插入圖片描述

<?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">

<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


    <!--	id 要是 namespace 對應介面上的方法名: -->
    <update id="update">
        update t_car
        set car_num=#{carNum},
            brand=#{brand},
            guide_price=#{guidePrice},
            produce_time=#{produceTime},
            car_type=#{carType}
        where id = #{id}
    </update>


</mapper>

Java當中編程運行程式:

註意:因為是對資料庫進行了修改,所以需要 commit() 提交給資料庫,以及 close() 關閉資源

將 id 為 128的 brand 改為小米su7, guide_price 改為 21.00 , 時間改為 2024-03-28

在這裡插入圖片描述

在這裡插入圖片描述


import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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;

public class CarMapperTest {

    @Test
    public void testUpdate() throws IOException {
        // 獲取到 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 獲取到SqlSessionFactory 對象
        // SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(128L, "999", "小米su7", 21.0, "2022-03-28", "新能源");
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        int count = mapper.update(car);
        sqlSession.commit(); // 提交給資料庫
        sqlSession.close();



    }
}

2.5 select 查詢一條記錄操作

根據 id 查詢一條記錄。

查詢 id 為 130 的一條記錄。

在這裡插入圖片描述

對應 CarMapper 介面中的 selectById ( Long id) 抽象方法。

在這裡插入圖片描述

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.Car;

import java.util.List;

public interface CarMapper {



    /**
     * 根據id查詢汽車信息
     * @param id
     * @return
     */
    Car selectById(Long id);

}

對應 CarMapper.xml SQL語句映射文件,上編寫 select 查詢 的 SQL語句。

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)介面的全限定名稱一致,id 必須和 dao(mapper) 介面中方法名一致。

需要註意的是:查詢是會返回結果集的,所以我們需要在 <select> 查詢標簽當中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的))

同時由於我們的數據表的欄位的命名方式是下劃線 ,部分數據表的欄位名與我們設置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應數據表中的值,賦值到 對應的 POJO的類當中(這裡是 Car 類當中)

在這裡插入圖片描述

<?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">

<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


    <!--	id 要是 namespace 對應介面上的方法名: -->
    <select id="selectById" resultType="com.rainbowsea.mybatis.pojo.Car">
        select id,
               car_num      as carNum,
               brand,
               guide_price  as guidePrice,
               produce_time as produceTime,
               car_type     as carType
        from t_car
        where id = #{id}
    </select>



</mapper>

Java當中編程運行程式:

註意:因為我們僅僅是查詢數據表中的信息,不涉及到對數據表的修改,刪除操作,所以無需提交資料庫commit,只要 close() 關閉資源就可以了

查詢 id 為 130 的一條記錄。

在這裡插入圖片描述

在這裡插入圖片描述


import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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;

public class CarMapperTest {

    @Test
    public void testSelectById() throws IOException {
        // 獲取到 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 獲取到SqlSessionFactory 對象
        // SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car = mapper.selectById(130L);
        System.out.println(car);
        sqlSession.close();
    }
}

2.6 select 查詢多條記錄操作

查詢t_car 數據表中的所有信息。

在這裡插入圖片描述

對應 CarMapper 介面中的 selectAll( Long id) 抽象方法。返回的是一個List 集合

在這裡插入圖片描述

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.Car;

import java.util.List;

public interface CarMapper {

  

    /**
     * 獲取所有的汽車信息
     * @return
     */
    List<Car> selectAll();
}

對應 CarMapper.xml SQL語句映射文件,上編寫 select 查詢 的 SQL語句。

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)介面的全限定名稱一致,id 必須和 dao(mapper) 介面中方法名一致。

需要註意的是:查詢是會返回結果集的,所以我們需要在 <select> 查詢標簽當中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的))

同時由於我們的數據表的欄位的命名方式是下劃線 ,部分數據表的欄位名與我們設置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應數據表中的值,賦值到 對應的 POJO的類當中(這裡是 Car 類當中)

在這裡插入圖片描述

<?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">

<!--namespace 一定要是:對應的介面的全限定類名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


    <!--	id 要是 namespace 對應介面上的方法名: -->
    <select id="selectAll" resultType="com.rainbowsea.mybatis.pojo.Car">
        select id,
               car_num      as carNum,
               brand,
               guide_price  as guidePrice,
               produce_time as produceTime,
               car_type     as carType
        from t_car
    </select>

</mapper>

Java當中編程運行程式:

註意:因為我們僅僅是查詢數據表中的信息,不涉及到對數據表的修改,刪除操作,所以無需提交資料庫commit,只要 close() 關閉資源就可以了

查詢 t_car 數據表中的所有記錄。

在這裡插入圖片描述

在這裡插入圖片描述


import com.rainbowsea.mybatis.mapper.CarMapper;
import com.rainbowsea.mybatis.pojo.Car;
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.util.List;

public class CarMapperTest {
    @Test
    public void testSelectAll() throws IOException {
        // 獲取到 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 獲取到SqlSessionFactory 對象
        // SQlsessionFactory對象,一個SqlSessionFactory對應一個 environment, 一個environment通常是一個資料庫
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        List<Car> cars = mapper.selectAll();
        cars.forEach(car -> {
            System.out.println(car);
        });

        sqlSession.close();
    }
}

3. 總結:

		// 獲取到 SalSession 會話,一次會話一個
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向介面編程,獲取介面的代理對象,也就是介面的實現類,實現類該介面中的方法
		// 需要註意的是參數的 Xxxmapper.class 和 返回值是保持一致的。
        XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
		mapper.xxx(); // 執行的是該XxxMapper介面中的方法

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)介面的全限定名稱一致,id 必須和 dao(mapper) 介面中方法名一致。

  1. 註意:因為是對資料庫進行了修改,刪除,改動了,所以需要 commit() 提交給資料庫,以及 close() 關閉資源

  2. 需要註意的是:查詢是會返回結果集的,所以我們需要在 <select> 查詢標簽當中,通過 resultType 屬性指定返回的類型(如果沒有用別名機制的話,要用全限定類名(帶包名的))

    同時由於我們的數據表的欄位的命名方式是下劃線 ,部分數據表的欄位名與我們設置的 ORM 映射的POJO類的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無法將對應數據表中的值,賦值到 對應的 POJO的類當中(這裡是 Car 類當中)

  3. 註意:因為我們僅僅是查詢數據表中的信息,不涉及到對數據表的修改,刪除操作,所以無需提交資料庫commit,只要 close() 關閉資源就可以了。

  4. 如果只有一個參數需要傳的話,#{} 括弧中的值,可以隨便寫(#{}括弧的值不能空著,不然不編譯無法通過),但最好見名知意。

4. 最後:

“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、背景介紹 1.1 爬取目標 用python開發的爬蟲採集軟體,可自動按指定博主抓取該博主已發佈筆記。 為什麼有了源碼還開發界面軟體呢?方便不懂編程代碼的小白用戶使用,無需安裝python,無需改代碼,雙擊打開即用! 軟體界面截圖: 爬取結果截圖: 結果截圖1: 結果截圖2: 結果截圖3: 以上。 ...
  • Lambda表達式 Lambda表達式,也可以稱為閉包,是Java 8發佈的最重要新特性 Lambda允許把函數作為一個方法的參數(函數作為參數傳遞進方法中) 使用Lambda表達式可以使代碼變的更加簡潔緊湊 語法: (parameter) -> expression (parameter) -> ...
  • Node.js是一個基於 Chrome V8 引擎的 JavaScript 運行環境。Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。Express是一個保持最小規模的靈活的 Node.js Web應用程式開發框架,為Web和移動應用程式提供一組強大的功能。使用Node ...
  • 進程是電腦分配資源的基本單位,線程是cpu調度的基本單位 線程基本概念: LWP:light weight process 輕量級的進程。創建線程的底層函數和進程一樣,都是clone,因此線程的本質仍是進程(在linux環境下) 與進程相比,線程有獨立的TCB結構體(類似於進程的PCB),但沒有獨 ...
  • this,構造器,static,final,單例模式 this關鍵字 在java中this是一個引用變數,即指向當前對象地址的引用(指針),→可以把this當作當前對象,便於更好的索引. this() 實際是調用了當前對象的構造器 1. 引用當前對象的屬性 當在方法中要訪問當前對象的屬性時,可以用t ...
  • 1.線程池本質 ​ 多個線程組成的一個集合,目的為了併發執行任務,定義時是一個結構體,成員有互斥鎖,條件變數,任務鏈隊列指針,任務鏈隊列中等待的任務個數,當前活躍的線程數量,線程ID,線程銷毀標記等 2.線程池的關鍵技術 (1)萬能函數指針(通用函數指針): *void *(*p)(void ) ( ...
  • 要求:調用PLL—IP核,50Mhz晶振輸入,輸出四路時鐘不同信號:100Mhz,25Mhz,50Mhz(90°相位),50Mhz(20%占空比)。 晶元型號:cyclone Ⅳ EP4CE10F17C8 平臺工具:Quartus II 15.0 (64-bit)、Modelsim SE-64 ... ...
  • Redis是基於Reactor模式開發的網路事件處理器,這個處理器是單線程的,所 以redis是單線程的。 為什麼它是單線程還那麼快呢? 主要有以下幾個原因: 一、純記憶體操作 由於Redis是純記憶體操作,相比於磁碟來說,記憶體就快得多,這個是Redis快的主要 原因。 二、多路復用I/O機制(NIO) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...