通用Mapper 简单入门

295 阅读2分钟

链接

官网:mapper.mybatis.io/

简介

简化开发中重复的CRUD Mapper代码,Mybatis Plus或者JPA中都已经实现,适用于仅仅使用Mybatis的同学。

场景

架构初期选择时,考虑Mybatis Plus,但是由于过于灵活,分层不是很清晰,故放弃。考虑使用JPA,但是需求中需要使用复杂查询和动态判断,故放弃。所以仅使用Mybatis,由于在使用Mybatis-generator生成了大量重复的CRUD代码,所有使用通用Mapper,可以简化代码,更优雅的实现。

使用

集成通用Mapper

implementation group: 'io.mybatis', name: 'mybatis-mapper', version: '1.2.2'

使用时在Dao层集成Mapper类即可

package com.lv.testmp.dao;

import com.lv.testmp.entity.User;
import io.mybatis.mapper.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserDao extends Mapper<User, Long> {

    List<User> selectUserList();
}

Entity 需要特别说明:Entity中需要使用注解指定Entity所对应的表明和列明,如果不指定,默认会查找与类名和字段名完全相同的表名字段名去匹配。因为Java 类名大写,且大多数使用驼峰命名法,数据库表名小写,且大多使用蛇形命名法,所以基本无法默认匹配,建议每一个Entity都进行手动对应。

package com.lv.testmp.entity;

import io.mybatis.provider.Entity;
import lombok.Data;
import java.util.Date;

@Data
@Entity.Table("users")
public class User {

    @Entity.Column(id = true)
    private Long id;

    @Entity.Column("name")
    private String name;

    @Entity.Column("email")
    private String email;

    @Entity.Column("mobile")
    private String mobile;

    @Entity.Column("age")
    private Short age;

    @Entity.Column("address")
    private String address;

    @Entity.Column("create_time")
    private Date createTime;

    @Entity.Column("last_update_time")
    private Date lastUpdateTime;

}

至此我们可以删除掉Mybatis mapper.xml中的CRUD方法了,直接调用基础方法

<?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.lv.testmp.dao.UserDao">
  <resultMap id="BaseResultMap" type="com.lv.testmp.entity.User">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="mobile" jdbcType="VARCHAR" property="mobile" />
    <result column="age" jdbcType="SMALLINT" property="age" />
    <result column="address" jdbcType="VARCHAR" property="address" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="last_update_time" jdbcType="TIMESTAMP" property="lastUpdateTime" />
  </resultMap>
  <sql id="Base_Column_List">
    id, name, email, mobile, age, address, create_time, last_update_time
  </sql>

  <select id="selectUserList" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from users
  </select>
</mapper>
import com.lv.testmp.dao.UserDao;
import com.lv.testmp.entity.User;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class UserService {

    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    public List<User> getUserList() {
        Optional<User> user = userDao.selectByPrimaryKey(1L);
        System.out.println(user.get());
        return userDao.selectUserList();
    }
}

可以看到日志中已经打印出查询的用户信息

2022-06-15 10:42:27.609  INFO 19640 --- [nio-9001-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-06-15 10:42:27.610  INFO 19640 --- [nio-9001-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-06-15 10:42:27.611  INFO 19640 --- [nio-9001-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
User(id=1, name=admin, email=test@126.com, mobile=18000001111, age=18, address=Dalian LvShun, createTime=Mon Jun 13 17:30:23 CST 2022, lastUpdateTime=Mon Jun 13 17:30:23 CST 2022)
2022-06-15 10:42:27.742 DEBUG 19640 --- [nio-9001-exec-1] 

注意

以前的tk.mybatis作者重新开发了最新版的通用mapper,io.mybatis,具体使用和特性可以看官网

转载需注明出处,抄袭必究