select元素
Select元素来定义查询操作
- Id唯一标识符。需要喝接口的方法名一致。
- parameterType参数类型。可以不传,MyBatis会根据TypeHandle自动推断
- resulTyp返回值类型。别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能喝resultMap同时使用。
Select 元素的属性:
查询返回集合类型
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:
例子:
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为关联关系,是实现一对一的关键
例子:
<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>