Статьи

SpringBoot: работа с MyBatis

MyBatis — это платформа SQL Mapping с поддержкой пользовательских SQL, хранимых процедур и расширенных отображений.

SpringBoot не предоставляет официальной поддержки интеграции с MyBatis, но сообщество MyBatis создало стартовую версию SpringBoot для MyBatis.

Вы можете прочитать об объявлении о выпуске SpringBoot MyBatis Starter по адресу http://blog.mybatis.org/2015/11/mybatis-spring-boot-released.html, а также изучить исходный код на GitHub https://github.com. / mybatis / mybatis-spring-boot .

Создайте проект SpringBoot Maven и добавьте следующую зависимость MyBatis Starter.

1
2
3
4
5
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

Мы будем повторно использовать файлы User.java, schema.sql и data.sql, созданные в моей предыдущей статье SpringBoot: Работа с JdbcTemplate

Создайте MyBatis SQL Mapper интерфейс UserMapper.java с несколькими операциями с базой данных следующим образом:

1
2
3
4
5
6
7
8
package com.sivalabs.demo.domain;
 
public interface UserMapper
{
    void insertUser(User user);
    User findUserById(Integer id);
    List<User> findAllUsers();
}

Нам необходимо создать XML-файлы Mapper, чтобы определить запросы для сопоставленных операторов SQL для соответствующих методов интерфейса Mapper.

Создайте файл UserMapper.xml в каталоге src / main / resources / com / sivalabs / demo / mappers / :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
<mapper namespace="com.sivalabs.demo.mappers.UserMapper">
 
    <resultMap id="UserResultMap" type="User">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="email" property="email" />
    </resultMap>
 
    <select id="findAllUsers" resultMap="UserResultMap">
        select id, name, email from users
    </select>
 
    <select id="findUserById" resultMap="UserResultMap">
        select id, name, email from users WHERE id=#{id}
    </select>
 
    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        insert into users(name,email) values(#{name},#{email})
    </insert>
</mapper>

Несколько вещей, чтобы наблюдать здесь:

  • Пространство имен в Mapper XML должно совпадать с полным именем (FQN) для интерфейса Mapper
  • Значения идентификатора оператора должны совпадать с именами методов интерфейса Mapper.
  • Если имена столбцов результата запроса отличаются от имен свойств бина, мы можем использовать конфигурацию <resultMap> для обеспечения соответствия между именами столбцов и соответствующими им именами свойств бина.

MyBatis также предоставляет конфигурации запросов на основе аннотаций без необходимости использования Mapper XML.

Мы можем создать интерфейс UserMapper.java и настроить сопоставленные SQL с помощью аннотаций следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public interface UserMapper
{
    @Insert("insert into users(name,email) values(#{name},#{email})")
    @SelectKey(statement="call identity()", keyProperty="id",
    before=false, resultType=Integer.class)
    void insertUser(User user);
 
    @Select("select id, name, email from users WHERE id=#{id}")
    User findUserById(Integer id);
 
    @Select("select id, name, email from users")
    List<User> findAllUsers();
 
}

SpringBoot MyBatis Starter предоставляет следующие параметры конфигурации MyBatis, которые мы можем использовать для настройки параметров MyBatis.

1
2
3
4
5
6
mybatis.config = mybatis config file name
mybatis.mapperLocations = mappers file locations
mybatis.typeAliasesPackage = domain object's package
mybatis.typeHandlersPackage = handler's package
mybatis.check-config-location = check the mybatis configuration exists
mybatis.executorType = mode of execution. Default is SIMPLE

Сконфигурируйте typeAliasesPackage и mapperLocations в application.properties.

1
2
mybatis.typeAliasesPackage=com.sivalabs.demo.domain
mybatis.mapperLocations=classpath*:**/mappers/*.xml

Создайте класс точки входа SpringbootMyBatisDemoApplication.java.

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@MapperScan("com.sivalabs.demo.mappers")
public class SpringbootMyBatisDemoApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(SpringbootMyBatisDemoApplication.class, args);
    }
}

Обратите внимание, что мы использовали аннотацию @MapperScan («com.sivalabs.demo.mappers»), чтобы указать, где искать интерфейсы Mapper.

Теперь создайте тестовый класс JUnit и протестируйте наши методы UserMapper.

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
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SpringbootMyBatisDemoApplication.class)
public class SpringbootMyBatisDemoApplicationTests
{
    @Autowired
    private UserMapper userMapper;
 
    @Test
    public void findAllUsers() {
        List<User> users = userMapper.findAllUsers();
        assertNotNull(users);
        assertTrue(!users.isEmpty());
    }
 
    @Test
    public void findUserById() {
        User user = userMapper.findUserById(1);
        assertNotNull(user);
    }
 
    @Test
    public void createUser() {
        User user = new User(0, "Siva", "[email protected]");
        userMapper.insertUser(user);
        User newUser = userMapper.findUserById(user.getId());
        assertEquals("Siva", newUser.getName());
        assertEquals("[email protected]", newUser.getEmail());
    }
}