Spring Boot(六)集成 MyBatis 操作 MySQL 8

一、簡(jiǎn)介

1.1 MyBatis介紹

MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。

1.2 MyBatis發(fā)展史

MyBatis 原本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis ,2013年11月遷移到Github。

1.3 MyBatis和Hibernate的區(qū)別

MyBatis 和 Hibernate 都是優(yōu)秀的持久化框架,都支持JDBC(Java DataBase Connection)和JTA(Java Transaction API)事務(wù)處理。

MyBatis 優(yōu)點(diǎn)

  • 更加輕量級(jí),如果說(shuō)Hibernate是全自動(dòng)的框架,MyBatis就是半自動(dòng)的框架;
  • 入門簡(jiǎn)單,即學(xué)即用,并且延續(xù)了很好的SQL使用經(jīng)驗(yàn);

Hibernate 優(yōu)點(diǎn)

  • 開(kāi)發(fā)簡(jiǎn)單、高效,不需要編寫(xiě)SQL就可以進(jìn)行基礎(chǔ)的數(shù)據(jù)庫(kù)操作;
  • 可移植行好,大大降低了MySQL和Oracle之間切換的成本(因?yàn)槭褂昧薍QL查詢,而不是直接寫(xiě)SQL語(yǔ)句);
  • 緩存機(jī)制上Hibernate也好于MyBatis;

1.4 MyBatis集成方式

Mybatis集成方式分為兩種:

  • 注解版集成
  • XML版本集成

XML版本為老式的配置集成方式,重度集成XML文件,SQL語(yǔ)句也是全部寫(xiě)在XML中的;注解版版本,相對(duì)來(lái)說(shuō)比較簡(jiǎn)約,不需要XML配置,只需要使用注解和代碼來(lái)操作數(shù)據(jù)。

二、注解版 MyBatis 集成

開(kāi)發(fā)環(huán)境

  • MySQL 8.0.12
  • Spring Boot 2.0.4
  • MyBatis Spring Boot 1.3.2(等于 MyBatis 3.4.6)
  • JDK 8
  • IDEA 2018.2

MyBatis Spring Boot 是 MyBatis 官方為了集成 Spring Boot 而推出的MyBatis版本。

2.1 添加依賴

設(shè)置pom.xml文件,添加如下配置

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.12</version>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

添加 MySQL 和 MyBatis 支持。

2.2 配置數(shù)據(jù)庫(kù)連接

設(shè)置application.properties文件,添加如下配置

# MyBatis 配置
spring.datasource.url=jdbc:mysql://172.16.10.79:3306/mytestdb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.type-aliases-package=com.hello.springboot.mapper
  • spring.datasource.url 數(shù)據(jù)庫(kù)連接字符串
  • spring.datasource.username 數(shù)據(jù)庫(kù)用戶名
  • spring.datasource.password 數(shù)據(jù)庫(kù)密碼
  • spring.datasource.driver-class-name 驅(qū)動(dòng)類型(注意MySQL 8.0的值是com.mysql.cj.jdbc.Driver和之前不同)
  • mybatis.type-aliases-package 配置mapper包名

Mapper文件說(shuō)明

Mapper是MyBatis的核心,是SQL存儲(chǔ)的地方,也是配置數(shù)據(jù)庫(kù)映射的地方。

2.3 設(shè)置 MapperScan 包路徑

直接在啟動(dòng)文件SpringbootApplication.java的類上配置@MapperScan,這樣就可以省去,單獨(dú)給每個(gè)Mapper上標(biāo)識(shí)@Mapper的麻煩。

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

2.4 添加代碼

為了演示的簡(jiǎn)潔性,我們不做太多的分層處理了,我們這里就分為:實(shí)體類、Mapper接口、Controller類,使用Controller直接調(diào)用Mapper接口進(jìn)行數(shù)據(jù)持久化處理。

User 類:

public class User {
    private Long id;
    private String name;
    private int age;
    private String pwd;
    //省去set、get方法
}

UserMapper 接口:

public interface UserMapper {
    @Select("select * from user")
    @Results({
            @Result(property = "name", column = "name")
    })
    List<User> getAll();

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

    @Insert({"insert into user(name,age,pwd) values(#{name},#{age},#{pwd})"})
    void install(User user);

    @Update({"update user set name=#{name} where id=#{id}"})
    void Update(User user);

    @Delete("delete from user where id=#{id}")
    void delete(Long id);
}

可以看出來(lái),所有的SQL都是寫(xiě)在Mapper接口里面的。

Mapper里的注解說(shuō)明

  • @Select 查詢注解
  • @Result 結(jié)果集標(biāo)識(shí),用來(lái)對(duì)應(yīng)數(shù)據(jù)庫(kù)列名的,如果實(shí)體類屬性和數(shù)據(jù)庫(kù)屬性名保持一致,可以忽略此參數(shù)
  • @Insert 插入注解
  • @Update 修改注解
  • @Delete 刪除注解

Controller 控制器:

@RestController
@RequestMapping("/")
public class UserController {
    @Autowired
    private UserMapper userMapper;
    @RequestMapping("/")
    public ModelAndView index() {
        User user = new User();
        user.setAge(18);
        user.setName("Adam");
        user.setPwd("123456");
        userMapper.install(user);
        ModelAndView modelAndView = new ModelAndView("/index");
        modelAndView.addObject("count", userMapper.getAll().size());
        return modelAndView;
    }
}

到此為止,已經(jīng)完成了MyBatis項(xiàng)目的配置了,可以運(yùn)行調(diào)試了。

注解版GitHub源碼下載:https://github.com/vipstone/springboot-example/tree/master/springboot-mybatis

三、XML 版 MyBatis 集成

3.1 添加依賴

設(shè)置pom.xml文件,添加如下配置

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.12</version>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

添加 MySQL 和 MyBatis 支持。

3.2 配置數(shù)據(jù)庫(kù)連接

設(shè)置application.properties文件,添加如下配置

# MyBatis 配置
spring.datasource.url=jdbc:mysql://172.16.10.79:3306/mytestdb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.type-aliases-package=com.hello.springboot.entity
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
  • spring.datasource.url 數(shù)據(jù)庫(kù)連接字符串
  • spring.datasource.username 數(shù)據(jù)庫(kù)用戶名
  • spring.datasource.password 數(shù)據(jù)庫(kù)密碼
  • spring.datasource.driver-class-name 驅(qū)動(dòng)類型(注意MySQL 8.0的值是com.mysql.cj.jdbc.Driver和之前不同)
  • mybatis.type-aliases-package 實(shí)體類包路徑
  • mybatis.config-locations 配置MyBatis基礎(chǔ)屬性
  • mybatis.mapper-locations 配置Mapper XML文件

3.3 設(shè)置 MapperScan 包路徑

直接在啟動(dòng)文件SpringbootApplication.java的類上配置@MapperScan,這樣就可以省去,單獨(dú)給每個(gè)Mapper上標(biāo)識(shí)@Mapper的麻煩。

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

3.4 配置XML文件

本示例設(shè)置兩個(gè)xml文件,在resource/mybatis下的mybatis-config.xml(配置MyBatis基礎(chǔ)屬性)和在resource/mybatis/mapper下的UserMapper.xml(用戶和數(shù)據(jù)交互的SQL語(yǔ)句)。

mybatis-config.xml

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

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace是命名空間,是mapper接口的全路徑-->
<mapper namespace="com.hello.springboot.mapper.UserMapper">

    <!--resultMap – 是最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象-->
    <resultMap id="userResultMap" type="com.hello.springboot.entity.User">
        <id property="name" column="username"></id>
    </resultMap>

    <!--sql – 可被其他語(yǔ)句引用的可重用語(yǔ)句塊-->
    <sql id="colums">
        id,username,age,pwd
    </sql>

    <select id="findAll" resultMap="userResultMap">
        select
        <include refid="colums" />
        from  user
    </select>

    <select id="findById" resultMap="userResultMap">
        select
        <include refid="colums" />
        from  user
        where  id=#{id}
    </select>

    <insert id="insert" parameterType="com.hello.springboot.entity.User" >
       INSERT INTO
            user
            (username,age,pwd)
        VALUES
            (#{name}, #{age}, #{pwd})
    </insert>

    <update id="update" parameterType="com.hello.springboot.entity.User" >
        UPDATE
        users
        SET
        <if test="username != null">username = #{username},</if>
        <if test="pwd != null">pwd = #{pwd},</if>
        username = #{username}
        WHERE
        id = #{id}
    </update>

    <delete id="delete" parameterType="java.lang.Long" >
       DELETE FROM
             user
       WHERE
             id =#{id}
    </delete>

</mapper>

SQL 映射文件有很少的幾個(gè)頂級(jí)元素(按照它們應(yīng)該被定義的順序):

  • cache – 給定命名空間的緩存配置。
  • cache-ref – 其他命名空間緩存配置的引用。
  • resultMap – 是最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象。
  • parameterMap – 已廢棄!老式風(fēng)格的參數(shù)映射。內(nèi)聯(lián)參數(shù)是首選,這個(gè)元素可能在將來(lái)被移除,這里不會(huì)記錄。
  • sql – 可被其他語(yǔ)句引用的可重用語(yǔ)句塊。
  • insert – 映射插入語(yǔ)句
  • update – 映射更新語(yǔ)句
  • delete – 映射刪除語(yǔ)句
  • select – 映射查詢語(yǔ)句

注意: MyBatis中 config 和 mapper 的 XML 頭文件是不一樣的。

config 頭文件

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

mapper 頭文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

Mapper XML 更多配置:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

3.5 添加代碼

為了演示的便捷性,我們添加3個(gè)類用于功能的展示,分別是實(shí)體類User.java、mapper接口UserMapper.java和控制器類UserController.java,使用控制器類直接調(diào)用UserMapper的方法,進(jìn)行數(shù)據(jù)存儲(chǔ)和查詢。

User.java

package com.hello.springboot.entity;
public class User {
    private Long id;
    private String name;
    private int age;
    private String pwd;
    //省略set/get方法
}

UserMapper.java

package com.hello.springboot.mapper;
import com.hello.springboot.entity.User;
import java.util.List;
public interface UserMapper {
    List<User> findAll();
    User findById(Long id);
    void insert(User user);
    void update(User user);
    void delete(Long id);
}

注意: Mapper里的方法名必須和Mapper XML里的一致,不然會(huì)找不到執(zhí)行的SQL。

UserController.java

@RestController
@RequestMapping("/")
public class UserController {
    @Resource
    private UserMapper userMapper;

    @RequestMapping("/")
    public ModelAndView index() {
        User user = new User();
        user.setAge(18);
        user.setName("Adam");
        user.setPwd("123456");
        userMapper.insert(user);
        ModelAndView modelAndView = new ModelAndView("/index");
        modelAndView.addObject("count", userMapper.findAll().size());
        return modelAndView;
    }

}

到此為止,已經(jīng)完成了MyBatis項(xiàng)目的配置了,可以運(yùn)行調(diào)試了。

XML版GitHub源碼下載:https://github.com/vipstone/springboot-example/tree/master/springboot-mybatis-xml

四、總結(jié)

到目前為止我們已經(jīng)掌握了MyBatis的兩種集成方式,注解集成和XML集成,注解版更符合程序員的代碼書(shū)寫(xiě)習(xí)慣,適用于簡(jiǎn)單快速查詢;XML版可以靈活的動(dòng)態(tài)調(diào)整SQL,更適合大型項(xiàng)目開(kāi)發(fā),具體的選擇還要看開(kāi)發(fā)場(chǎng)景以及個(gè)人喜好了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容