Spring Boot整合mybatis

两盒软妹~` 提交于 2020-03-05 12:47:45

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

@MapperScanpublic 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());
    }
}

目录结构如下:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!