SpringBoot整合Mybatis

SpringBoot集成Mybatis实战

mybatis是一款优秀的持久层框架,支持定制化SQL,存储过程和高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

起步

SpringBoot可以通过MyBatis-Spring-Boot-Starter,快速集成Mybatis,只需在maven中引入依赖

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

mybatis-spring-boot-starter提供了以下功能:

  • 自动检测现有数据源
  • 创建并注册SQLSessionFactory的实例,该实例使用SqlSessionFactoryBean将该数据源作为输入
  • 创建并注册在SqlSessionFactory中获取的SqlSessionTemplate实例
  • 自动扫描Mapper并链接到SqlSessionTemplate,并将它们注册到Spring上下文中,这样它们就能在Bean中被注入

    引入依赖之后,还需要在配置文件中添加JDBC基本的配置

mybatis:
  type-aliases-package: org.boot.mybatis.model
  type-handlers-package: org.boot.mybatis.typehandler
  configuration:
    map-underscore-to-camel-case: true
    default-fetch-size: 100
    default-statement-timeout: 30
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: root
    username: root
    url: jdbc:mysql://localhost:3306/test

这里使用了MySQL作为数据源,但是请注意这里的driver-class-name和以前的已经不一样了, com.mysql.cj.jdbc.Driver是mysql-connector-java6中的新驱动名称,如果使用老版本的mysql-connector-java,名称还是com.mysql.jdbc.Driver

配置完成之后,编写数据访问层(DAO),也就是Mybatis文档上写的Mapper,提供对User表的CRUD操作,这里使用的是注解的方式,需要在类名上添加@Mapper注解

@Mapper
public interface UserMapper &#123;
    /**
     * 根据ID查询用户
     *
     * @param id
     * @return
     */
    @Select("select * from user where id = #&#123;id&#125;")
    User findById(Integer id);

    /**
     * 添加一条用户数据
     *
     * @param user
     */
    @Insert("insert into user(name, password, state, address, email) values (#&#123;name&#125;, #&#123;password&#125;, #&#123;state&#125;, #&#123;address&#125;, #&#123;email&#125;)")
    void insert(User user);

    /**
     * 更新用户数据
     *
     * @param user
     */
    @Update("update user set name=#&#123;name&#125;,password=#&#123;password&#125;,state=#&#123;state&#125;,address=#&#123;address&#125;,email=#&#123;email&#125; where id=#&#123;id&#125;")
    void update(User user);

    @Delete("delete from user where id = #&#123;id&#125;")
    void delete(Integer id);

    /**
     * 查询指定状态的用户列表
     *
     * @param state
     * @return
     */
    @Select("select * from user where id = #&#123;state&#125;")
    List<User> selectList(Integer state);
&#125;

编写测试方法对Mapper进行简单的测试

public class UserTest extends BootMybatisApplicationTests &#123;
    private static final Logger LOGGER = LoggerFactory.getLogger(UserTest.class);
    @Resource
    private UserMapper userMapper;

    @Test
    public void testInsertUser() &#123;
        User user = new User();
        user.setName("thor");
        user.setPassword("1234");
        user.setAddress("Cheng Du");
        user.setEmail("1234@gmail.com");
        user.setState(1);
        userMapper.insert(user);
    &#125;

    @Test
    public void testUpdateUser() &#123;
        User user = new User();
        user.setId(1);
        user.setName("thor");
        user.setPassword("123456");
        user.setAddress("Cheng Du");
        user.setEmail("1234@gmail.com");
        user.setState(1);
        userMapper.update(user);
    &#125;

    @Test
    public void testFindById() &#123;
        User user = userMapper.findById(1);
        Assert.assertNotEquals(user, null);
        LOGGER.info(user.toString());
    &#125;

    @Test
    public void testDeleteUser() &#123;
        userMapper.delete(2);
    &#125;

    @Test
    public void testSelectList() &#123;
        List<User> list = userMapper.selectList(1);
        LOGGER.info(list.toString());
    &#125;
&#125;

End

本文使用SpringBoot集成了Mybatis,但只简单的使用了Mybatis,编写了一个单表的栗子,使用的也是Annotation的形式,在日常开发中还是xml+interface的形式更方便编码。实际上Mybatis的功能非常强大,本文没有写出来,感兴趣请查阅官方文档。


   转载规则

本文不允许转载。
 上一篇
编写自己的spring-boot-starter 编写自己的spring-boot-starter
编写自己的spring-boot-starter 如今越来越多的Java应用都开始使用SpringBoot进行构建了,SpringBoot的一大特性就是它的约定大于配置,只需在pom.xml中加入对应的starter依赖,即可完成自动配置。
2019-07-17
下一篇 
使用Java枚举类优化工厂方法 使用Java枚举类优化工厂方法
使用Java枚举类优化工厂方法背景 最近在工作中遇到一个需求,需要把不同的统计报表导出成csv文件,经过一系列抽象过后,发现不同的导出类型,还是需要不同的service来进行处理,这样就会导致工厂方法存在大量的if else或者switch
2019-03-15
  目录