select元素

Select元素来定义查询操作

  • Id唯一标识符。需要喝接口的方法名一致。
  • parameterType参数类型。可以不传,MyBatis会根据TypeHandle自动推断
  • resulTyp返回值类型。别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能喝resultMap同时使用。

Select 元素的属性:

mybatis resultMap 给子类成员赋值 mybatis resultmap id_数据库

查询返回集合类型

1.查询返回List类型

接口代码:

/**
     * 根据name查询同名的用户
     * @param name
     * @return
     */
    List<User> queryForName(String name);

XML配置文件代码:

<select id="queryForIdAndName" resultType="com.gz.mybatis01.User">
            select * from user where id = #{id} and name = #{name}
    </select>

总结:resultType写入List集合中包含的类型,而不是集合本身。

2.查询返回Map类型

情况一 :返回一条记录的Map,key就是列名,value就是对应查询出来的值

接口代码:

/**
     * 根据name查询同名的用户
     * @param name
     * @return
     */
    Map<String,Object> queryForNameMap(String name);

XML配置代码:

<select id="queryForNameMap" resultType="map">
            select * from user where name = #{name}
    </select>

情况二:多条记录封装成一个map,键是这条记录的主键,值是记录封装后的JavaBean对象。

接口代码:

/**
     *
     * @MapKey 表示封装这个map时候使用哪个属性作为主键
     * @param name
     * @return
     */
    @MapKey("name")
    Map<String,User> queryForNameMaps(String name);

XML配置代码:

<select id="queryForNameMaps" resultType="com.gz.mybatis01.User">
            select * from user where name = #{name}
    </select>

自动映射

全局Setting设置

  • autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是类名和JavaBean属性名一致 设置NULL会取消映射
  • 开启自动驼峰命名法。如A_COLUMN>>aColumn。设置mapUnderscoreToCamelCase为true,

结果集映射

resultMap:自定义resultMap,实现高级结果集映射。

结果映射子元素结构

  • constructor:用于在实例化对象时,注入结果到构造器中
    - idArg:ID参数,标记出作为ID的结果可以帮助提高整个性能
    - arg:将被注入到构造方法的一个不同结果
  • id: 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  • result:注入到字段或者JavaBean属性的普通结果
  • association:一个复杂类型的关联,许多结果,或是对其他结果映射的应用
    - 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection:一个复杂类型的集合
    - 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
  • discriminator: 使用结果值来决定使用哪个 resultMap
    -case:基于某些值得结果映射

Id & result

mybatis resultMap 给子类成员赋值 mybatis resultmap id_数据库_02

例子:

User queryForId(Integer id);
<resultMap id="myMap" type="com.gz.mybatis01.User">
        <!--主键列的封装规则,
        id:定义主键底层会有优化
        property:指定对应的JavaBean属性
         -->
        <id column="id" property="id"/>
        <result column="name" property="name"/>
    </resultMap>

    <select id="queryForId" resultMap="myMap">
            select * from user where id = #{id}
    </select>

关联的嵌套Select查询: association为关联关系,是实现一对一的关键

mybatis resultMap 给子类成员赋值 mybatis resultmap id_sql_03

例子:

<resultMap id="blogResult" type="Blog">
<!-- 
 	   association 为关联关系,是实现一对一的关键
 	   1. property 为javabean中容器对应字段名
    2. javaType 指定关联的类型,当使用select属性时,无需指定关联的类型
    3. select 使用另一个select查询封装的结果
    4. column 为数据库中的列名,与select配合使用

-->
  <association property="author" column="author_id" javaType="Author" select="selectAuthor"/>
</resultMap>

<select id="selectBlog" resultMap="blogResult">
  SELECT * FROM BLOG WHERE ID = #{id}
</select>

<select id="selectAuthor" resultType="Author">
  SELECT * FROM AUTHOR WHERE ID = #{id}
</select>

集合的嵌套Select查询:collection为关联关系,是实现一对多的关键

例子:

<resultMap id="blogResult" type="Blog">
  <id property="id" column="blog_id" />
  <result property="title" column="blog_title"/>
<!-- 
	 collection 为关联关系,是实现一对多的关键 
    1. property 为javabean中容器对应字段名
    2. ofType 指定集合中元素的对象类型
    3. select 使用另一个查询封装的结果
    4. column 为数据库中的列名,与select配合使用
-->
  <collection property="posts" ofType="Post">
    <id property="id" column="post_id"/>
    <result property="subject" column="post_subject"/>
    <result property="body" column="post_body"/>
  </collection>
</resultMap>