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

如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫

 更新時(shí)間:2023年11月09日 10:05:20   作者:Miaow.Y.Hu  
MyBatis可以通過簡單的XML或者注解來配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫中記錄,使用MyBatis幫助我們解決各種問題,本文介紹如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫,感興趣的朋友一起看看吧

MyBatis,這個(gè)對(duì)各位使用Java開發(fā)的開發(fā)者來說還是蠻重要的,我相信諸位在企業(yè)開發(fā)項(xiàng)目的時(shí)候,大多數(shù)采用的是Mybatis。使用MyBatis幫助我們解決各種問題,實(shí)際上這篇文章,基本上默認(rèn)為可以跳過的一篇,但是為了Spring Boot的系列,我還是寫了這篇文章。

MyBatis

作為一個(gè)在Hibernate之后出現(xiàn)的持久層框架,因?yàn)樗С肿远xSQL,存儲(chǔ)過程以及高級(jí)映射,MyBatis免除了幾乎所有的JDBC代碼,以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis可以通過簡單的XML或者注解來配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫中記錄。

MyBatis官網(wǎng): https://mybatis.org/mybatis-3/zh/index.html

引入依賴

<!--MyBatis依賴-->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.1</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.3.0.0</version>
            <scope>compile</scope>
        </dependency>

這里說明一下,MyBatis的版本和Java JDK和Spring Boot的版本是有要求的:
2.1.x版本適用于:MyBatis 3.5+、Java 8+、Spring Boot 2.1+
2.0.x版本適用于:MyBatis 3.5+、Java 8+、Spring Boot 2.0/2.1
1.3.x版本適用于:MyBatis 3.4+、Java 6+、Spring Boot 1.5

配置Application文件

接下來,我們配置Spring Boot的自帶的application配置文件:

# MySQL
#spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
#spring.datasource.username=root
#spring.datasource.password=123456
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=1001
# Oracle
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

這是我的Oracle表結(jié)構(gòu):

在這里插入圖片描述

MySQL表結(jié)構(gòu):

CREATE TABLE `User` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

接下來創(chuàng)建User表的映射對(duì)象,也是我們通用的實(shí)體類對(duì)象:

public class User {
    private Long id;
    private String name;
    private Integer age;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public User() {
    }
}

在有了實(shí)體類對(duì)象,并且和數(shù)據(jù)庫的字段一一對(duì)應(yīng)后,就可以在接口紅定義相關(guān)對(duì)數(shù)據(jù)庫表的操作了,這里舉例,一個(gè)是查詢,一個(gè)是插入,用于后續(xù)單元測(cè)試的驗(yàn)證。

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM USER WHERE NAME = #{name}")
    User findByName(@Param("name") String name);
    @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
    int insert(@Param("name") String name, @Param("age") Integer age);
}

接下來創(chuàng)建一個(gè)單元測(cè)試類,插入一條數(shù)據(jù),然后利用這條數(shù)據(jù)的相關(guān)屬性進(jìn)行查詢,并且判斷相關(guān)屬性是否滿足。
注意,測(cè)試結(jié)束后,對(duì)數(shù)據(jù)進(jìn)行回滾操作,保證單元測(cè)試每次運(yùn)行的數(shù)據(jù)環(huán)境獨(dú)立。

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class ApplicationTests {
    @Autowired
    private UserMapper userMapper;
    @Test
    @Rollback
    public void test() throws Exception {
        userMapper.insert("AAA", 20);
        User u = userMapper.findByName("AAA");
        Assert.assertEquals(20, u.getAge().intValue());
    }
}

對(duì)于注解配置進(jìn)行說明介紹

@Mapper:用于標(biāo)注Mapper接口,表示該接口是MyBatis的Mapper映射接口。在Spring Boot項(xiàng)目中,可以使用@MapperScan注解掃描指定包下的Mapper接口,并將其注冊(cè)為Bean。

@Select:用于標(biāo)注查詢語句,指定SQL語句或調(diào)用Mapper XML文件中的對(duì)應(yīng)SQL語句。可以通過value屬性指定SQL語句,也可以通過provider屬性指定動(dòng)態(tài)SQL提供者類。

@Insert、@Update、@Delete:分別用于標(biāo)注插入、更新和刪除語句,使用方式與@Select類似。

@Result、@Results:用于標(biāo)注結(jié)果集映射關(guān)系。@Result用于標(biāo)注單個(gè)字段或?qū)傩耘c結(jié)果集列的映射關(guān)系,@Results用于標(biāo)注多個(gè)@Result。

@Param:用于標(biāo)注方法參數(shù),指定參數(shù)在SQL語句中的名稱。在SQL語句中可以通過#{參數(shù)名}的方式引用該參數(shù)。

@Options:用于配置一些選項(xiàng),例如設(shè)置主鍵生成策略、返回自增主鍵等。

@ResultMap:用于標(biāo)注結(jié)果集映射配置的ID,可以在其他地方通過@ResultMap引用該結(jié)果集映射。

@One、@Many:用于標(biāo)注一對(duì)一和一對(duì)多的關(guān)聯(lián)關(guān)系。

@CacheNamespace:用于開啟二級(jí)緩存,將Mapper的查詢結(jié)果緩存到內(nèi)存中,提高查詢性能。

注解使用對(duì)象相對(duì)應(yīng)的 XML描述
@Insert @Update @Delete @Select 方法<insert><update><delete><select>這四個(gè)注解分別代表將會(huì)被執(zhí)行的 SQL 語句。它們用字符串?dāng)?shù)組(或單個(gè)字符串)作為參數(shù)。如果傳遞的是字符串?dāng)?shù)組,字符串之間先會(huì)被填充一個(gè)空格再連接成單個(gè)完整的字符串。這有效避免了以 Java 代碼構(gòu)建 SQL 語句時(shí)的“丟失空格”的問題。然而,你也可以提前手動(dòng)連接好字符串。屬性有:value,填入的值是用來組成單個(gè) SQL 語句的字符串?dāng)?shù)組。
@Options方法映射語句的屬性這個(gè)注解提供訪問大范圍的交換和配置選項(xiàng)的入口,它們通常在映射語句上作為屬性出現(xiàn)。Options 注解提供了通俗易懂的方式來訪問它們,而不是讓每條語句注解變復(fù)雜。屬性有:useCache=true, flushCache=FlushCachePolicy.DEFAULT, resultSetType=FORWARD_ONLY, statementType=PREPARED, fetchSize=-1, timeout=-1, useGeneratedKeys=false, keyProperty="id", keyColumn="", resultSets=""。值得一提的是, Java 注解無法指定 null 值。因此,一旦你使用了 Options 注解,你的語句就會(huì)被上述屬性的默認(rèn)值所影響。要注意避免默認(rèn)值帶來的預(yù)期以外的行為。注意: keyColumn 屬性只在某些數(shù)據(jù)庫中有效(如 Oracle、PostgreSQL等)。請(qǐng)?jiān)诓迦胝Z句一節(jié)查看更多關(guān)于 keyColumn 和 keyProperty 兩者的有效值詳情。
@MapKey方法這是一個(gè)用在返回值為 Map 的方法上的注解。它能夠?qū)⒋娣艑?duì)象的 List 轉(zhuǎn)化為 key 值為對(duì)象的某一屬性的 Map。屬性有: value,填入的是對(duì)象的屬性名,作為 Map 的 key 值。
@SelectKey方法<selectKey>這個(gè)注解的功能與 <selectKey> 標(biāo)簽完全一致,用在已經(jīng)被 @Insert @InsertProvider@Update @UpdateProvider 注解了的方法上。若在未被上述四個(gè)注解的方法上作 @SelectKey 注解則視為無效。如果你指定了 @SelectKey 注解,那么 MyBatis 就會(huì)忽略掉由 @Options 注解所設(shè)置的生成主鍵或設(shè)置(configuration)屬性。屬性有:statement 填入將會(huì)被執(zhí)行的 SQL 字符串?dāng)?shù)組,keyProperty 填入將會(huì)被更新的參數(shù)對(duì)象的屬性的值,before 填入 true 或 false 以指明 SQL 語句應(yīng)被在插入語句的之前還是之后執(zhí)行。resultType 填入 keyProperty 的 Java 類型和用 Statement、 PreparedStatementCallableStatement 中的 STATEMENT、 PREPARED 或 CALLABLE 中任一值填入 statementType。默認(rèn)值是 PREPARED。
@Param參數(shù)N/A如果你的映射方法的形參有多個(gè),這個(gè)注解使用在映射方法的參數(shù)上就能為它們?nèi)∽远x名字。若不給出自定義名字,多參數(shù)(不包括 RowBounds 參數(shù))則先以 “param” 作前綴,再加上它們的參數(shù)位置作為參數(shù)別名。例如 #{param1}, #{param2},這個(gè)是默認(rèn)值。如果注解是 @Param(“person”),那么參數(shù)就會(huì)被命名為 #{person}。
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider方法<insert> <update> <delete> <select>允許構(gòu)建動(dòng)態(tài) SQL。這些備選的 SQL 注解允許你指定類名和返回在運(yùn)行時(shí)執(zhí)行的 SQL 語句的方法。(自從MyBatis 3.4.6開始,你可以用 CharSequence 代替 String 來返回類型返回值了。)當(dāng)執(zhí)行映射語句的時(shí)候,MyBatis 會(huì)實(shí)例化類并執(zhí)行方法,類和方法就是填入了注解的值。你可以把已經(jīng)傳遞給映射方法了的對(duì)象作為參數(shù),“Mapper interface type” 和 “Mapper method” 會(huì)經(jīng)過 ProviderContext (僅在MyBatis 3.4.5及以上支持)作為參數(shù)值。(MyBatis 3.4及以上的版本,支持多參數(shù)傳入)屬性有: type, method。type 屬性需填入類。method 需填入該類定義了的方法名。注意 接下來的小節(jié)將會(huì)討論類,能幫助你更輕松地構(gòu)建動(dòng)態(tài) SQL。

這里就圍繞@Param,Map聊聊。

@Param

我們?cè)趯?shí)際開發(fā)過程中,如果將SQL語句嵌套在接口的時(shí)候,我們經(jīng)常使用的方式就是這種:

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insert(@Param("name") String name, @Param("age") Integer age);

這種方式,我們都很少理解,@Param中定義的name對(duì)應(yīng)了SQL中的#{name},age對(duì)應(yīng)了SQL中的#{age}。

Map

除了以@Param注入,我們也可以通過Map<String,Object> 對(duì)象作為傳遞參數(shù)的容器:

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})")
int insertByMap(Map<String, Object> map);

得到如上代碼,那么我們應(yīng)該如何注入呢?

Map<String, Object> map = new HashMap<>();
map.put("name", "CCC");
map.put("age", 40);
userMapper.insertByMap(map);

如上,我們通過對(duì)map中填入同名的內(nèi)容就可以實(shí)現(xiàn)了。

使用對(duì)象注入

除去Map方式注入值外,我們也可以直接java對(duì)象直接作為查詢條件的傳參,比如我們可以直接使用User對(duì)象:

@Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
int insertByUser(User user);

利用MyBatis實(shí)現(xiàn)增刪改查

MyBatis針對(duì)不同的數(shù)據(jù)庫操作,分別提供了不同的注解進(jìn)行配置:

public interface UserMapper {
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findByName(@Param("name") String name);
    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    int insert(@Param("name") String name, @Param("age") Integer age);
    @Update("UPDATE user SET age=#{age} WHERE name=#{name}")
    void update(User user);
    @Delete("DELETE FROM user WHERE id =#{id}")
    void delete(Long id);
}

之后我們可以利用創(chuàng)建一個(gè)Test測(cè)試類,來實(shí)現(xiàn)我們的功能是否正常實(shí)現(xiàn):

@Transactional
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
	@Autowired
	private UserMapper userMapper;
	@Test
	@Rollback
	public void testUserMapper() throws Exception {
		// insert一條數(shù)據(jù),并select出來驗(yàn)證
		userMapper.insert("AAA", 20);
		User u = userMapper.findByName("AAA");
		Assert.assertEquals(20, u.getAge().intValue());
		// update一條數(shù)據(jù),并select出來驗(yàn)證
		u.setAge(30);
		userMapper.update(u);
		u = userMapper.findByName("AAA");
		Assert.assertEquals(30, u.getAge().intValue());
		// 刪除這條數(shù)據(jù),并select驗(yàn)證
		userMapper.delete(u.getId());
		u = userMapper.findByName("AAA");
		Assert.assertEquals(null, u);
	}
}

返回結(jié)果綁定

對(duì)于增、刪、改操作相對(duì)的數(shù)據(jù)也就變化較小,但是對(duì)于查我們就需要考慮的比較多了,怎么查,多表查,子查,并且查詢的結(jié)果也不在是我們經(jīng)常碰到的實(shí)體類對(duì)象了,往往需要返回一個(gè)與數(shù)據(jù)庫實(shí)體不同的包裝類,那么對(duì)于這樣的情況,我們可以通過@Result和@Result注解進(jìn)行綁定。

@Results({
    @Result(property = "name", column = "name"),
    @Result(property = "age", column = "age")
})
@Select("SELECT name, age FROM user")
List<User> findAll();

@Result中的property屬性對(duì)應(yīng)User對(duì)象中的成員名,column對(duì)應(yīng)SELECT出的字段名。在該配置中故意沒有查出id屬性,只對(duì)User對(duì)應(yīng)中的name和age對(duì)象做了映射配置,這樣可以通過下面的單元測(cè)試來驗(yàn)證查出的id為null,而其他屬性不為null:

@Test
@Rollback
public void testUserMapper() throws Exception {
	List<User> userList = userMapper.findAll();
	for(User user : userList) {
		Assert.assertEquals(null, user.getId());
		Assert.assertNotEquals(null, user.getName());
	}
}

到此這篇關(guān)于如何在Spring Boot中使用MyBatis訪問數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Spring Boot使用MyBatis訪問數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼

    Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼

    這篇文章主要介紹了Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java后端接收MultipartFile類型文件接口問題(帶參與不帶參)

    Java后端接收MultipartFile類型文件接口問題(帶參與不帶參)

    文章主要討論了后端處理文件上傳的方法,強(qiáng)調(diào)接收文件和參數(shù)的多種方式,并user文章主要討論了后端處理文件上傳的方法,強(qiáng)調(diào)接收文件和參數(shù)的多種方式,并提供了具體的代碼實(shí)現(xiàn)示例,個(gè)人經(jīng)驗(yàn)總結(jié):后端文件上傳處理,接收文件和參數(shù)的多種方式解析與代碼實(shí)現(xiàn)
    2026-05-05
  • 23種設(shè)計(jì)模式(14)java迭代器模式

    23種設(shè)計(jì)模式(14)java迭代器模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java迭代器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 教你用Java GUI實(shí)現(xiàn)文本文件的讀寫

    教你用Java GUI實(shí)現(xiàn)文本文件的讀寫

    今天帶大家來學(xué)習(xí)怎么用JavaSwing實(shí)現(xiàn)實(shí)現(xiàn)文本文件讀寫,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解Spring注解@Autowired的實(shí)現(xiàn)原理和使用方法

    詳解Spring注解@Autowired的實(shí)現(xiàn)原理和使用方法

    在使用Spring開發(fā)的時(shí)候,配置的方式主要有兩種,一種是xml的方式,另外一種是 java config的方式,在使用的過程中,我們使用最多的注解應(yīng)該就是@Autowired注解了,所以本文就給大家講講@Autowired注解是如何使用和實(shí)現(xiàn)的,需要的朋友可以參考下
    2023-07-07
  • java集合迭代器Iterator中的remove陷阱

    java集合迭代器Iterator中的remove陷阱

    這篇文章主要介紹了java集合迭代器Iterator中的remove陷阱,需要的朋友可以參考下
    2016-04-04
  • 使用IntelliJ IDEA查看類的繼承關(guān)系圖形(圖文詳解)

    使用IntelliJ IDEA查看類的繼承關(guān)系圖形(圖文詳解)

    這篇文章主要介紹了使用IntelliJ IDEA查看類的繼承關(guān)系圖形,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java?mapToInt()方法使用小結(jié)

    Java?mapToInt()方法使用小結(jié)

    本文介紹了Java?8中Stream?API中的mapToInt()方法,它可以將對(duì)象流轉(zhuǎn)換為整型流,從而方便地進(jìn)行求和、求平均值、求最大值/最小值等操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-11-11
  • Java實(shí)現(xiàn)將markdown轉(zhuǎn)換為html

    Java實(shí)現(xiàn)將markdown轉(zhuǎn)換為html

    最近因?yàn)轫?xiàng)目需求需要將AI輸出的結(jié)果導(dǎo)出到word中, 但AI輸出的格式為markdown格式,所以本文我們就來看看如何使用Java實(shí)現(xiàn)先將markdown轉(zhuǎn)換為html吧
    2025-11-11
  • SpringCloud的Config配置中心詳解

    SpringCloud的Config配置中心詳解

    這篇文章主要介紹了SpringCloud的Config配置中心詳解,SpringCloud Config為微服務(wù)架構(gòu)中的微服務(wù)提供集中化的外部配置支持,配置服務(wù)器為各個(gè)不同微服務(wù)應(yīng)用的所有環(huán)境提供了一個(gè)中心化的外部配置,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

齐齐哈尔市| 右玉县| 庆云县| 安泽县| 宜川县| 两当县| 万源市| 徐水县| 桐庐县| 清丰县| 莱阳市| 兴和县| 红原县| 雷波县| 扎囊县| 庆阳市| 扎赉特旗| 陵川县| 界首市| 凤台县| 绩溪县| 永年县| 台北县| 新晃| 呼和浩特市| 江川县| 芒康县| 湘潭县| 许昌市| 高尔夫| 裕民县| 田东县| 玉林市| 双牌县| 太原市| 夏津县| 邛崃市| 仁布县| 吴忠市| 平和县| 灌阳县|