不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2021-05-21 17:11:41  修改时间:2024-04-20 17:45:08  分类:Java框架/系统  编辑

1. 创建工程环境

勾选Web、MyBatis、MySQL,如下

依赖如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.wenjianbao</groupId>
    <artifactId>wjb-blog</artifactId>
    <version>1.0.0</version>
    <name>wjb-blog</name>
    <description>wjb blog</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <mybatis.version>2.1.4</mybatis.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!-- MyBatis -->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>


    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.wenjianbao.RunApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

创建完成之后注意,MyBatis依赖的命名和其他库的命名不太一样,是的这个整合jar包并不是springboot自己的,这表示该starter是由第三方提供的,就像Druid数据源一样,也是第三方的。

方便阅读,先贴出下面操作编写的类位置信息,如下图:

2. 配置数据库连接信息

这里使用yml方式

spring:
  # 数据库
  datasource:
    url: jdbc:mysql://103.74.79.26:3306/wjb_blog_test?useUnicode=true&useSSL=false&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai
    username: user_blog_test
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimum-idle: 2
      maximum-pool-size: 10
      auto-commit: true
      connection-test-query: select 1

配置完成后,MyBatis就可以创建实体类来使用。

3. 编写实体类

实体类:dao包下的Userdao

public class Userdao {
    private int user_id;
    private String userName;
    private String passWord;
    private int usertypeid;

	getXXX...
	setXXX...
	toString...
}

4. 编写Mapper接口类

Mapper接口类:mapper包下的UserMapper

@Mapper
@Repository   
public interface UserMapper {
   //只是整合测试,为了可读性,只写了一个方法
    List<Userdao> queryUserList();
}

这里要注意一下@Mapper注解,@Mapper注解添加位置在接口类上面它的作用是在编译之后会生成相应的接口实现类,这种方法也是官方推荐使用的!这里只是测试整合mybatis编写一个Mapper接口即可,如果有需求要很多接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解,比较麻烦,解决这个问题用@MapperScan注解。简单点说@MapperScan注解就相当于直接扫描指定包,上面的代码所在包是com.yichunnnn.jdbcboot.mapper包下,如果要用@MapperScan注解,就相当于如下即可

附:注解@Mapper和@Repository的区别

@MapperScan("com.yichunnnn.jdbcboot.mapper")  // 相当于@Mapper
@SpringBootApplication
public class JdbcbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(JdbcbootApplication.class, args);
    }
}

5. 编写Mapper映射文件

Mapper映射文件编写的位置以及名字为:classpath:mybatis/mapper/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.yichunnnn.jdbcboot.mapper.UserMapper">

    <select id="queryUserList" resultType="Userdao">
        select * from user
    </select>
</mapper>

考虑到可读性,这里只编写一个查询的方法,同时特别注意

只要错了一处都会报错!

6. SpringBoot 整合Mybatis

实际上Mybatis的整合过程像极了我们程序员的一生。

在SpringBoot 整合Mybatis之前,我们回忆回忆以前 MyBatis 单独使用时,myBatis 核心配置文件要配置数据源、事务、连接数据库账号、密码…是的全是这货一个人干,都要亲力亲为。这就是我们的低谷期

myBatis 与 spring 整合的时候,配置数据源、事务、连接数据库的账号什么的都交由 spring 管理就行,就不用什么都自己管理自己去干。这就是我们春风得意的时候,事业有着落…

再后来,SpringBoot 整合Mybatis的时候,数据源什么的,springboot都默认准备好了,甚至不使用mybatis配置文件也没问题,如果我们自己已经编写了 myBatis 的映射配置文件,则只要告诉 spring boot 这些文件的位置的好了,如下(yml写法),这简直是事业有成,迎娶白富美,走上人生巅峰…

#整合Mybatis   #指定myBatis的核心配置文件与Mapper映射文件
mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml
  
  #注意:对应实体类的路径
  type-aliases-package: com.yichunnnn.jdbcboot.dao

故事是美好的,然而事实却是骨感的…

最后的配置文件也就如上图效果所示,如果需要完全理解配置文件可以从 org.mybatis.spring.boot.autoconfigure.MybatisProperties 类中查看(鼠标点击属性就可以进入),当然也可以从官方文档中查阅:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

7. 编写controller层代码

@RestController
public class MybatisController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/selectUser")
    public String selectUser(){
        List<Userdao> userdaos = userMapper.queryUserList();
        for (Userdao user : userdaos) {
            System.out.println(user);
        }
        return "select success == SpringBoot 2.X整合Mybatis成功!";
    }
}

运行测试

效果如上,则整合成功!

8. SpringBoot 2.X整合Mybatis原理

SpringBoot 2.X整合Mybatis原理实际上就隐含在org.mybatis.spring.boot.autoconfigure 包中,这里面蕴含着SpringBoot 整合Mybatis的精华原理所在,具体位置如下

在myBatis 与 spring 整合的时候,开发者需要自己提供两个Bean,一个SqlSessionFactoryBean,还有一个是MapperScannerConfigurer,在Spring Boot中,这两个东西虽然不用开发者自己提供了,但是并不意味着这两个Bean不需要了,在org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration类中,我们可以看到Spring Boot提供了这两个Bean,关键源码如下:

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration implements InitializingBean {

  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    return factory.getObject();
  }
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    ExecutorType executorType = this.properties.getExecutorType();
    if (executorType != null) {
      return new SqlSessionTemplate(sqlSessionFactory, executorType);
    } else {
      return new SqlSessionTemplate(sqlSessionFactory);
    }
  }
  @org.springframework.context.annotation.Configuration
  @Import({ AutoConfiguredMapperScannerRegistrar.class })
  @ConditionalOnMissingBean(MapperFactoryBean.class)
  public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {

    @Override
    public void afterPropertiesSet() {
      logger.debug("No {} found.", MapperFactoryBean.class.getName());
    }
  }
}

从类上的注解可以看出,当当前类路径下存在SqlSessionFactory、 SqlSessionFactoryBean以及DataSource时,这里的配置才会生效,SqlSessionFactory和SqlTemplate都被提供了。这段代码的意义就在于Spring Boot中MyBatis多数据源的配置时做了重要的参考!

当然如果对mybatis的配置属性感兴趣的也可以参考MybatisProperties类,要探索更多原理主要以org.mybatis.spring.boot.autoconfigure 包为中心进行参考!

 

 

参考:

  1. SpringBoot 2.X整合Mybatis
  2. Spring Boot 2.3.4 整合Mybatis入门示例
  3. Spring Boot整合Mybatis

 

 


 

最后总结:Spring Boot引入MyBatis的操作步骤

第1步:在pom.xml中,添加相关依赖包

<!--++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!-- MyBatis -->
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis.version}</version>
</dependency>

第2步:在application.yml中配置MySQL的连接信息

spring:
  # 数据库
  datasource:
    url: jdbc:mysql://103.74.79.26:3306/wjb_blog_test?useUnicode=true&useSSL=false&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai
    username: user_blog_test
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimum-idle: 2
      maximum-pool-size: 10
      auto-commit: true
      connection-test-query: select 1

第3步:在application.yml中配置MyBatis

# MyBatis
mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml
   
  #注意:对应实体类(跟数据表记录对应的类)的路径
  type-aliases-package: com.yichunnnn.jdbcboot.dao

第4步:编写 Mapper映射XML文件 和 Mapper接口类,并在 Mapper接口类 上,写上注解@Mapper,如:

(1) Mapper映射文件:

<?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.yichunnnn.jdbcboot.mapper.UserMapper">
 
    <select id="queryUserList" resultType="Userdao">
        select * from user
    </select>
</mapper>

(2) Mapper接口文件:

@Mapper
public interface UserMapper {
   //只是整合测试,为了可读性,只写了一个方法
    List<Userdao> queryUserList();
}

第5步:在需要引用接口实现类的地方,通过注解@Autowired自动注入即可,如:

@RestController
public class MybatisController {
    @Autowired
    private UserMapper userMapper;
 
    @GetMapping("/selectUser")
    public String selectUser(){
        List<Userdao> userdaos = userMapper.queryUserList();
        for (Userdao user : userdaos) {
            System.out.println(user);
        }
        return "select success == SpringBoot 2.X整合Mybatis成功!";
    }
}