SpringBoot项目使用mybatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

优点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql。

引入相关依赖

<!-- JDBC -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- MySQL 驱动包-->
<!--MySQL Server 版本为 8.x时,mysql-connector-java使用5.1.35时会报错-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

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

application.yml配置

server:
  port: 9999

spring:
  datasource:
    #通用配置
    driver-class-name: com.mysql.jdbc.Driver
    password: root
    username: root
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&charcterEncoding=UTF-8&useSSL=false
    #数据源连接池配置
    hikari:
      minimum-idle: 10
      maximum-pool-size: 20
      idle-timeout: 500000
      max-lifetime: 540000
      connection-timeout: 60000
      connection-test-query: select 1

# 指定mybatis的配置文件和mapper文件存放地址
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

全局配置文件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>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

我们也可以使用Java Config来替代mybatis-config.xml的一些配置:

import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class MyBatisConfig {

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return new ConfigurationCustomizer() {
            // 表示将数据库中 含"_"间隔的列转换成驼峰命名
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
            }
        };
    }
}

启动类

@SpringBootApplication
@MapperScan("com.harvey.demo.dao.mapper")
public class DemoApp {

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

此处必须配置MapperScan,指定Mapper接口的包路径,否则不能使用

Mapper接口

public interface TbUserMapper {

    @Insert("insert into tb_user(name, age) values(#{name}, #{age})")
    int insertUser(@Param("name") String name, @Param("age") int age);

    @Select("select * from tb_user")
    List<Map<String, Object>> listUser();
}

注:如果使用mybatis xml,则需要在application.yml中配置mybatis.mapper-locations来指定mapper文件的存放位置。

测试验证

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApp.class)
public class WebSpringTest {

    @Autowired
    private TbUserMapper tbUserMapper;

    @Test
    public void testMybatis() {
        //插入数据
        tbUserMapper.insertUser("杜甫", 67);
        List<Map<String, Object>> mapList = tbUserMapper.listUser();
        for (Map<String, Object> userInfo : mapList) {
            System.out.println("id = " + userInfo.get("id") + ", name = " + userInfo.get("name") + ", age = " + userInfo.get("age"));
        }
    }
}

扩展

设置sql超时时间

在一些无法估计sql执行时间到底有多长的场景,我们希望sql的执行不会影响后续的操作,这时我们就可以为sql的执行添加超时时间。超时时间有全局的和单条sql的。

全局的,在org.apache.ibatis.session.Configuration设置

@org.springframework.context.annotation.Configuration
public class MyBatisConfig {

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return new ConfigurationCustomizer() {
            // 表示将数据库中 含"_"间隔的列转换成驼峰命名
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
                configuration.setDefaultStatementTimeout(3600); //sql超时时间, 秒
            }
        };
    }
}

单条的,可以在mybatis的xml映射文件中设置,在<insert>、<delete>、<select>、<update>中有timeout属性,单位是秒。

 

posted @ 2022-04-23 17:12  残城碎梦  阅读(143)  评论(0编辑  收藏  举报