SpringBoot学习之整合Mybatis(注解&配置文件)

本文介绍SpringBoot与MyBatis框架的整合方法,包括传统XML配置与SpringBoot推崇的配置文件方式。涵盖数据源配置、全局配置、映射文件、实体类、接口与控制器代码,以及自动配置类解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天主要介绍一下SpringBoot与MyBatis框架的整合,主要介绍两种方式的整合,一种是我们传统的xml配置文件的方式,另外一种是我们springBoot推崇的配置文件的方式整合。

配置文件方式

 首先来介绍一下基于配置文件的整合;

     首先需要我们创建一个SpringBoot的Maven项目,这里使用的是IDEA工具,选择需要的模块,Maven会默认的下载好;无需我们再去关心引入;主要看mybatis包有没有引入。

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

接下来我们配置我们的数据源,在配置文件中写入数据库配置;这里使用的是.yml文件的配置;

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3308/SPRINGBOOT
    driver-class-name: com.mysql.jdbc.Driver
#    阿里的DruidDataSource数据源可以看到后台监控
#    type: type: com.alibaba.druid.pool.DruidDataSource
#    springframework.jdbc提供的数据源
    type: org.springframework.jdbc.datasource.DriverManagerDataSource
 
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

接下来我们写我们的Mybatis的全局配置文件mybatis-config.xml;可以参考官网的配置文件,需要什么配置什么;Mybatis中文官网配置文件链接

<?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>
    <settings>
        <!--开启驼峰命名规则-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--设置主键自增-->
        <setting name="useGeneratedKeys" value="true"/>
    </settings>
</configuration>

接着我们创建mybatis映射文件**mapper.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.eml.mapper.CustMapper">
    <select id="findCustById" resultType="com.eml.domain.Cust">
    select * from CUST where id = #{id}
  </select>
</mapper>

配置文件写完后可以开始写代码;首先是domain实体类,这里简单的创建没有太多字段;后面我会把代码传上去,以及sql文件,需要的可以下载简单的看一下;

domain

public class Cust {
    private Integer id;
    private String custName;
    private Integer custAge;
    private String custGender;
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getCustName() {
        return custName;
    }
 
    public void setCustName(String custName) {
        this.custName = custName;
    }
 
    public Integer getCustAge() {
        return custAge;
    }
 
    public void setCustAge(Integer custAge) {
        this.custAge = custAge;
    }
 
    public String getCustGender() {
        return custGender;
    }
 
    public void setCustGender(String custGender) {
        this.custGender = custGender;
    }
 
    @Override
    public String toString() {
        return "Cust{" +
                "id=" + id +
                ", custName='" + custName + '\'' +
                ", custAge=" + custAge +
                ", custGender='" + custGender + '\'' +
                '}';
    }
}

custMapper (interface)

public interface CustMapper {
 
    Cust findCustById(Integer id);
 
    int insertCust(Cust cust);
}

custMapper(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.eml.mapper.CustMapper">
    <select id="findCustById" resultType="com.eml.domain.Cust">
    select * from CUST where id = #{id}
    </select>
 
    <insert id="insertCust">
        insert into CUST(CUST_NAME,CUST_AGE,CUST_GENDER) VALUES (#{custName},#{custAge},#{custGender})
    </insert>
</mapper>

controller

@Controller
public class CustController {
    @Autowired
    CustMapper custMapper;
 
    @ResponseBody
    @GetMapping("/findCustById/{id}")
    public Cust custfinById(@PathVariable("id") int id){
        Cust cust =  custMapper.findCustById(id);
        return cust;
    }
 
    @ResponseBody
    @GetMapping("/insertCust")
    public int insertCust(Cust cust){
        int total = custMapper.insertCust(cust);
        return total;
    }
}

项目结构

代码完成后,在配置文件中最后需要添加mybatis全局配置文件,以及mapper映射文件;

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

注解方式

首先我们可以看一下mybatis的自动配置类,看自动配置为我们已经配置了哪些东西,我们在配置文件中写的时候该如何使用;

全局搜索 MybatisAutoConfiguration 配置文件,

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnBean(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)//properties
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {

配置文件的@EnableConfigurationProperties注解,查看能配置哪些内容;

@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties {
 
  public static final String MYBATIS_PREFIX = "mybatis";
 
  /**
   * Location of MyBatis xml config file.
   */
  private String configLocation;

我这里都是截取,具体可以自己去看和配置。基本的我们不配置页能使用。

domain

public class User {
    private Integer id;
    private String userName;
    private String userAge;
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getUserAge() {
        return userAge;
    }
 
    public void setUserAge(String userAge) {
        this.userAge = userAge;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userAge='" + userAge + '\'' +
                '}';
    }

mapper(interface)

@Mapper
public interface UserMapper {
 
    @Select("select * from USER where id=#{id}")
    User getUserById(int id);
 
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("insert into USER (USER_NAME,USER_AGE) VALUES (#{userName},#{userAge})")
    int insertUser(User user);
 
}

controller

public class CustController {
    @Autowired
    CustMapper custMapper;
 
    @ResponseBody
    @GetMapping("/findCustById/{id}")
    public Cust custfinById(@PathVariable("id") int id){
        Cust cust =  custMapper.findCustById(id);
        return cust;
    }
 
    @ResponseBody
    @GetMapping("/insertCust")
    public int insertCust(Cust cust){
        int total = custMapper.insertCust(cust);
        return total;
    }
}

这里需要还需要说明的有两点;一个是全局的Mapper文件扫描到容器中,可以在启动类直接扫描全部,就无需再在每一个mapper文件中加@Mapper注解;

我们可以看一下自动配置扫描mapper是怎么做的;

@Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
 
      logger.debug("Searching for mappers annotated with @Mapper");
 
      ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
 
      try {
        if (this.resourceLoader != null) {
          scanner.setResourceLoader(this.resourceLoader);
        }
 
        List<String> packages = AutoConfigurationPackages.get(this.beanFactory);
        if (logger.isDebugEnabled()) {
          for (String pkg : packages) {
            logger.debug("Using auto-configuration base package '{}'", pkg);
          }
        }
 
        scanner.setAnnotationClass(Mapper.class);
        scanner.registerFilters();
        scanner.doScan(StringUtils.toStringArray(packages));
      } catch (IllegalStateException ex) {
        logger.debug("Could not determine auto-configuration package, automatic mapper scanning disabled.", ex);
      }
    }

我们也可以自己配置;

第二点就是我们的自定义我们的配置文件;

我们可以new 一个新的 ConfigurationCustomizer 对象加入容器的方式来自定义我们自己的配置;例如我们像xml文件配置一样启动驼峰命令转换;

@org.springframework.context.annotation.Configuration
public class MybatisConfig {
 
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return new ConfigurationCustomizer() {
            @Override
            public void customize(Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);//启动驼峰命名
            }
        };
    }
 
}

通过自定义配置的方式;将配置信息作用到容器中;

参考:

https://www.cnblogs.com/gxyandwmm/p/9713672.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值