Mapper简介及其xml文件中的字段说明

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u012431703/article/details/100533753

什么是通用mapper?

通用mapper 可以极大的方便我们开发人员进行ORM,提供极其方便的单表CRUD。
那什么又是通用mapper,简单说,它就是个辅助mybatis极简单表开发的组件。

它不是为了替代mybatis,而是让mybatis的开发更方便。

我们可以按照自己的需要选择通用方法,还能很方便的开发自己的通用方法。

为什么要用通用mapper?

原生Mybatis的痛点

1、mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改

2、需要自己实现sql分页,select * from table where . . . limit 1,3 自己手写分页,除了传参page、pageSize,还需要返回条目总数count。

3、数据库可移植性差:如果项目更换数据库,比如oracle-->mysql,mapper.xml中的sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。

4、生成的代码量过大。

5、批量操作,批量插入,批量更新,需要自写。


select元素中有很多属性(这里简单说下常用的):

  • id:命名空间唯一标识,可以被用来引用这条语句
  • parameterType:将会传入这条语句的参数类的完全限定名
  • resultType:从这条语句要返回的期望类型的类的完全限定名或别名【这里需要注意下集合类型,集合可以包含的类型,不能是集合本身】
  • resultMap:命名引用外部的resultMap,其名称要和外部的resultMap元素中的id名称一致,主要是用于将其结果映射到实体类中指定的对象。
  • 重要:resultType和resultMap不能同时使用。

那我们什么时候使用resultMap,什么时候又使用resultType呢?

①当我们去select一张表时,可以使用resultType,这些情况下,MyBatis会在幕后自动创建一个ReusltMap,基于属性名来映射到JavaBean属性上,所以在使用resultMap时,就必须要写上resultMap相对应的xml

②为了方便开发,一般在没有特别要求的情况下,个人建议可以将column名和property名称完全写成一致,若不写成一致,则colum只需对应数据库中字段,property只需对应我们实体类中的自定义的字段即可(感觉有点绕,多写几次就熟悉了),否则当我们数据库中字段和实体类中字段有任何一个字段没有对应上,数据库就匹配不到,后台自然会报错。

③在sql中比如有 andm.id = #{id ,jdbcType=VARCHAR }时,我们就需要标明jdbcType【原因是:当我们映射了一个javabean,MyBatis通常可以自动匹配类型】


通用Mapper和分页插件代码如下:

                                      /**
                                           * 编写通用Mapper的思路和方法
                                           * 1.先获取调用的方法com.jt.manage.mapper.ItemMapper.findTextCount()
                                           * 2.通过反射先获取com.jt.manage.mapper.ItemMapper
                                           * 3.获取当前类的父级接口
                                           * 4.判断父级接口是不是泛型
                                           
* 5.从泛型中获取Item对象
                                           
* 6.获取Item的@Table注解
                                           
* 7.获取表的名称
                                           
* 8.编写sql语句实现数据查询
                                          */

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<settings>
		<!-- 开启驼峰自动映射 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
		<!-- 二级缓存的总开关,被redis替代 -->
		<setting name="cacheEnabled" value="false" />
	</settings>
	<plugins>
		<!-- 分页插件:com.github.pagehelper为PageHelper类所在包名 -->
		<plugin interceptor="com.github.pagehelper.PageHelper">
			<!-- 方言 -->
			<property name="dialect" value="mysql" />
			<!-- 该参数默认为false -->
			<!-- 设置为true时,使用RowBounds分页会进行count查询,查询数据总条数 -->
			<property name="rowBoundsWithCount" value="true" />
		</plugin>
		
		<!-- 通用Mapper插件 -->
		<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
			<!--主键自增回写方法,默认值MYSQL,详细说明请看文档 -->
			<property name="IDENTITY" value="MYSQL" />
			<!--通用Mapper接口,多个通用接口用逗号隔开 -->
			<property name="mappers" value="com.jt.common.mapper.SysMapper" />
		</plugin>
	</plugins>
</configuration>

eg:通用Mapper高级案例

package com.epoch.newjiyuan.mapper;

import java.util.List;

import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

public interface SysMapper<T> {
	
	//该方法是测试方法,不具有通用性 
	@SelectProvider(type=SysMapperProvider.class,method="dynamicSQL")
	int TextFindCount();
	
    /**
     * 根据主键ID批量删除
     * 
     * @param key
     * @return
     */
    @DeleteProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int deleteByIDS(@Param("ids") Object[] key);

    /**
     * 根据实体类不为null的字段进行查询,条件全部使用=号and条件
     * 
     * @param record
     * @return
     */
    @SelectProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    List<T> select(T record);

    /**
     * 根据实体类不为null的字段查询总数,条件全部使用=号and条件
     * 
     * @param record
     * @return
     */
    @SelectProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int selectCount(T record);

    /**
     * 根据主键进行查询,必须保证结果唯一 单个字段做主键时,可以直接写主键的值 联合主键时,key可以是实体类,也可以是Map
     * 
     * @param key
     * @return
     */
    @SelectProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    T selectByPrimaryKey(Object key);

    /**
     * 插入一条数据 支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写) 优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
     * 
     * @param record
     * @return
     */
    @InsertProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int insert(T record);

    /**
     * 插入一条数据,只插入不为null的字段,不会影响有默认值的字段 支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
     * 优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
     * 
     * @param record
     * @return
     */
    @InsertProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int insertSelective(T record);

    /**
     * 根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
     * 
     * @param key
     * @return
     */
    @DeleteProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int delete(T key);

    /**
     * 通过主键进行删除,这里最多只会删除一条数据 单个字段做主键时,可以直接写主键的值 联合主键时,key可以是实体类,也可以是Map
     * 
     * @param key
     * @return
     */
    @DeleteProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int deleteByPrimaryKey(Object key);

    /**
     * 根据主键进行更新,这里最多只会更新一条数据 参数为实体类
     * 
     * @param record
     * @return
     */
    @UpdateProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int updateByPrimaryKey(T record);

    /**
     * 根据主键进行更新 只会更新不是null的数据
     * 
     * @param record
     * @return
     */
    @UpdateProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int updateByPrimaryKeySelective(T record);

}

猜你喜欢

转载自blog.csdn.net/u012431703/article/details/100533753