Spring Boot使用MyBatis连接数据库

MyBatis Github上代码地址:https://github.com/mybatis/mybatis-spring-boot

关于在Spring Boot中集成MyBatis,可以选用基于注解的方式,也可以选择xml文件配置的方式。通过对两者进行实际的使用,还是建议使用XML的方式(官方也建议使用XML)。

一、通过xml配置文件方式

1、添加pom依赖

1
2
3
4
5
6
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <!-- 请不要使用1.0.0版本,因为还不支持拦截器插件,使用最新版本即可 -->
    <version>3.4.5</version>
</dependency>

2、创建接口Mapper和对应的Mapper.xml文件

定义相关方法,注意方法名称要和Mapper.xml文件中的id一致,这样会自动对应上

StudentMapper.java:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.ntan520.sample.mapper;
 
import java.util.List;
 
import com.ntan520.sample.entity.Student;
 
/**
 * StudentMapper,映射SQL语句的接口,无逻辑实现
 */public interface StudentMapper extends MyMapper<Student> {
 
    List<Student> likeName(String name);
 
    Student getById(int id);
 
    String getNameById(int id);
}

MyMapper.java:

01
02
03
04
05
06
07
08
09
10
11
ackage com.ntan520.sample.config.mybatis;
 
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
 
/**
 * 被继承的Mapper,一般业务Mapper继承它
 */public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
    //TODO
    //FIXME 特别注意,该接口不能被扫描到,否则会出错
}

StudentMapper.xml:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="com.ntan520.sample.mapper.StudentMapper">
    <!-- type为实体类Student,包名已经配置,可以直接写类名 -->
    <resultMap type="Student" id="stuMap">
        <id property="id" column="id" />
        <result property="name" column="name" />
        <result property="sumScore" column="score_sum" />
        <result property="avgScore" column="score_avg" />
        <result property="age" column="age" />
    </resultMap>
 
    <select id="getById" resultMap="stuMap" resultType="Student">
        SELECT *
        FROM STUDENT
        WHERE ID = #{id}
    </select>
 
    <select id="likeName" resultMap="stuMap" parameterType="string" resultType="list">
        SELECT *
        FROM STUDENT
        WHERE NAME LIKE CONCAT('%',#{name},'%')
    </select>
 
    <select id="getNameById" resultType="string">
        SELECT NAME
        FROM STUDENT
        WHERE ID = #{id}
    </select>
</mapper>

3、实体类

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
package com.ntan520.sample.entity;
 
import java.io.Serializable;
 
/**
 * 学生实体
 */public class Student implements Serializable {
 
    private static final long serialVersionUID = 2120869894112984147L;
 
    private int id;
    private String name;
    private String sumScore;
    private String avgScore;
    private int age;
 
    // get set 方法省略
}

4、修改application.properties 配置文件

1
2
mybatis.mapper-locations=classpath*:com/ntan520/sample/mapper/sql/mysql/*Mapper.xml
mybatis.type-aliases-package=com.ntan520.sample.entity

5、在Controller或Service调用方法测试

1
2
3
4
5
6
7
@Autowired
private StudentMapper stuMapper;
 
@RequestMapping("/likeName")
public List<Student> likeName(@RequestParam String name){
    return stuMapper.likeName(name);
}

二、使用注解方式

1、启动类中添加@MapperScan注解

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@SpringBootApplication
@MapperScan("com.ntan520.mapper")
public class SampleMybatisApplication implements CommandLineRunner {
 
    @Autowired
    private CityMapper cityMapper;
 
    public static void main(String[] args) {
        SpringApplication.run(SampleMybatisApplication.class, args);
    }
 
    @Override
    public void run(String... args) throws Exception {
        System.out.println(this.cityMapper.findByState("CA"));
    }
}

2、在接口上使用注解定义CRUD语句

01
02
03
04
05
06
07
08
09
10
11
12
13
14
package com.ntan520.mapper;
 
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
 
import com.ntan520.domain.City;
 
/**
 * @author Eddú Meléndez
 */public interface CityMapper {
 
    @Select("SELECT * FROM CITY WHERE state = #{state}")
    City findByState(@Param("state") String state);
}

其中City就是一个普通Java类。

三、集成分页插件

这里与其说集成分页插件,不如说是介绍如何集成一个plugin。MyBatis提供了拦截器接口,可以实现自己的拦截器,将其作为一个plugin装入到SqlSessionFactory中。

Github上有位开发者写了一个分页插件,使用起来还可以,挺方便的。

Github项目地址: https://github.com/pagehelper/Mybatis-PageHelper

Spring在依赖注入bean的时候,会把所有实现MyBatis中Interceptor接口的所有类都注入到SqlSessionFactory中,作为plugin存在。既然如此,集成一个plugin便很简单了,只需要使用@Bean创建PageHelper对象即可。

使用方法:

1、添加pom依赖

1
2
3
4
5
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.0</version>
</dependency>

2、新增MyBatisConfiguration.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.ntan520.sample.config;
 
import java.util.Properties;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import com.github.pagehelper.PageHelper;
 
/**
 * MyBatis 配置
 */@Configuration
public class MyBatisConfiguration {
 
    private static final Logger logger = LoggerFactory.getLogger(MyBatisConfiguration.class);
 
    @Bean
    public PageHelper pageHelper() {
        logger.info("注册MyBatis分页插件PageHelper");
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("offsetAsPageNum", "true");
        p.setProperty("rowBoundsWithCount", "true");
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }
}

3、分页查询测试

1
2
3
4
5
@RequestMapping("/likeName")
public List<Student> likeName(@RequestParam String name){
    PageHelper.startPage(1, 1);
    return stuMapper.likeName(name);
}

更多参数使用方法,详见PageHelper说明文档

四、HikariCP

SpringBoot默认使用org.apache.tomcat.jdbc.pool.DataSource,还有个HikariCP的JDBC连接池组件,据说其性能比常用的 c3p0、tomcat、bone、vibur这些要高很多。

把工程中的DataSource变更为HirakiDataSource,做法很简单: 

首先在application.properties配置文件中指定dataSourceType

1
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

然后在pom中添加Hikari的依赖

1
2
3
4
5
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <!-- 版本号可以不用指定,Spring Boot会选用合适的版本 -->
</dependency>

发表评论

欢迎阅读『Spring Boot使用MyBatis连接数据库|Java、开发语言、数据存储、数据库、框架算法|Nick Tan-梓潼Blog』