mybatis、mybatis-plus、ibatis註解使用對比

mybatis操作數據的實現方式主要分爲三種

1、通過原生的方式配置xml操作數據

2、通過繼承mapper接口操作數據,mapper接口操作數據有多種方式,如 tk.mybatis、mybatis-plus,本文使用mybatis-plus

3、通過註解方式操作數據,例如使用 @SelectProvider註解動態拼裝sql查詢數據,適用於複雜的sql查詢

以下示例三種實現方式,以springboot項目爲例

目錄

一、xml實現數據操作

1、引入相關的pom文件

2、配置yml

3、建立實體類,mapper接口,service類,控制類,mybatis xml文件

二、mapper接口操作數據

1、引入相關pom文件

2、配置yml:

3、建立實體類,mapper接口,控制類等

三、ibatis註解操作數據

建立實體類,mapper接口,provider類,控制類


一、xml實現數據操作

1、引入相關的pom文件

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

2、配置yml

mybatis:
  mapper-locations: classpath:mybatis/*.xml
  #配置打印sql
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3、建立實體類,mapper接口,service類,控制類,mybatis xml文件

實體類:

@Data
public class SysRole {
    private Integer roleId;

    private String roleName;

    private String roleKey;

    private String roleSort;

    private String dataScope;

    private String status;

    private String delFlag;

    private String createBy;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

    private String updateBy;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;

    private String remark;
}

mapper接口:

public interface SysRoleMapper  {

    public List<SysRole> list();

    public List<SysRole> getByRoleName(SysRole sysRole);

    /**
     * @description: 單參數數組
     * @param: [ids]
     * @return: java.util.List<com.cp.entity.SysRole>
     * @author: chenping
     * @date: 2019/10/31
     */
    public List<SysRole> getByArrayIds(String[] ids);

    public List<SysRole> selectLikeWithBind(String roleName);


    int insert(SysRole sysRole);
}

mybatis xml:

<?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.cp.mapper.SysRoleMapper">
    <resultMap type="com.cp.entity.SysRole" id="sysRole">
        <id property="roleId" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleKey" column="role_key"/>
        <result property="roleSort" column="role_sort"/>
        <result property="dataScope" column="data_scope"/>
        <result property="status" column="status"/>
        <result property="delFlag" column="del_flag"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="remark" column="remark"/>
    </resultMap>

    <select id="list" resultMap="sysRole">
        select * from sys_role
    </select>

    <select id="getByRoleName" parameterType="com.cp.entity.SysRole" resultMap="sysRole">
        select * from sys_role where 1 = 1
        <if test=" roleName != null and roleName != ''">
            and role_name like concat('%',#{roleName},'%')
        </if>

        <!--          等同於上面,where內的條件成立則拼接sql,反之不執行-->
        <!--        select * from sys_role-->
        <!--        <where>-->
        <!--            <if test=" roleName != null and roleName != ''" >-->
        <!--                and role_name like concat('%',#{roleName},'%')-->
        <!--            </if>-->
        <!--        </where>-->

    </select>

    <!-- foreach select  -->
    <select id="getByArrayIds" parameterType="String" resultMap="sysRole">
        select * from sys_role where role_id in
        <foreach collection="array" item="ids" index="index" open="(" separator="," close=")">
            #{ids}
        </foreach>
    </select>

    <!--        bind模糊查詢,兼容不同的數據庫-->
    <select id="selectLikeWithBind" parameterType="String" resultMap="sysRole">
        <bind name="pattern" value=" '%' + roleName + '%' "/>
        select * from sys_role where role_name like #{pattern}
    </select>

    <insert id="insert" parameterType="com.cp.entity.SysRole" >
        insert into sys_role (role_key,role_sort,data_scope)
        values ( #{roleKey},#{roleSort},#{dataScope} )
    </insert>
</mapper>

控制類:

@RestController
@Slf4j
@RequestMapping("/xml")
public class XmlMybatisSysRoleController {
    @Autowired
    SysRoleService sysRoleService;

    @Autowired
    SysRoleMapper sysRoleMapper;

    @RequestMapping("/sysrole")
    public List<SysRole> sysrole() {
        log.info("1111111111111111111111111");
        return sysRoleService.list();
    }

    @PostMapping("/selectByRoleName")
    public List<SysRole> selectByRoleName(@RequestBody SysRole sysRole) {
        return sysRoleMapper.getByRoleName(sysRole);
    }


    /**
     * @description: string 參數,批量查詢
     * @param: [params]
     * @return: java.util.List<com.cp.entity.SysRole>
     * @author: chenping
     * @date: 2019/10/31
     */
    @GetMapping("/selectByIds")
    public List<SysRole> selectByIds(@RequestParam String params) {
        String[] str = params.split(",");
        return sysRoleMapper.getByArrayIds(str);
    }

    /**
     * @description: mybatis 使用bind模糊查詢,兼容不同的數據庫
     * @param: [roleName]
     * @return: java.util.List<com.cp.entity.SysRole>
     * @author: chenping
     * @date: 2019/11/1
     */
    @GetMapping("/selectLikeWithBind")
    public List<SysRole> selectLikeWithBind(@RequestParam String roleName) {
        return sysRoleMapper.selectLikeWithBind(roleName);
    }

    /** 
     * @Description:  插入
     * @param: sysRole 
     * @return: int 
     * @Author: chenping
     * @Date: 2019/12/5
     **/
    @PostMapping("/insert")
    public int insert(@RequestBody SysRole sysRole) {
        return sysRoleMapper.insert(sysRole);
    }

}

二、mapper接口操作數據

1、引入相關pom文件

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>

2、配置yml:

mybatis-plus:
  mapper-locations: classpath*:mybatis/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3、建立實體類,mapper接口,控制類等

實體類:

@Data
@TableName(value = "user")//指定表名
public class User {
    private Integer id;

    private String name;

    private Integer age;

    @TableField(value = "manager_id")
    private Integer managerId;

    /**
     * 數據庫中不存在的字段
     */
    @Transient
    @TableField(exist = false)
    private String userName;
}

mapper接口:

public interface UserMapper extends BaseMapper<User> {

}

控制類:

@RestController
@RequestMapping("/entity")
public class EntityMybatisPlusUserController {

    @Autowired
    UserMapper userMapper;

    /** 
     * @Description:  通過QueryWrapper查詢
     * @param:  
     * @return: java.util.List<com.cp.entity.User> 
     * @Author: chenping
     * @Date: 2019/12/5
     **/
    @RequestMapping("/getUsers")
    public List<User> getAll() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("manager_id",102);
        return userMapper.selectList(queryWrapper);
//        return userMapper.selectList(null);
    }

    /** 
     * @Description:  通過id查詢
     * @param:  
     * @return: com.cp.entity.User 
     * @Author: chenping
     * @Date: 2019/12/5
     **/
    @RequestMapping("/selectById")
    public User selectById() {
        return userMapper.selectById(101);
    }

    /** 
     * @Description:  通過實體插入
     * @param:  
     * @return: int 
     * @Author: chenping
     * @Date: 2019/12/5
     **/
    @RequestMapping("/insertUsers")
    public int insert() {
        User user = new User();
        user.setId(204);
        user.setAge(66);
        user.setName("cart");
        user.setManagerId(102);
        return userMapper.insert(user);

    }

    /** 
     * @Description:  根據實體帶id更新
     * @param:  
     * @return: int 
     * @Author: chenping
     * @Date: 2019/12/5
     **/
    @RequestMapping("/updateUser")
    public int updateUser() {
        User user = new User();
        user.setId(204);
        user.setAge(55);
        return userMapper.updateById(user);//不傳的字段值不更新


    }

    /** 
     * @Description:  通過map參數查詢
     * @param:  
     * @return: java.util.List<com.cp.entity.User> 
     * @Author: chenping
     * @Date: 2019/12/5
     **/
    @RequestMapping("/getByColumn")
    public List<User> getByColumn() {
        Map<String, Object> columnMap = new HashMap<>();
        columnMap.put("id", 204);//寫表中的列名
        columnMap.put("age", 55);
        return userMapper.selectByMap(columnMap);
    }

    /** 
     * @Description:  根據多個id批量查詢
     * @param:  
     * @return: java.util.List<com.cp.entity.User> 
     * @Author: chenping
     * @Date: 2019/12/5
     **/
    @RequestMapping("/batchSelect")
    public List<User> batchSelect() {
        List<Integer> listIds = new ArrayList<>();
        listIds.add(101);
        listIds.add(102);
        return userMapper.selectBatchIds(listIds);
    }
}

三、ibatis註解操作數據

建立實體類,mapper接口,provider類,控制類

實體類:

@Data
public class Score {

    private String subject;

    private Integer score;

    private Integer stuId;
}

mapper接口:

public interface ScoreMapper {

    @SelectProvider(type = ScoreProvider.class, method = "getListSql")
    public List<ScoreResponse> list(Score score);
}

provider類:

public class ScoreProvider {

    public String getListSql(Score score) {
        StringBuffer sqlList = new StringBuffer();
        sqlList.append(" select subject,score,stu_id as stuId  from score where 1= 1 ");
        return sqlList.toString();
    }
}

控制類:

@RestController
@RequestMapping("/annotation")
public class AnnotationMybatisScoreController {

    @Autowired
    ScoreMapper scoreMapper;

    @RequestMapping("/list")
    public List<ScoreResponse> getList() {
        return scoreMapper.list(null);
    }
}

詳細代碼請參考本人GitHub項目 https://github.com/chenping-1993/springmvc-mybatis

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章