【SpringBoot】SpringBoot 整合 MyBatis

一、通过配置

1. 第一步: 引入 starter

       <dependency>
           <groupId>org.mybatis.spring.bootgroupId>
           <artifactId>mybatis-spring-boot-starterartifactId>
           <version>2.1.4version>
       dependency>
分析

引入 mybatis-spring-boot-starter 导入了如下:【SpringBoot】SpringBoot 整合 MyBatis_第1张图片

配置模式在 —— MybatisAutoConfiguration.class 中规定

MybatisAutoConfiguration.class 为我们配置好了SqlSessionFactory、SqlSession 及 Mapper。

  • SqlSessionFactory

MybatisAutoConfiguration.class 自动配置好 SqlSessionFactory
【SpringBoot】SpringBoot 整合 MyBatis_第2张图片

  • SqlSession
  1. 自动配置了SqlSessionTemplate ,在 SqlSessionTemplate 中组合了 SqlSession
    【SpringBoot】SpringBoot 整合 MyBatis_第3张图片
    【SpringBoot】SpringBoot 整合 MyBatis_第4张图片

  2. 导入 AutoConfiguredMapperScannerRegistrar,拿到 Mappper 接口
    【SpringBoot】SpringBoot 整合 MyBatis_第5张图片

  • Mapper

为我们写的操作 MyBatis 的接口标注 @Mapper 注解,就会被自动扫描进来
【SpringBoot】SpringBoot 整合 MyBatis_第6张图片

MyBatis 配置项绑定 mybatis 前缀,修改对 MyBatis 的配置,只需要配置文件中 mybatis 下的项即可

@ConfigurationProperties(
    prefix = "mybatis"
)

2. 第二步 —— 创建 MyBatis 全局配置文件

全局配置文件位置:【SpringBoot】SpringBoot 整合 MyBatis_第7张图片


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
configuration>

我们需要配置的地方,在 configuration 中通过 配置

3. 第三步 —— 封装待操作数据库表为实体类

我想操作 Account 数据库表,于是创建 Account 类

package com.wanqing.admin.bean;

import lombok.Data;

/**
 * @description: 账号信息类
 * @author: Liuwanqing
 * @date: 2022-10-23 16:11
 */
@Data
public class Account {
    private long id;
    private int money;
    private String userId;
}

4. 第四步 —— 创建 Mapper 接口

比如我想操作 Account 数据库表,需要创建 AccountMapper 接口放在 mapper 文件下用于操作此 Account 表,在 AccountMapper 接口写自己需要实现的方法

注意:一定要添加 @Mapper 注释,MyBatis 才能自动扫描到

package com.wanqing.admin.mapper;

import com.wanqing.admin.bean.Account;

@Mapper
public interface AccountMapper {
	// 找到并返回当前查询的 id 的 Account
    public Account getAccount(long id);
}

补充: 可通过在 SpringBoot 启动类中,使用 @MapperScan 注释添加 Mapper 查询接口所在位置的方式让 MyBatis 自动扫描,通过这种方式,可不在 Mapper 接口前加入 @Mapper 注释,但是建议还是加上 @Mapper 注释

@SpringBootApplication
@MapperScan("com.wanqing.admin.mapper") // 接口上上不需要标注 Mapper
public class DemoAdminApplication {

    public static void main(String[] args) {

        SpringApplication.run(DemoAdminApplication.class, args);

    }

}

5. 第五步 —— 创建 mapper 包,创建 MyBatis 的 SQL 映射文件

映射文件位置:【SpringBoot】SpringBoot 整合 MyBatis_第8张图片


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wanqing.admin.mapper.AccountMapper"> 
    
    <select id="getAccount" resultType="com.wanqing.admin.bean.Account"> 
        select * from Account where id = #{id} 
    select>
mapper>

6. 第六步 —— 在 application.yaml 中添加MyBatis全局配置文件和SQL映射文件位置配置

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml # 全局配置文件位置
  mapper-locations: classpath:mybatis/mapper/*.xml # SQL 映射文件位置

7. 第七步 —— 修改MyBatis配置

MyBatis 全部配置可在如下连接中查到MyBatis全部配置查询

  1. 方法一:在 mybatis-config.xml 全局配置文件中添加配置信息,如下为开启驼峰转换机制:

DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <settings>
  		 
       <setting name="mapUnderscoreToCamelCase" value="true"/> 
   settings>
configuration>
  1. 在 appliaction.yaml 中在 configration 配置项下配置,代码示例如下:
mybatis:
  configuration: # 修改 MyBatis 配置项
    map-underscore-to-camel-case: true # 开启驼峰命名转换

因此,我们可以直接在 configuration 下进行 MyBatis 配置,因此全局配置文件不是必要的,建议不写全局配置文件。

注意: 不能上述两个方法同时使用,只能使用一个,不相信的可以自己去试试

补充:通过注释的方式写入 SQL 语句

我们也可以在 Mapper 接口中以注释的方式写入 SQL 语句,这种方式适合于查询比较简单的情况。通过这种方式可以不用编写 SQL 映射的 xml 文件

使用方法:

  1. 对查询语句,使用@Select注释,括号内写查询语句
  2. 对插入语句,使用@Insert注释,括号内写插入语句,对插入语句需要开启的选项(通过useGeneratedKeys开启自增主键,keyProperty设置主键为 id),通过@Options注释开启 —— 对复杂的情况,更建议使用 SQL 映射文件

示例:

@Mapper
public interface CityMapper {

    @Select("select * from city where id = #{id}")
    public City getCityById(Long id);

    @Insert("insert into city('name', 'state', 'country') vaules(#{name}, #{state}, #{country})")
    @Options(useGeneratedKeys= true, keyProperty="id")
    public void insert(City city);
}

插入语句映射文件如下:

<?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.wanqing.admin.mapper.CityMapper">
    <!--    public Account getAccount(long id); -->
    <insert id="insert"  useGeneratedKeys="true" keyProperty="id">
        insert into city('name', 'state', 'country') vaules(#{name}, #{state}, #{country})
    </insert>
</mapper>

8. 第八步 —— 编写 Service 类用于测试

package com.wanqing.admin.service;

import com.wanqing.admin.bean.Account;
import com.wanqing.admin.mapper.AccountMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @description: AccountService 类
 * @author: Liuwanqing
 * @date: 2022-10-23 19:39
 */
@Service
public class AccountService {
    @Autowired
    AccountMapper accountMapper;

    public Account getAcctByid(long id){
        return accountMapper.getAccount(id);
    }
}

测试代码:

package com.wanqing.admin.controller;

import com.wanqing.admin.bean.Account;
import com.wanqing.admin.bean.City;
import com.wanqing.admin.bean.User;
import com.wanqing.admin.service.AccountService;
import com.wanqing.admin.service.CityService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

@Slf4j
@Controller
public class indexController {

    @Autowired
    AccountService accountService;

    @ResponseBody
    @GetMapping("/acct")
    public Account getById(@RequestParam("id") Long id){
        return accountService.getAcctByid(id);
    }

}



总结: 在 SpringBoot 中使用 MyBatis 时,上述两种方法可以混合使用。当查询语句较为简单时,使用注释法。当查询语句较为复杂时,使用配置法。

你可能感兴趣的:(#,SpringBoot,mybatis,spring,boot,java)