一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Spring Boot (七): Mybatis極簡(jiǎn)配置

 新用戶(hù)32269360 2020-06-15

1. 前言

ORM 框架的目的是簡(jiǎn)化編程中的數(shù)據(jù)庫(kù)操作,經(jīng)過(guò)這么多年的發(fā)展,基本上活到現(xiàn)在的就剩下兩家了,一個(gè)是宣稱(chēng)可以不用寫(xiě) SQL 的 Hibernate ,一個(gè)是對(duì) SQL 非常友好的 Mybaties ,,兩者各有特點(diǎn),在企業(yè)級(jí)系統(tǒng)開(kāi)發(fā)中可以根據(jù)需求靈活使用。發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象:傳統(tǒng)企業(yè)大都喜歡使用 Hibernate ,互聯(lián)網(wǎng)行業(yè)通常使用 Mybatis 。

Hibernate 特點(diǎn)就是所有的 SQL 都用 Java 代碼來(lái)生成,不用跳出程序去寫(xiě)(看) SQL ,有著編程的完整性,發(fā)展到最頂端就是 Spring Data Jpa 這種模式了,基本上根據(jù)方法名就可以生成對(duì)應(yīng)的 SQL 了。

Mybatis 初期使用比較麻煩,需要各種配置文件、實(shí)體類(lèi)、Dao 層映射關(guān)聯(lián)、還有一大推其它配置。當(dāng)然 Mybatis 也發(fā)現(xiàn)了這種弊端,初期開(kāi)發(fā)了 generator 可以根據(jù)表結(jié)果自動(dòng)生產(chǎn)實(shí)體類(lèi)、配置文件和 Dao 層代碼,可以減輕一部分開(kāi)發(fā)量;后期也進(jìn)行了大量的優(yōu)化可以使用注解了,自動(dòng)管理 Dao 層和配置文件等,發(fā)展到最頂端就是今天要講的這種模式了,mybatis-spring-boot-starter 就是 Spring Boot + Mybatis 可以完全注解不用配置文件,也可以簡(jiǎn)單配置輕松上手。(了解源碼可+求求: 1791743380)

2. 工程實(shí)戰(zhàn)

首先創(chuàng)建父工程 spring-boot-mybatis,引入全局依賴(lài)包,如下:

代碼清單:spring-boot-mybatis/pom.xml


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.0</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency></dependencies>
  • mybatis-spring-boot-starter :目前最新版本為 2.1.0

2.1 極簡(jiǎn) xml 版

創(chuàng)建子工程 spring-boot-mybatis-xml

2.1.1 配置文件

application.yml 配置文件如下:

代碼清單:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/application.yml


server:  port: 8080spring:  application:    name: spring-boot-mybatis-xml  datasource:    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false    username: root    password: 123456    driver-class-name: com.mysql.cj.jdbc.Driver    type: com.zaxxer.hikari.HikariDataSource    hikari:      auto-commit: true      minimum-idle: 2      idle-timeout: 60000      connection-timeout: 30000      max-lifetime: 1800000      pool-name: DatebookHikariCP      maximum-pool-size: 5mybatis:  type-aliases-package: com.springboot.springbootmybatisxml.model  config-location: classpath:mybatis/mybatis-config.xml  mapper-locations: classpath:mybatis/mapper/*.xmlCOPY
  • 這里使用 hikari 作為數(shù)據(jù)庫(kù)連接池

  • Spring Boot 會(huì)自動(dòng)加載 spring.datasource.* 相關(guān)配置,數(shù)據(jù)源會(huì)自動(dòng)注入到 sqlSessionFactory 中, sqlSessionFactory 會(huì)自動(dòng)注入到 Mapper 中。

  • 這里需要指定基礎(chǔ)配置文件和實(shí)體類(lèi)映射文件的地址

mybatis-config.xml 配置文件如下:

代碼清單:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mybatis-config.xml


<configuration>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases></configuration>COPY

2.1.2 Mapper 映射文件

代碼清單:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/resources/mybatis/mapper/UserMapper.xml


<mapper namespace="com.springboot.springbootmybatisxml.mapper.UserMapper" >

    <resultMap id="BaseResultMap" type="com.springboot.springbootmybatisxml.model.User" >
        <id column="id" property="id" jdbcType="VARCHAR" />
        <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
        <result column="age" property="age" jdbcType="INTEGER" />
        <result column="create_date" property="createDate" jdbcType="TIME"/>
    </resultMap>

    <sql id="Base_Column_List" >
        id, nick_name, age, create_date    </sql>

    <select id="getAll" resultMap="BaseResultMap"  >
        SELECT            <include refid="Base_Column_List" />
        FROM user    </select>

    <select id="getUser" parameterType="java.lang.String" resultMap="BaseResultMap" >
        SELECT            <include refid="Base_Column_List" />
        FROM
            user
        WHERE id = #{id}    </select>

    <insert id="insertUser" parameterType="com.springboot.springbootmybatisxml.model.User">
        <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
            select uuid() as id from dual        </selectKey>
       INSERT INTO
            user
            (id, nick_name, age, create_date)
        VALUES
            (#{id}, #{nickName}, #{age}, #{createDate})    </insert>

    <update id="updateUser" parameterType="com.springboot.springbootmybatisxml.model.User">
        UPDATE
            user
        SET        <if test="nickName != null">nick_name = #{nickName},</if>
        <if test="age != null">age = #{age},</if>
        <if test="createDate != null">create_date = #{createDate}</if>
        WHERE
            id = #{id}    </update>

    <delete id="deleteUser" parameterType="java.lang.String">
       DELETE FROM
             user
       WHERE
             id = #{id}    </delete></mapper>COPY
  • namespace :需配置對(duì)應(yīng)的接口

  • 實(shí)現(xiàn)了簡(jiǎn)單的 CRUD 操作

  • 新增數(shù)據(jù)時(shí)選用 UUID 作為主鍵

  • 動(dòng)態(tài)條件可使用 <if> 標(biāo)簽作判斷

2.1.3 Mapper 層代碼

代碼清單:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/springboot/springbootmybatisxml/mapper/UserMapper.java


public interface UserMapper {    List<User> getAll();    User getUser(String id);    Long insertUser(User user);    Long updateUser(User user);    Long deleteUser(String id);
}COPY
  • 這里僅需定義接口方法, mybaties 會(huì)自動(dòng)幫我們調(diào)用 xml 映射文件中的代碼。

2.1.4 啟動(dòng)主類(lèi)

代碼清單:spring-boot-mybatis/spring-boot-mybatis-xml/src/main/java/com/springboot/springbootmybatisxml/SpringBootMybatisXmlApplication.java


@SpringBootApplication@MapperScan("com.springboot.springbootmybatisxml.mapper")public class SpringBootMybatisXmlApplication {    public static void main(String[] args) {
        SpringApplication.run(SpringBootMybatisXmlApplication.class, args);
    }

}COPY
  • 在啟動(dòng)主類(lèi)上配置 @MapperScan 或者直接在 Mapper 類(lèi)上增加注解 @Mapper ,兩種方法起到的結(jié)果是一樣的。不過(guò)建議選擇在啟動(dòng)主類(lèi)上配置 @MapperScan ,不然在每個(gè) Mapper 類(lèi)上加注解也麻煩,還容易漏加。

2.2 無(wú)配置文件注解版

2.2.1 配置

配置文件 application.yml 如下:

代碼清單:


mybatis:  type-aliases-package: com.springboot.springbootmybatisannotation.modelCOPY
  • 剩余部分和上面一致, mybatis 的配置僅需配置這一條足夠

2.2.2 Mapper 類(lèi)

注解版的核心就是這個(gè)類(lèi),所有的 SQL 都在這個(gè)類(lèi)里面,代碼如下:

代碼清單:


public interface UserMapper {    @Select("select * from user")    @Results({            @Result(property = "id", column = "id"),            @Result(property = "nickName", column = "nick_name"),            @Result(property = "age", column = "age"),            @Result(property = "createDate", column = "create_date")
    })    List<User> getAll();    @Select("SELECT * FROM user WHERE id = #{id}")    @Results({            @Result(property = "nickName", column = "nick_name")
    })    User getUser(String id);    @Insert("INSERT INTO user(id, nick_name, age, create_date) VALUES(#{id}, #{nickName}, #{age}, #{createDate})")    @SelectKey(keyProperty = "id", resultType = String.class, before = true, statement = "select uuid() as id from dual")    Long insertUser(User user);    @Update("UPDATE user SET nick_name = #{nickName}, age = #{age} WHERE create_date = #{createDate}")    Long updateUser(User user);    @Delete("DELETE FROM user WHERE id = #{id}")    Long deleteUser(String id);
}COPY
  • @Select 是查詢(xún)類(lèi)的注解,所有的查詢(xún)均使用這個(gè)

  • @Result 修飾返回的結(jié)果集,關(guān)聯(lián)實(shí)體類(lèi)屬性和數(shù)據(jù)庫(kù)字段一一對(duì)應(yīng),如果實(shí)體類(lèi)屬性和數(shù)據(jù)庫(kù)屬性名保持一致,就不需要這個(gè)屬性來(lái)修飾。

  • @Insert 插入數(shù)據(jù)庫(kù)使用,直接傳入實(shí)體類(lèi)會(huì)自動(dòng)解析屬性到對(duì)應(yīng)的值

  • @Update 負(fù)責(zé)修改,也可以直接傳入對(duì)象

  • @delete 負(fù)責(zé)刪除

注意:使用 # 符號(hào)和 $ 符號(hào)是不同的

#{}

使用 #{} 意味著使用的預(yù)編譯的語(yǔ)句,即在使用 jdbc 時(shí)的 preparedStatement , sql 語(yǔ)句中如果存在參數(shù)則會(huì)使用 ? 作占位符。

${}

使用 ${} 時(shí)的sql不會(huì)當(dāng)做字符串處理,是什么就是什么,如上邊的語(yǔ)句:select from table1 where id=${id} 在調(diào)用這個(gè)語(yǔ)句時(shí)控制臺(tái)打印的為:select from table1 where id=2 ,假設(shè)傳的參數(shù)值為2

從上邊的介紹可以看出這兩種方式的區(qū)別,最好是能用 #{} 則用它,可以防止 sql 注入,且是預(yù)編譯的,在需要原樣輸出時(shí)才使用 ${} 。

3. 小結(jié)

兩種模式各有特點(diǎn),注解版適合簡(jiǎn)單快速的模式,其實(shí)像現(xiàn)在流行的這種微服務(wù)模式,一個(gè)微服務(wù)就會(huì)對(duì)應(yīng)一個(gè)自已的數(shù)據(jù)庫(kù),多表連接查詢(xún)的需求會(huì)大大的降低,會(huì)越來(lái)越適合這種模式。另外插一句, Hibernate 對(duì)單表的支持是非常好的,為什么不選用 Spring Boot JPA + QueryDSL呢?

Xml 配置模式比較適合大型項(xiàng)目,可以酣暢淋漓的寫(xiě) SQL ,可以靈活的動(dòng)態(tài)生成 SQL ,方便調(diào)整 SQL 。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    高潮少妇高潮久久精品99| 日本黄色录像韩国黄色录像| 精品视频一区二区不卡| 老司机激情五月天在线不卡| 久久黄片免费播放大全| 久久热中文字幕在线视频| 黄片在线免费观看全集| 日韩成人午夜福利免费视频| 亚洲中文字幕高清视频在线观看 | 欧美黑人巨大一区二区三区| 欧美亚洲三级视频在线观看| 在线日本不卡一区二区| 中文字幕亚洲在线一区| 国产成人精品在线一区二区三区| 人妻人妻人人妻人人澡| 国产一区二区三区四区免费| 激情视频在线视频在线视频| 91午夜少妇极品福利| 日韩高清毛片免费观看| 99免费人成看国产片| 国产日韩欧美一区二区| 亚洲精选91福利在线观看 | 国产一区一一一区麻豆| 日韩一区二区三区四区乱码视频| 国产水滴盗摄一区二区| 99热中文字幕在线精品| 亚洲一区二区精品久久av| 粉嫩国产美女国产av| 国产亚洲不卡一区二区| 欧美日韩国产成人高潮| 欧美一级特黄大片做受大屁股| 麻豆亚州无矿码专区视频| 国产精品免费自拍视频| 日韩夫妻午夜性生活视频| 91欧美亚洲精品在线观看| 亚洲二区欧美一区二区| 亚洲精品美女三级完整版视频| 日本高清不卡在线一区| 国产又黄又猛又粗又爽的片| 欧美一区日韩二区亚洲三区| 日本欧美在线一区二区三区|