该参数只表示一个参数类型,但是如果有多个参数的话,就不要使用该参数了。一个参数的这种其实没有必要写parameterType,而且还有就是多个参数的时候也没有必要写parameterType,也就是说,其实该参数的存在是不是特别必要的。其中@Param和parameterType 二者存其一即可。看名字就能知道ParameterType是按照类型进行匹配,而@Param是按照名字进行匹配。

一.实体类型

1.都不包含
都不包含,则采用类型进行识别。

void mysave(Pac pac);
<insert id="mysave">
        insert into pac(productlevel,satelliteid) values (#{productLevel},#{satelliteID})//#{成员变量名}
</insert>

2.只含parameterType
只包含parameterType,则采用类型进行识别,并按照成员变量名称进行匹配

void mysave(Pac pac);
<insert id="mysave" parameterType="com.example.xmlsax_reader.entity.Pac">
        insert into pac(productlevel,satelliteid) values (#{productLevel},#{satelliteID})//#{成员变量名}
</insert>

3.只含@Param
只包含@Param,要通过参数名字进行访问才行。

void mysave(@Param("pac123") Pac pac);
<insert id="mysave">
        insert into pac(productlevel,satelliteid) values (#{pac123.productLevel},#{pac123.satelliteID})//#{名字.成员变量名}
</insert>

4.都包含
都包含,则默认按照名字进行匹配

void mysave(@Param("pac123") Pac pac);
<insert id="mysave" parameterType="com.example.xmlsax_reader.entity.Pac">
        insert into pac(productlevel,satelliteid) values (#{pac123.productLevel},#{pac123.satelliteID})//#{参数名.成员变量名}
</insert>

二.基本类型

1.只含parameterType
则只按照类型匹配,而不会考虑名字的匹配

Pac myselect(String productLevel);
///测试,不报错。void myselect(String productLevel);
<select id="myselect" parameterType="String" resultType="com.example.xmlsax_reader.entity.Pac">
        select * from pac where productlevel = #{i}
</select>  //#{任意字符}

2.只含有@Param
这种就会只按照名字匹配,而不是按照类型匹配了,如果名字不同,则会异常

 Pac myselect(@Param("param") String productLevel);
<select id="myselect" parameterType="String" resultType="com.example.xmlsax_reader.entity.Pac">
        select * from pac where productlevel = #{param}
</select> //   #{@Param中的参数名称}

3.都不包含
都不包含,则默认按照类型匹配,占位符和一个参数的入参相匹配。

 Pac myselect(String productLevel);
<select id="myselect" resultType="com.example.xmlsax_reader.entity.Pac">
        select * from pac where productlevel = #{param}
    </select>

4.都包含
都包含,则按照名字匹配,这个时候其实parameterType已经没有什么作用了

 Pac myselect(@Param("param") String productLevel);
<select id="myselect" parameterType="String" resultType="com.example.xmlsax_reader.entity.Pac">
        select * from pac where productlevel = #{param}
</select>

5.多个参数
对于多参数的,则就无法直接通过参数类型来识别了,而是必须要通过@Param来进行识别

Pac myselect(@Param("level") String productLevel,@Param("sate") String satelliteID);
<select id="myselect" resultType="com.example.xmlsax_reader.entity.Pac">
        select * from pac where productlevel = #{level} and satelliteid = #{sate}
</select>

三. Map类型

1.都不包含或只含parameterType
这种其实就是按照类型匹配,这个时候,对应的占位符采用的是只有key

void mapsave(Map<String,? extends Object> map);
<insert id="mapsave">
        insert into pac(productlevel,satelliteid) values (#{key1},#{key2})
 </insert>

2.只含@Param或者都包含
如果是注解,则是按照名字匹配。

 void mapsave(@Param("map") Map<String,? extends Object> map);
 <insert id="mapsave" parameterType="map">
        insert into pac(productlevel,satelliteid) values (#{map.key1},#{map.key2})
 </insert>

四.List类型

1.都不包含或只含parameterType
只包含parameterType,则按照类型来识别。

List<Pac> selectBylist(List<String> list);
 <select id="selectBylist" resultType="com.example.xmlsax_reader.entity.Pac">
        select * from pac where productlevel in
        <foreach collection="list" separator="," open="(" close=")" item="item">
            #{item}
        </foreach>
</select>

2.只含@Param或者都包含
如果是注解,则是按照名字匹配。

 List<Pac> selectBylist(@Param("param") List<String> list);
<select id="selectBylist"  resultType="com.example.xmlsax_reader.entity.Pac">
        select * from pac where productlevel in
        <foreach collection="param" separator="," open="(" close=")" item="item">
            #{item}
        </foreach>
</select>

resultType

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean

string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object

map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

1.一般数据类型

    String getEmpNameById(Integer id);
    <!-- 
        指定 resultType 返回值类型时 String 类型的,
        string 在这里是一个别名,代表的是 java.lang.String 

        对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 'hashmap'
        基本数据类型考虑到重复的问题,会在其前面加上 '_',比如 byte 对应的别名是 '_byte'
    -->
    <select id="getEmpNameById" resultType="string">
        select username from t_employee where id = #{id}
    </select>

2.JavaBean类型

    Employee getEmpById(Integer id);
    <!-- 
        通过 resultType 指定查询的结果是 Employee 类型的数据  
        只需要指定 resultType 的类型,MyBatis 会自动将查询的结果映射成 JavaBean 中的属性
    -->
    <select id="getEmpById" resultType="com.example.xmlsax_reader.entity.Employee">
        select * from t_employee where id = #{id}
    </select>

3.返回list类型
有时候我们要查询的数据不止一条,比如:模糊查询,全表查询等,这时候返回的数据可能不止是一条数据,对于多数据的处理可以存放在List集合中。

    List<Employee> getAllEmps();
    <!--
        注意这里的 resultType 返回值类型是集合内存储数据的类型,不是 'list'
    -->
    <select id="getAllEmps" resultType="com.example.xmlsax_reader.entity.Employee">
        select * from t_employee
    </select>

4、返回Map类型

  1. 如果查询的结果是一条,我们可以把查询的数据以{表字段名, 对应的值}方式存入到Map中。
    Map<String, Object> getEmpAsMapById(Integer id);
    <!-- 
        注意这里的 resultType 返回值类型是 'map'
     -->
    <select id="getEmpAsMapById" resultType="map">
        select * from t_employee where id = #{id}
    </select>
  1. 如果查询的结果是多条数据,我们也可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map。
    // @MapKey 中的值表示用数据库中的哪个字段名作 key
    @MapKey("id")
    Map<Integer, Employee> getAllEmpsAsMap();
    <!--
        注意 resultType 返回值类型,不再是 'map',而是 Map 的 value 对应的 JavaBean 类型
    -->
    <select id="getAllEmpsAsMap" resultType="com.example.xmlsax_reader.entity.Employee">
        select * from t_employee
    </select>
Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐