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

MyBatis中的接口代理機(jī)制及其使用方式

 更新時(shí)間:2024年06月06日 17:11:20   作者:ChinaRainbowSea  
這篇文章主要介紹了MyBatis中的接口代理機(jī)制及其使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

MyBatis中的接口代理機(jī)制及其使用

MyBatis 中的接口代理類(lèi)機(jī)制,MyBatis 框架中使用了動(dòng)態(tài)代理的設(shè)計(jì)模式,讓我們可以不用寫(xiě),對(duì)應(yīng)XxxMapper.java 接口的實(shí)現(xiàn)類(lèi),而是通過(guò)動(dòng)態(tài)代理的方式,讓MyBatis 自動(dòng)為我們生成對(duì)應(yīng)實(shí)現(xiàn)了該 XxxMapper.java接口的實(shí)現(xiàn)類(lèi),這個(gè)動(dòng)態(tài)代理實(shí)現(xiàn)的類(lèi),我們可以直接使用。

核心代碼:

 		// 獲取到 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 獲取到SqlSessionFactory 對(duì)象
        // SQlsessionFactory對(duì)象,一個(gè)SqlSessionFactory對(duì)應(yīng)一個(gè) environment, 一個(gè)environment通常是一個(gè)數(shù)據(jù)庫(kù)
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
		// 需要注意的是參數(shù)的 Xxxmapper.class 和 返回值是保持一致的。
        XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
		mapper.xxx(); // 執(zhí)行的是該XxxMapper接口中的方法
		// 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
		// 需要注意的是參數(shù)的 Xxxmapper.class 和 返回值是保持一致的。
        XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
		mapper.xxx(); // 執(zhí)行的是該XxxMapper接口中的方法

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

比如:我們這里的是:

CarMappe.xml

XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)接口的全限定名稱(chēng)一致

對(duì)應(yīng)的接口上的方法名,id 必須dao(mapper) 接口中方法名一致。

使用的是 POJO 屬性類(lèi)賦值的話(huà),#{} 的括號(hào)中的值,必須是 POJO類(lèi)當(dāng)中的屬性名,比如這里我們用的是 Car ,則#{}括號(hào)中的值,則必須是 Car 的屬性名。同時(shí) #{} 括號(hào)中一定要有值(就算只有一個(gè)參數(shù),也要有值(隨便寫(xiě)都要有值),才行,不然編譯無(wú)法通過(guò))

實(shí)操

下面我們使用 MyBatis 的接口代理機(jī)制,對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD,(增刪改查)的操作。

1.準(zhǔn)備工作

數(shù)據(jù)表結(jié)構(gòu)的設(shè)計(jì),數(shù)據(jù)表名為:t_car

t_car 表中的數(shù)據(jù)信息:

pom.xml 文件當(dāng)中配置相關(guān)的依賴(lài)的 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 的依賴(lài)-->
        <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的依賴(lài),這個(gè)日志框架實(shí)現(xiàn)了slf4j 規(guī)范-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
        </dependency>
    </dependencies>

</project>

配置 logback 的配置文件,用于打印顯示,我們的日志信息,方便我們查看我們的運(yùn)行過(guò)程,效果。

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

<configuration debug="false">
    <!-- 控制臺(tái)輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線(xiàn)程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%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"/>

    <!-- 日志輸出級(jí)別,logback日志級(jí)別包括五個(gè):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>	還可以將這個(gè)包下的所有的類(lèi)的全部自動(dòng)起別名,別名就是簡(jiǎn)名,不區(qū)分大小寫(xiě) -->
        <package name="com.rainbowsea.mybatis.pojo"/>
    </typeAliases>
    <environments default="mybatis">

        <environment id="mybatis">
            <!--            MANAGED 沒(méi)有用第三框架管理的話(huà),都是會(huì)被提交的,沒(méi)有事務(wù)上的管理了 -->
            <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 包名掃描,但是同樣的:對(duì)應(yīng)接口路徑要一致,接口名一致-->
        <mapper resource="CarMapper.xml"></mapper>
    </mappers>
</configuration>

對(duì)照 t_car 創(chuàng)建的ORM 映射的 Car 類(lèi)

注意:在MyBatis 當(dāng)中對(duì)應(yīng)的ORM ,一般在框架里對(duì)應(yīng)的 Bean實(shí)體類(lèi),一定要實(shí)現(xiàn)該 set 和 get 方法以及無(wú)參數(shù)構(gòu)造方法,無(wú)法框架無(wú)法使用反射機(jī)制,進(jìn)行操作 。

建議用包裝類(lèi),這樣可以防止 Null的問(wèn)題,因?yàn)椋ê?jiǎn)單類(lèi)型 int num = null ,是不可以賦值為 null)的編譯無(wú)法通過(guò)

package com.rainbowsea.mybatis.pojo;

public class Car {
    // 數(shù)據(jù)庫(kù)表當(dāng)中的字段應(yīng)該和pojo類(lèi)的屬性一一對(duì)應(yīng)
    // 建議使用包裝類(lèi),這樣可以防止null的問(wèn)題
    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;
    }
}

對(duì)應(yīng)操作實(shí)現(xiàn)CRUD(增刪改查)的接口(這里是:CarMapper接口),在MyBtis 當(dāng)中 ,關(guān)于 CRUD(增刪改查)操作的接口/實(shí)現(xiàn)類(lèi),都是 mapper 結(jié)尾的作為持久層,而在 MVC的三層架構(gòu)中,則是以 dao 為后綴作為CRUD(增刪改查)操作的接口/實(shí)現(xiàn)類(lèi)。

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


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


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


    /**
     * 根據(jù)id查詢(xún)汽車(chē)信息
     * @param id
     * @return
     */
    Car selectById(Long id);


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

2.insert 增加操作

對(duì)應(yīng) CarMapper 接口中的 insert( ) 抽象方法。

public interface CarMapper {

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

對(duì)應(yīng) CarMapper.xml SQL語(yǔ)句映射文件,上編寫(xiě) insert 插入的 SQL語(yǔ)句。

<?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 一定要是:對(duì)應(yīng)的接口的全限定類(lèi)名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">

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

</mapper>

Java當(dāng)中編程運(yùn)行程序:

注意:因?yàn)槭菍?duì)數(shù)據(jù)庫(kù)進(jìn)行了修改,所以需要 commit() 提交給數(shù)據(jù)庫(kù),以及 close() 關(guān)閉資源

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 對(duì)象
        // SQlsessionFactory對(duì)象,一個(gè)SqlSessionFactory對(duì)應(yīng)一個(gè) environment, 一個(gè)environment通常是一個(gè)數(shù)據(jù)庫(kù)
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        int count = mapper.insert(car);

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


    }
}

3.delete 刪除操作

根據(jù) id 刪除一條記錄,刪除id為 124的一條記錄。

對(duì)應(yīng) CarMapper 接口中的 deleteById( Long id) 抽象方法。

public interface CarMapper {


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


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

對(duì)應(yīng) CarMapper.xml SQL語(yǔ)句映射文件,上編寫(xiě) delete 刪除的 SQL語(yǔ)句。

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)接口的全限定名稱(chēng)一致,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 一定要是:對(duì)應(yīng)的接口的全限定類(lèi)名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


<!--    如果只有一個(gè)參數(shù)需要傳的話(huà),#{} 括號(hào)中的值,可以隨便寫(xiě),但最后見(jiàn)名知意-->
    <delete id="deleteById" >
        delete from t_car where id=#{id}
    </delete>
</mapper>

Java當(dāng)中編程運(yùn)行程序:

注意:因?yàn)槭菍?duì)數(shù)據(jù)庫(kù)進(jìn)行了修改,所以需要 commit() 提交給數(shù)據(jù)庫(kù),以及 close() 關(guān)閉資源

刪除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 對(duì)象
        // SQlsessionFactory對(duì)象,一個(gè)SqlSessionFactory對(duì)應(yīng)一個(gè) environment, 一個(gè)environment通常是一個(gè)數(shù)據(jù)庫(kù)
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);

        // 刪除id為 124的一條記錄。
        int count = mapper.deleteById(124L);
        sqlSession.commit(); // 提交給數(shù)據(jù)庫(kù)
        sqlSession.close(); // 關(guān)閉資源
        System.out.println(count);

    }
}

4.update 修改操作

根據(jù) id 修改記錄信息。

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

對(duì)應(yīng) CarMapper 接口中的 update( ) 抽象方法。

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.Car;

import java.util.List;

public interface CarMapper {


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

}

對(duì)應(yīng) CarMapper.xml SQL語(yǔ)句映射文件,上編寫(xiě) update 修改的 SQL語(yǔ)句。

使用以上代碼的前提是:XxxMapper.xml 文件中的 namespace 必須和 dao(mapper)接口的全限定名稱(chēng)一致,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 一定要是:對(duì)應(yīng)的接口的全限定類(lèi)名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


    <!--	id 要是 namespace 對(duì)應(yīng)接口上的方法名: -->
    <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當(dāng)中編程運(yùn)行程序:

注意:因?yàn)槭菍?duì)數(shù)據(jù)庫(kù)進(jìn)行了修改,所以需要 commit() 提交給數(shù)據(jù)庫(kù),以及 close() 關(guān)閉資源

將 id 為 128的 brand 改為小米su7, guide_price 改為 21.00 , 時(shí)間改為 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 對(duì)象
        // SQlsessionFactory對(duì)象,一個(gè)SqlSessionFactory對(duì)應(yīng)一個(gè) environment, 一個(gè)environment通常是一個(gè)數(shù)據(jù)庫(kù)
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(128L, "999", "小米su7", 21.0, "2022-03-28", "新能源");
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        int count = mapper.update(car);
        sqlSession.commit(); // 提交給數(shù)據(jù)庫(kù)
        sqlSession.close();



    }
}

5.select 查詢(xún)一條記錄操作

根據(jù) id 查詢(xún)一條記錄。

查詢(xún) id 為 130 的一條記錄。

對(duì)應(yīng) CarMapper 接口中的 selectById ( Long id) 抽象方法。

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.Car;

import java.util.List;

public interface CarMapper {



    /**
     * 根據(jù)id查詢(xún)汽車(chē)信息
     * @param id
     * @return
     */
    Car selectById(Long id);

}

對(duì)應(yīng) CarMapper.xml SQL語(yǔ)句映射文件,上編寫(xiě) select 查詢(xún) 的 SQL語(yǔ)句。

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

需要注意的是:查詢(xún)是會(huì)返回結(jié)果集的,所以我們需要在 <select> 查詢(xún)標(biāo)簽當(dāng)中,通過(guò) resultType 屬性指定返回的類(lèi)型(如果沒(méi)有用別名機(jī)制的話(huà),要用全限定類(lèi)名(帶包名的)) 。

同時(shí)由于我們的數(shù)據(jù)表的字段的命名方式是下劃線(xiàn) ,部分?jǐn)?shù)據(jù)表的字段名與我們?cè)O(shè)置的 ORM 映射的POJO類(lèi)的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無(wú)法將對(duì)應(yīng)數(shù)據(jù)表中的值,賦值到 對(duì)應(yīng)的 POJO的類(lèi)當(dāng)中(這里是 Car 類(lèi)當(dāng)中)

<?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 一定要是:對(duì)應(yīng)的接口的全限定類(lèi)名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


    <!--	id 要是 namespace 對(duì)應(yīng)接口上的方法名: -->
    <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當(dāng)中編程運(yùn)行程序:

注意:因?yàn)槲覀儍H僅是查詢(xún)數(shù)據(jù)表中的信息,不涉及到對(duì)數(shù)據(jù)表的修改,刪除操作,所以無(wú)需提交數(shù)據(jù)庫(kù)commit,只要 close() 關(guān)閉資源就可以了

查詢(xún) 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 對(duì)象
        // SQlsessionFactory對(duì)象,一個(gè)SqlSessionFactory對(duì)應(yīng)一個(gè) environment, 一個(gè)environment通常是一個(gè)數(shù)據(jù)庫(kù)
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car = mapper.selectById(130L);
        System.out.println(car);
        sqlSession.close();
    }
}

6.select 查詢(xún)多條記錄操作

查詢(xún)t_car 數(shù)據(jù)表中的所有信息。

對(duì)應(yīng) CarMapper 接口中的 selectAll( Long id) 抽象方法。返回的是一個(gè)List 集合

package com.rainbowsea.mybatis.mapper;
import com.rainbowsea.mybatis.pojo.Car;
import java.util.List;
public interface CarMapper {

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

對(duì)應(yīng) CarMapper.xml SQL語(yǔ)句映射文件,上編寫(xiě) select 查詢(xún) 的 SQL語(yǔ)句。

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

需要注意的是:查詢(xún)是會(huì)返回結(jié)果集的,所以我們需要在 <select> 查詢(xún)標(biāo)簽當(dāng)中,通過(guò) resultType 屬性指定返回的類(lèi)型(如果沒(méi)有用別名機(jī)制的話(huà),要用全限定類(lèi)名(帶包名的)) 。

同時(shí)由于我們的數(shù)據(jù)表的字段的命名方式是下劃線(xiàn) ,部分?jǐn)?shù)據(jù)表的字段名與我們?cè)O(shè)置的 ORM 映射的POJO類(lèi)的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無(wú)法將對(duì)應(yīng)數(shù)據(jù)表中的值,賦值到 對(duì)應(yīng)的 POJO的類(lèi)當(dāng)中(這里是 Car 類(lèi)當(dāng)中)

<?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 一定要是:對(duì)應(yīng)的接口的全限定類(lèi)名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.CarMapper">


    <!--	id 要是 namespace 對(duì)應(yīng)接口上的方法名: -->
    <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當(dāng)中編程運(yùn)行程序:

注意:因?yàn)槲覀儍H僅是查詢(xún)數(shù)據(jù)表中的信息,不涉及到對(duì)數(shù)據(jù)表的修改,刪除操作,所以無(wú)需提交數(shù)據(jù)庫(kù)commit,只要 close() 關(guān)閉資源就可以了

查詢(xún) t_car 數(shù)據(jù)表中的所有記錄。

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 對(duì)象
        // SQlsessionFactory對(duì)象,一個(gè)SqlSessionFactory對(duì)應(yīng)一個(gè) environment, 一個(gè)environment通常是一個(gè)數(shù)據(jù)庫(kù)
        SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis");
        // 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        List<Car> cars = mapper.selectAll();
        cars.forEach(car -> {
            System.out.println(car);
        });

        sqlSession.close();
    }
}

總結(jié)

		// 獲取到 SalSession 會(huì)話(huà),一次會(huì)話(huà)一個(gè)
        SqlSession sqlSession = sessionFactory.openSession();
        Car car = new Car(null, "999", "奧迪", 3.0, "2000-10-10", "新能源");
        // 面向接口編程,獲取接口的代理對(duì)象,也就是接口的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)該接口中的方法
		// 需要注意的是參數(shù)的 Xxxmapper.class 和 返回值是保持一致的。
        XxxMapper mapper = sqlSession.getMapper(XxxMapper.class);
		mapper.xxx(); // 執(zhí)行的是該XxxMapper接口中的方法

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

注意:因?yàn)槭菍?duì)數(shù)據(jù)庫(kù)進(jìn)行了修改,刪除,改動(dòng)了,所以需要 commit() 提交給數(shù)據(jù)庫(kù),以及 close() 關(guān)閉資源

需要注意的是:查詢(xún)是會(huì)返回結(jié)果集的,所以我們需要在 <select> 查詢(xún)標(biāo)簽當(dāng)中,通過(guò) resultType 屬性指定返回的類(lèi)型(如果沒(méi)有用別名機(jī)制的話(huà),要用全限定類(lèi)名(帶包名的)) 。

同時(shí)由于我們的數(shù)據(jù)表的字段的命名方式是下劃線(xiàn) ,部分?jǐn)?shù)據(jù)表的字段名與我們?cè)O(shè)置的 ORM 映射的POJO類(lèi)的屬性名不一致,需要將他們二者的名字保持一致,所以我們需要使用 AS 定義別名,不然無(wú)法將對(duì)應(yīng)數(shù)據(jù)表中的值,賦值到 對(duì)應(yīng)的 POJO的類(lèi)當(dāng)中(這里是 Car 類(lèi)當(dāng)中)

注意:因?yàn)槲覀儍H僅是查詢(xún)數(shù)據(jù)表中的信息,不涉及到對(duì)數(shù)據(jù)表的修改,刪除操作,所以無(wú)需提交數(shù)據(jù)庫(kù)commit,只要 close() 關(guān)閉資源就可以了。

如果只有一個(gè)參數(shù)需要傳的話(huà),#{} 括號(hào)中的值,可以隨便寫(xiě)(#{}括號(hào)的值不能空著,不然不編譯無(wú)法通過(guò)),但最好見(jiàn)名知意。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java的動(dòng)態(tài)分派和靜態(tài)分派的實(shí)現(xiàn)

    Java的動(dòng)態(tài)分派和靜態(tài)分派的實(shí)現(xiàn)

    這篇文章主要介紹了Java的動(dòng)態(tài)分派和靜態(tài)分派的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • SpringBoot實(shí)現(xiàn)類(lèi)似鉤子函數(shù)的方法

    SpringBoot實(shí)現(xiàn)類(lèi)似鉤子函數(shù)的方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)類(lèi)似鉤子函數(shù)的方法,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-04-04
  • springboot logback調(diào)整mybatis日志級(jí)別無(wú)效的解決

    springboot logback調(diào)整mybatis日志級(jí)別無(wú)效的解決

    這篇文章主要介紹了springboot logback調(diào)整mybatis日志級(jí)別無(wú)效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • SpringBoot?AOP?Redis實(shí)現(xiàn)延時(shí)雙刪功能實(shí)戰(zhàn)

    SpringBoot?AOP?Redis實(shí)現(xiàn)延時(shí)雙刪功能實(shí)戰(zhàn)

    本文主要介紹了SpringBoot?AOP?Redis實(shí)現(xiàn)延時(shí)雙刪功能實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 使用java執(zhí)行定時(shí)任務(wù)示例

    使用java執(zhí)行定時(shí)任務(wù)示例

    這篇文章主要介紹了使用java執(zhí)行定時(shí)任務(wù)示例,需要的朋友可以參考下
    2014-04-04
  • Springboot整合Swagger3全注解配置(springdoc-openapi-ui)

    Springboot整合Swagger3全注解配置(springdoc-openapi-ui)

    本文主要介紹了Springboot整合Swagger3全注解配置(springdoc-openapi-ui),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • springboot指定profiles啟動(dòng)失敗問(wèn)題及解決

    springboot指定profiles啟動(dòng)失敗問(wèn)題及解決

    這篇文章主要介紹了springboot指定profiles啟動(dòng)失敗問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • springboot全局字符編碼設(shè)置解決亂碼問(wèn)題

    springboot全局字符編碼設(shè)置解決亂碼問(wèn)題

    這篇文章主要介紹了springboot全局字符編碼設(shè)置解決亂碼問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Java拋出和聲明異常的代碼實(shí)現(xiàn)

    詳解Java拋出和聲明異常的代碼實(shí)現(xiàn)

    我們?cè)诰帉?xiě)代碼時(shí),有時(shí)候因?yàn)槟承┰?并不想在這個(gè)方法中立即處理產(chǎn)生的異常,也就是說(shuō)并不想進(jìn)行異常的捕獲,接下來(lái)小編就來(lái)教會(huì)大家該如何進(jìn)行異常的拋出,需要的朋友可以參考下
    2023-08-08
  • Java編程倒計(jì)時(shí)實(shí)現(xiàn)方法示例

    Java編程倒計(jì)時(shí)實(shí)現(xiàn)方法示例

    這篇文章主要介紹了Java編程倒計(jì)時(shí)實(shí)現(xiàn)的三個(gè)示例,三種實(shí)現(xiàn)方法,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09

最新評(píng)論