Mybatis插件介绍

  • Mapper
    通用Mapper就是为了解决单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。
    官方文档地址:https://gitee.com/free/Mapper/wikis/Home

导入项目依赖

    <!--mapper-->
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>2.0.2</version>
    </dependency>

    <!--pageHelper-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.5</version>
    </dependency>

编写配置文件

##### 数据库相关配置 #####
spring.datasource.username=root
spring.datasource.password=yzhroot
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=CTT
##### mapper相关配置 #####
# 指明继承mapper相关接口的类,若有多个用逗号隔开
mapper.mappers=training.springboot.mapper.dao.CustomMapper
# 主键自增回写方法,默认值MYSQL
mapper.identity=MYSQL
##### mybatis相关配置 #####
# 支持驼峰式与下划线转换
mybatis.configuration.map-underscore-to-camel-case=true
#### pageHelper相关配置 #####
# 数据库方言
pagehelper.helper-dialect=mysql
# 合理化页数,防止页数大于最大值或者小于0
pagehelper.reasonable=true
# 支持通过mapper接口来传递分页参数
pagehelper.support-methods-arguments=true

编写实体类

/**
 * 用户实体类
 */
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private Date createDate;

    private Department department;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", createDate=" + createDate +
                '}';
    }
}

这里使用的方式与JPA是一样的,其中@Id注解是为了告诉Mapper谁是主键,若没设置主键,在根据主键查询时,所有字段会被作为联合主键查询。

编写持久层代码

/**
 * 自定义的基础mapper
 * @param <T>
 */
public interface CustomMapper<T> extends MySqlMapper<T>, Mapper<T> {
}
@Mapper
public interface UserDao extends CustomMapper<User> {
}

这里的MySqlMapper接口和Mapper接口与JPA中JpaRepository接口类似,都是帮我们实现一些基础的CRUD功能。

测试

@SpringBootTest
class MapperApplicationTests {

    @Autowired
    DepartmentDao departmentDao;

    @Autowired
    UserDao userDao;

    /**
     * mapper相关测试
     */
    //测试批量插入数据
    @Test
    public void testBatchInsertUser(){
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            User user = new User();
            user.setUsername("小明"+(i+1));
            user.setCreateDate(new Date());
            users.add(user);
        }
        userDao.insertList(users);
    }

    //根据主键查询元素
    @Test
    public void testQueryObjByKey(){
        System.out.println(userDao.selectByPrimaryKey(1328));
    }

    //根据id修改元素
    @Test
    public void testUpdateObjByKey(){
        User user = userDao.selectByPrimaryKey(1328);
        System.out.println("修改前:"+ user);
        user.setUsername("小芳");
        userDao.updateByPrimaryKey(user);
        System.out.print("修改后:"+userDao.selectByPrimaryKey(1328));
    }

    //根据id删除元素
    @Test
    public void testDelObjByPriKey(){
        System.out.println(userDao.deleteByPrimaryKey(1328));
    }

    //查询所有元素
    @Test
    public void testQueryAllUsers(){
        System.out.println(userDao.selectAll());
    }

    //插入一条元素,并获取刚插入的主键
    @Test
    public void testInsertUseGeneratedKeysMapper(){
        User user = new User();
        user.setUsername("小刚");
        userDao.insertUseGeneratedKeys(user);
        System.out.println(user.getId());
    }

    //使用Example对象排序
    @Test
    public void testExampleOrderBy(){
        Example example = new Example(User.class);
        example.orderBy("id").asc();
        System.out.println(userDao.selectByExample(example));
    }

    //使用Example对象的动态SQL
    @Test
    public void testExampleSql(){
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("username","小明5");
        System.out.println(userDao.selectByExample(example));
    }

    /**
     * pageHelper使用
     */
    @Test
    public void testPageHelper(){
        PageHelper.startPage(1,10);
        System.out.println(userDao.selectAll());
    }
}

我只是简单的测试了一些基础的功能,若读者有兴趣,可以去参考官方文档。

完整的工程代码链接:https://github.com/youzhihua/springboot-training