Spring Boot整合mybatis

mybatis与Spring Boot的整合

有两种方式:

1、使用mybatis官方提供的Spring Boot整合包。

2、使用Spring和mybatis的整合方式

如何选择?

根据项目需要,来进行选择。

例如:如果是简单的CRUD,明显使用第一种方式。如果比较复杂,且涉及到多个表的,建议使用第二种方式,这样可以很方便的控制Mybatis的各种配置。

一、使用mybatis官方提供的Spring Boot整合包。

这里使用的是maven,所以首先导入相关的依赖。

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

在application.properties配置mysql的连接配置

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=mysqladmin

在mysql数据库中创建一个User表

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

创建User表的映射实体类User

public class User {

private Long id;
private String name;
private int age;

public Long getId() {
return id;
}

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

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

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

}

创建UserMapper

@MapperScan
public interface UserMapper {

@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);

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

}

进行单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class) //DemoApplication为该项目的入口类
public class DemoApplicationTests {

@Autowired
private UserMapper userMapper;

@Test
public void find() throws Exception {
userMapper.insertUser("126", 16);
User u = userMapper.findByName("126");
Assert.assertEquals(16, u.getAge());
}
}

二、使用Spring和mybatis的整合方式

在这里我使用了通用Mapper

首先,建立一个Spring Boot项目

导入相关的依赖

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
      

        <!-- 通用Mapper -->
        <dependency>
            <groupId>com.github.abel533</groupId>
            <artifactId>mapper</artifactId>
            <version>2.3.4</version>
        </dependency>


        <!-- 连接池 -->
        <dependency>
            <groupId>com.jolbox</groupId>
            <artifactId>bonecp-spring</artifactId>
            <version>0.8.0.RELEASE</version>
        </dependency>        

在application.properties配置mysql的连接配置

spring.datasource.type=com.jolbox.bonecp.BoneCPDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=mysqladmin
使用bonecp连接池,spring.datasource.type=com.jolbox.bonecp.BoneCPDataSource

创建mybatis的配置类MybatisConfig

import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;

@Configuration
public class MybatisConfig {

    @Autowired
    private DataSource dataSource;


    @Bean
    @ConditionalOnMissingBean //当容器没有指定的Bean的情况下创建该对象
    public SqlSessionFactoryBean sqlSessionFactoryBean(){

        SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();

        //设置数据源
        sqlSessionFactoryBean.setDataSource(dataSource);
        //设置mybatis的主配置文件
        ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver();
        Resource mybatisXml=resourcePatternResolver.getResource("classpath:mybatis-config.xml");
        sqlSessionFactoryBean.setConfigLocation(mybatisXml);
        //设置别名包
        sqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.pojo");

        return sqlSessionFactoryBean;
    }
}

建立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" />
    </settings>
    <plugins>
        <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
            <!--主键自增回写方法,默认值MYSQL-->
            <property name="IDENTITY" value="MYSQL" />
            <!--通用Mapper接口,多个通用接口用逗号隔开 -->
            <property name="mappers" value="com.github.abel533.mapper.Mapper" />
        </plugin>
    </plugins>
</configuration>

建立Mapper接口的扫描类MapperScannerConfig

import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@AutoConfigureAfter(MybatisConfig.class) //保证在MyBatisConfig实例化之后再实例化该类
public class MapperScannerConfig {

/*
mapper接口的扫描器
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer=new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.demo.mapper");
return mapperScannerConfigurer;
}

}

创建User表的映射实体类User

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

}

创建UserMapper接口

import com.example.demo.pojo.User;
import com.github.abel533.mapper.Mapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface UserMapper extends Mapper<User> {

    @Select("select * from user where name = #{name}")
    User findByName(@Param("name") String name);

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

}

单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class) //DemoApplication为该项目的入口类
public class DemoApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void find() throws Exception {
        User user=new User();
        user.setName("ceshi");
        user.setAge(19);
        userMapper.insertSelective(user);
        User u = userMapper.findByName("126");
        Assert.assertEquals(16, u.getAge());
    }
}

目录结构如下:

Spring Boot整合mybatis