spring boot集成mybatis

这里以操作之前的learnmybatis这个数据库为例进行演示。

数据库表,如果之前已经创建了,则无需再次创建:

    CREATE TABLE `learnmybatis`.`t_student` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) NULL,
  `age` INT NULL,
  `score` DOUBLE NULL,
  PRIMARY KEY (`id`));

添加mybatis相关依赖

因为要使用mybatis了,所以需要添加相关的起步依赖,可以手动拷贝下面起步依赖到pom中,另外后面示例使用web来演示所以还需要添加web起步依赖

    <!-- 加载mybatis整合springboot -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version> 2.1.2</version>
    </dependency>

    <!-- MySQL的jdbc驱动包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- springboot 开发自动热部署 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    <!-- alibaba的druid数据库连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.20</version>
    </dependency>

在pom中加入下面内容使maven将xml文件也添加到target目录下,否则在运行mybatis的时候会报找不到xml文件的错误,这里还有另一种方式,后面再介绍:

<resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

添加数据源相关配置

spring 2.x默认支持hikari的数据源,这是一个日语,中文是光的意思,通过名字可以体现出它非常快。这里的话,我们使用国产的druid作为数据源,druid提供了一系列的监控,方便我们查看,另外也支持一下国产。

在application.properties配置文件中添加下面内容:

#指定mapper文件的位置
mybatis.mapper-locations=classpath:com/monkey1024/mapper/*.xml
#指定bean的位置
mybatis.type-aliases-package=com.monkey1024.bean

#数据源
spring.datasource.username=root
spring.datasource.password=111111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/learnmybatis?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#查看sql语句日志
logging.level.com.monkey1024.mapper=debug

注意上面的serverTimezone=Asia/Shanghai,这里如果写成serverTimezone=UTC或者GMT的话,在插入或更新数据的时候,日期可能会有问题,因为我们中国所在的时区是东八区。

创建Student类

下面省略了set和get方法

public class Student {

    private Integer id;

    private String name;

    private Integer age;

    private Double score;
}

创建mapper和dao接口

StudentMapper.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.monkey1024.mapper.StudentMapper">

    <!--查询多条数据-->
    <select id="selectAllStudent" resultType="student">
        SELECT id,name,age,score FROM t_student
    </select>


</mapper>

dao接口,与之前不同的是这里需要在接口上面加上Mapper注解

@Mapper//在dao接口上加入Mapper注解,这样springboot就可以扫描到
public interface StudentMapper {
    List<Student> selectAllStudent();
}

创建service和controller

service实现类:

@Service
public class StudentServiceImpl implements StudentService{

    @Autowired
    private StudentMapper studentMapper;


    @Override
    public List<Student> selectAllStudent() {
        System.out.println("测试");
        return studentMapper.selectAllStudent();
    }
}

controller:

@Controller
public class MybatisController {

    @Autowired
    private StudentService studentService;

    @RequestMapping("/find")
    @ResponseBody
    public Object findAllStudent() {
        return studentService.selectAllStudent();
    }
}

之后运行spring boot启动类,在浏览器中发送请求即可。

@MapperScan注解

在上面的dao接口中,我们添加了@mapper注解,这样spring boot就可以扫描到该接口从而使用mybatis动态代理了。除了这种方式之外,可以在spring boot的启动类上添加@MapperScan注解,这样就无需再dao接口上添加@mapper注解了。

@SpringBootApplication
@MapperScan("com.monkey1024.mapper")//扫描mapper文件
public class Application {

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

}

开启事务

在spring boot中开启事务也非常简单通过下面两步即可

1.在入口类中使用注解 @EnableTransactionManagement 开启事务支持

@SpringBootApplication
@EnableTransactionManagement //开启事务支持
public class Application {

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

}

2.在访问数据库的Service方法上添加注解 @Transactional 即可

@Service
@Transactional//开启事务
public class StudentServiceImpl implements StudentService{

    @Autowired
    private StudentMapper studentMapper;


    @Override
    public List<Student> selectAllStudent() {
        System.out.println("测试");
        return studentMapper.selectAllStudent();
    }
}

使用lombok

在之前所编写的代码中,我们写了很多bean,这里面加了很多set、get方法,这些方法冗余,但却也不可缺少。这里我们可以使用lombok包,通过该工具,就不用在bean源码中手动添加set、get方法了,除此之外equals,hashcode,toString方法也无需手动在源码中添加了。lombok会在生成的bean的class字节码中添加这些方法,在使用lombok之后,代码就清爽多了。

要使用lombok需要先添加依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

在idea中添加lombok插件,ctrl+alt+s打开设置,在plugins中搜索lombok:

lombok插件

 

插件安装完成之后,在Student类上面加上@Data注解,然后set、get等方法就可以去掉了:

import lombok.Data;

@Data
public class Student {

    private Integer id;

    private String name;

    private Integer age;

    private Double score;
}

mapper放到resources目录下

在之前的pom中我们加了让maven将xml文件也编译放到target目录下的代码,除了将mapper放到dao包下这种方式之外,还可以直接将mapper文件放到resources下。在resources下创建mappers目录,然后将mapper.xml文件放到这个目录下。

修改配置文件,指定mapper文件路径:

#指定mapper文件的位置
mybatis.mapper-locations=classpath:mappers/*.xml

删除配置

这样修改之后,之前在pom文件中的这部分代码就可以删除了:

<resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>