spring boot整合Mybatis3.5.4使用XML定義SQL

1.概述

SQL聲明可以定義在XML文件或註解中。註解方式可以參考:《SpringBoot整合MyBatis》

MyBatis強大在映射聲明這裏。同時映射器文件也很簡單。與等價的JDBC代碼對比,你會發現使用MyBatis幫你省了95%的代碼。MyBatis框架的目的是聚焦於SQL。使用XML比使用註解更靈活,調優也更方便。MyBatis也推薦使用XML定義SQL聲明。映射器XML文件只有少量的一些頂層元素:

  • cache:指定的命名空間的緩存配置
  • cache-ref:從其他命名空間引用緩存配置
  • resultMap:最複雜也是最強大的元素,它可以描述如何從數據庫結果集中加載你的對象
  • parameterMap:在MyBatis3.5.4中棄用了!
  • sql:可重用的SQL塊,它可以被其他SQL聲明引用
  • insert:一個映射的INSERT聲明
  • update:一個映射的UPDATE聲明
  • delete:一個映射的DELETE聲明
  • select:一個映射的SELECT聲明

2.例子

項目的總體結體:

~/Desktop/MyBatisXMLDemo$ tree -L 8
.
├── GroceryDemo.iml
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── wong
        │           ├── controller
        │           │   └── PersonController.java
        │           ├── MainApplication.java
        │           └── mybatis
        │               ├── bean
        │               │   └── Person.java
        │               ├── mapper
        │               │   └── PersonMapper.java
        │               └── service
        │                   ├── PersonServiceImpl.java
        │                   └── PersonService.java
        └── resources
            ├── config
            │   └── application.yml
            └── mybatis
                └── mapper
                    └── PersonMapper.xml

2.1.pom.xml添加依賴

主要的依賴:

  • springboot web的起步依賴
  • mysq驅動
  • mybatis框架
<?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.wong</groupId>
    <artifactId>xmlDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <!--springboot開發web項目的起步依賴-->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 去掉內嵌tomcat -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--mysql的jdbc驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--MyBatis整合到springboot項目-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <!--日誌框架-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!--jetty容器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <build>
        <finalName>Demo</finalName>
        <plugins>
            <!--maven插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

        </plugins>
    </build>
</project>


2.2.application.yml配置數據庫及MyBatis

spring:
  datasource:
    # 數據源基本配置
    url: jdbc:mysql://127.0.0.1:3306/MyDB
    username: root
    password: 1qaz@4321
    driver-class-name: com.mysql.jdbc.Driver
    # 數據源其他配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 30000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    # 配置監控統計的filters,去掉後監控界面sql無法統計,wall用於防火牆
    filters: stat,wall,slf4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
mybatis:
  # 指定映射器的xml文件的位置
  mapper-locations: classpath:mybatis/mapper/*.xml

2.3.創建實體類Person

package com.wong.mybatis.bean;

public class Person{
    private int id;
    private String name;
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Person{id:"+this.id+",name:"+this.name+",age:"+this.age+"}";
    }
}

2.4.創建映射器

package com.wong.mybatis.mapper;


import com.wong.mybatis.bean.Person;

import java.util.List;

public interface PersonMapper {

    // 增加
    int insert(Person person);

    // 刪除
    int deleteByPrimaryKey(Integer id);

    // 修改
    int updateByPrimaryKey(Person person);

    // 查詢
    Person selectByPrimaryKey(Integer id);

    // 方法名就是 xml中的id
    List<Person> selectAllPerson();

}
/**
 * 下面被註釋的部分是使用註解完成映射的
 */
//@Mapper
//public interface PersonMapper {
//    // 增加
//    @Insert("insert into person(id,name,age) values(#{id},#{name},#{age})")
//    int insert(Person person);
//    // 刪除
//    @Delete("delete from person where id = #{id}")
//    int deleteByPrimaryKey(Integer id);
//    // 修改
//    @Update("update person set name = #{name},age = #{age} where id = #{id}")
//    int updateByPrimaryKey(Person person);
//    // 查詢
//    @Select("select id,name,age from person where id=#{id}")
//    Person selectByPrimaryKey(Integer id);
//    @Select("select id,name,age from person")
//    List<Person> selectAllPerson();
//}

2.5.創建與映射器對應的SQL的xml文件

因爲我們在application.yml指定了SQL映射的xml文件的位置是classpath:mybatis/mapper/*.xml因此我在項目的resources目錄下創建目錄mybatis/mapper,並在其中添加映射器對應的SQL映射文件PersonMapper.xml:
一般來說,爲了方便代碼的閱讀與管理,我們都會將SQL的映射文件的命名與映射器類的名稱保持一致。事實上,你可以定義任意名字。這對綁定過程影響不大,因爲它最終是根據mapper標籤裏的命名空間namespace來進行綁定的。

<?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.wong.mybatis.mapper.PersonMapper">
    <insert id="insert">
        insert into person(id,name,age)
        values(#{id},#{name},#{age})
    </insert>
    <delete id="deleteByPrimaryKey">
        delete from person where id = #{id}
    </delete>
    <update id="update">
        update person
        set name = #{name},
        age = #{age}
        where id = #{id}
    </update>
    <select id="selectByPrimaryKey" resultType="com.wong.mybatis.bean.Person">
        select * from person where id = #{id}
    </select>
    <select id="selectAllPerson" resultType="com.wong.mybatis.bean.Person">
        select * from person
    </select>
</mapper>

2.6.在啓動類添加映射器掃描註解

如果使用註解進行sql與接口綁定的,那麼只需要在mapper映射器上使用@Mapper註解就可以進行綁定,但是現在映射器類與SQL的定義都在不同的文件裏,因此需要通過某種途徑將兩者綁定起來。解決方式:
1.application.yml裏指定了SQL映射文件的路徑
2.在SpringBoot啓動類裏添加@MapperScan註解,當應用啓動時,就會根據這些信息進行掃描並進行綁定。

package com.wong;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
@MapperScan("com.wong.mybatis.mapper") // 映射器類的包路徑
public class MainApplication {

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

}

2.7.創建服務類

服務類是專門用來完成複雜業務的地方。

2.7.1.定義服務類接口

package com.wong.mybatis.service;

import com.wong.mybatis.bean.Person;

import java.util.List;

public interface PersonService {
    // 增加
    int insertPerson(Person person);
    // 刪除
    int deletePersonById(Integer id);
    // 修改
    int updatePersonById(Person person);
    // 查詢
    Person selectPersonById(Integer id);
    List<Person> selectAllPerson();
}

2.7.2.服務類接口的實現

要使用@Service註解,讓Spring初始化它,並將其放入Spring容器中。

package com.wong.mybatis.service;


import com.wong.mybatis.bean.Person;
import com.wong.mybatis.mapper.PersonMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PersonServiceImpl implements PersonService{
    @Autowired
    private PersonMapper personMapper;

    @Override
    public int insertPerson(Person person) {
        return personMapper.insert(person);
    }

    @Override
    public int deletePersonById(Integer id) {
        return personMapper.deleteByPrimaryKey(id);
    }

    @Override
    public int updatePersonById(Person person) {
        return personMapper.updateByPrimaryKey(person);
    }

    @Override
    public Person selectPersonById(Integer id) {
        return personMapper.selectByPrimaryKey(id);
    }

    @Override
    public List<Person> selectAllPerson() {
        return personMapper.selectAllPerson();
    }
}

2.8.創建controller

在controller裏通過服務類調用數據庫。使用註解@Autowired,將spring容器中的PersonService實例,注入本地變量personService,進行業務調用。

package com.wong.controller;

import com.wong.mybatis.bean.Person;
import com.wong.mybatis.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class PersonController {

    // 將spring容器中的PersonService實例,注入本地變量personService
    @Autowired
    private PersonService personService;

    // add
    @RequestMapping(value = "/add")
    public String addStudents(){
        Person student = new Person();
        student.setName("Tom");
        student.setAge(12);
        int rs = personService.insertPerson(student);
        return "插入結果:"+rs;
    }

    // select
    @RequestMapping(value = "/findAll")
    public String findAllStudents(){
        List<Person> students = personService.selectAllPerson();
        students.stream().forEach(System.out::println);
        return students.toString()+"";
    }

    @RequestMapping(value = "findById")
    public String find(Integer id){// 參數名爲id
        Person person = personService.selectPersonById(id);
        return person.toString();
    }
}

3.測試

3.1.運行項目

~/Desktop/MyBatisXMLDemo$ mvn clean spring-boot:run

3.2.測試結果

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
Demo下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章