亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

作者丨武哥

來源丨武哥聊編程

1. MyBatis 介紹

大家都知道,MyBatis 框架是一個(gè)持久層框架,是 Apache 下的頂級項(xiàng)目。Mybatis 可以讓開發(fā)者的主要精力放在 sql 上,通過 Mybatis 提供的映射方式,自由靈活的生成滿足需要的 sql 語句。使用簡單的 XML 或注解來配置和映射原生信息,將接口和 JAVA 的 POJOs 映射成數(shù)據(jù)庫中的記錄,在國內(nèi)可謂是占據(jù)了半壁江山。本文主要通過兩種方式來對 Spring Boot 集成 MyBatis 做一講解。重點(diǎn)講解一下基于注解的方式。因?yàn)閷?shí)際項(xiàng)目中使用注解的方式更多一點(diǎn),更簡潔一點(diǎn),省去了很多 xml 配置(這不是絕對的,有些項(xiàng)目組中可能也在使用 xml 的方式)。

2. MyBatis 的配置

2.1 依賴導(dǎo)入

Spring Boot 集成 MyBatis,需要導(dǎo)入 mybatis-spring-boot-starter 和 MySQL 的依賴,這里我們使用的版本時(shí) 1.3.2,如下:

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.2</version>
</dependency>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
</dependency>

我們點(diǎn)開 mybatis-spring-boot-starter 依賴,可以看到我們之前使用 Spring 時(shí)候熟悉的依賴,就像我在課程的一開始介紹的那樣,Spring Boot 致力于簡化編碼,使用 starter 系列將相關(guān)依賴集成在一起,開發(fā)者不需要關(guān)注繁瑣的配置,非常方便。

<!-- 省去其他 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
</dependency>

2.2 properties.yml配置

我們再來看一下,集成 MyBatis 時(shí)需要在 properties.yml 配置文件中做哪些基本配置呢?

# 服務(wù)端口號(hào)
server:
  port: 8080

# 數(shù)據(jù)庫地址
datasource:
  url: localhost:3306/blog_test

spring:
  datasource: # 數(shù)據(jù)庫配置
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://${datasource.url}?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
    username: root
    password: 123456
    hikari:
      maximum-pool-size: 10 # 最大連接池?cái)?shù)
      max-lifetime: 1770000

mybatis:
  # 指定別名設(shè)置的包為所有entity
  type-aliases-package: com.itcodai.course10.entity
  configuration:
    map-underscore-to-camel-case: true # 駝峰命名規(guī)范
  mApper-locations: # mapper映射文件位置
    - classpath:mapper/*.xml

我們來簡單介紹一下上面的這些配置:關(guān)于數(shù)據(jù)庫的相關(guān)配置,我就不詳細(xì)的解說了,這點(diǎn)相信大家已經(jīng)非常熟練了,配置一下用戶名、密碼、數(shù)據(jù)庫連接等等,這里使用的連接池是 Spring Boot 自帶的 hikari,感興趣的朋友可以去百度或者谷歌搜一搜,了解一下。

這里說明一下 map-underscore-to-camel-case: true, 用來開啟駝峰命名規(guī)范,這個(gè)比較好用,比如數(shù)據(jù)庫中字段名為:user_name, 那么在實(shí)體類中可以定義屬性為 userName (甚至可以寫成 username,也能映射上),會(huì)自動(dòng)匹配到駝峰屬性,如果不這樣配置的話,針對字段名和屬性名不同的情況,會(huì)映射不到。

3. 基于 xml 的整合

使用原始的 xml 方式,需要新建 UserMapper.xml 文件,在上面的 application.yml 配置文件中,我們已經(jīng)定義了 xml 文件的路徑:classpath:mapper/*.xml,所以我們在 resources 目錄下新建一個(gè) mapper 文件夾,然后創(chuàng)建一個(gè) UserMapper.xml 文件。

<?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">
<mapper namespace="com.itcodai.course10.dao.UserMapper">
  <resultMap id="BaseResultMap" type="com.itcodai.course10.entity.User">

    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="user_name" jdbcType="VARCHAR" property="username" />
    <result column="password" jdbcType="VARCHAR" property="password" />
  </resultMap>
  
   <select id="getUserByName" resultType="User" parameterType="String">
       select * from user where user_name = #{username}
  </select>
</mapper>

這和整合 Spring 一樣的,namespace 中指定的是對應(yīng)的 Mapper, <resultMap> 中指定對應(yīng)的實(shí)體類,即 User。然后在內(nèi)部指定表的字段和實(shí)體的屬性相對應(yīng)即可。這里我們寫一個(gè)根據(jù)用戶名查詢用戶的 sql。

實(shí)體類中有 id,username 和 password,我不在這貼代碼,大家可以下載源碼查看。UserMapper.java 文件中寫一個(gè)接口即可:

User getUserByName(String username);

中間省略 service 的代碼,我們寫一個(gè) Controller 來測試一下:

@RestController
public class TestController {

    @Resource
    private UserService userService;
    
    @RequestMapping("/getUserByName/{name}")
    public User getUserByName(@PathVariable String name) {
        return userService.getUserByName(name);
    }
}

啟動(dòng)項(xiàng)目,在瀏覽器中輸入:http://localhost:8080/getUserByName/CSDN 即可查詢到數(shù)據(jù)庫表中用戶名為 CSDN 的用戶信息(事先搞兩個(gè)數(shù)據(jù)進(jìn)去即可):

{"id":2,"username":"CSDN","password":"123456"}

這里需要注意一下:Spring Boot 如何知道這個(gè) Mapper 呢?一種方法是在上面的 mapper 層對應(yīng)的類上面添加 @Mapper 注解即可,但是這種方法有個(gè)弊端,當(dāng)我們有很多個(gè) mapper 時(shí),那么每一個(gè)類上面都得添加 @Mapper 注解。另一種比較簡便的方法是在 Spring Boot 啟動(dòng)類上添加@MaperScan 注解,來掃描一個(gè)包下的所有 mapper。如下:

@SpringBootApplication
@MapperScan("com.itcodai.course10.dao")
public class Course10Application {

 public static void main(String[] args) {
  SpringApplication.run(Course10Application.class, args);
 }
}

這樣的話,com.itcodai.course10.dao 包下的所有 mapper 都會(huì)被掃描到了。

4. 基于注解的整合

基于注解的整合就不需要 xml 配置文件了,MyBatis 主要提供了 @Select, @Insert, @Update, Delete 四個(gè)注解。這四個(gè)注解是用的非常多的,也很簡單,注解后面跟上對應(yīng)的 sql 語句即可,我們舉個(gè)例子:

@Select("select * from user where id = #{id}")
User getUser(Long id);

這跟 xml 文件中寫 sql 語句是一樣的,這樣就不需要 xml 文件了,但是有個(gè)問題,有人可能會(huì)問,如果是兩個(gè)參數(shù)呢?如果是兩個(gè)參數(shù),我們需要使用 @Param 注解來指定每一個(gè)參數(shù)的對應(yīng)關(guān)系,如下:

@Select("select * from user where id = #{id} and user_name=#{name}")
User getUserByIdAndName(@Param("id") Long id, @Param("name") String username);

可以看出,@Param 指定的參數(shù)應(yīng)該要和 sql 中 #{} 取的參數(shù)名相同,不同則取不到。可以在 controller 中自行測試一下,接口都在源碼中,文章中我就不貼測試代碼和結(jié)果了。

有個(gè)問題需要注意一下,一般我們在設(shè)計(jì)表字段后,都會(huì)根據(jù)自動(dòng)生成工具生成實(shí)體類,這樣的話,基本上實(shí)體類是能和表字段對應(yīng)上的,最起碼也是駝峰對應(yīng)的,由于在上面配置文件中開啟了駝峰的配置,所以字段都是能對的上的。但是,萬一有對不上的呢?我們也有解決辦法,使用 @Results 注解來解決。

@Select("select * from user where id = #{id}")
@Results({
        @Result(property = "username", column = "user_name"),
        @Result(property = "password", column = "password")
})
User getUser(Long id);

@Results 中的 @Result 注解是用來指定每一個(gè)屬性和字段的對應(yīng)關(guān)系,這樣的話就可以解決上面說的這個(gè)問題了。

當(dāng)然了,我們也可以 xml 和注解相結(jié)合使用,目前我們實(shí)際的項(xiàng)目中也是采用混用的方式,因?yàn)橛袝r(shí)候 xml 方便,有時(shí)候注解方便,比如就上面這個(gè)問題來說,如果我們定義了上面的這個(gè) UserMapper.xml,那么我們完全可以使用 @ResultMap 注解來替代 @Results 注解,如下:

@Select("select * from user where id = #{id}")
@ResultMap("BaseResultMap")
User getUser(Long id);

@ResultMap 注解中的值從哪來呢?對應(yīng)的是 UserMapper.xml 文件中定義的 <resultMap> 時(shí)對應(yīng)的 id 值:

<resultMap id="BaseResultMap" type="com.itcodai.course10.entity.User">

這種 xml 和注解結(jié)合著使用的情況也很常見,而且也減少了大量的代碼,因?yàn)?xml 文件可以使用自動(dòng)生成工具去生成,也不需要人為手動(dòng)敲,所以這種使用方式也很常見。

5. 總結(jié)

本節(jié)主要系統(tǒng)的講解了 Spring Boot 集成 MyBatis 的過程,分為基于 xml 形式和基于注解的形式來講解,通過實(shí)際配置手把手講解了 Spring Boot 中 MyBatis 的使用方式,并針對注解方式,講解了常見的問題已經(jīng)解決方式,有很強(qiáng)的實(shí)戰(zhàn)意義。在實(shí)際項(xiàng)目中,建議根據(jù)實(shí)際情況來確定使用哪種方式,一般 xml 和注解都在用。

分享到:
標(biāo)簽:MyBatis
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定