JavaWeb【Mybatis】动态标签与ResultMap标签
ResultMap
(1)ResultMap有什么用?
建立查询字段与实体类成员变量的映射关系
即 查询字段是user_id但是Mybatis去赋值userId
》字段名与变量名不一致,可以赋值
》实现一对多,多对多的查询
(2)ResultMap标签映射关系,resultMap使用
在不改表,也不改类的基础上,完成查询数据对变量的赋值。
<!--
id:ResultMap标识,标签语句中 resultMap的值必须和该id一致
type:指定你要映射哪一个JavaBean
如果字段名和成员名一样,则可以不用指定映射关系
-->
<resultMap id="resultMap1" type="com.hx.pojo.Order">
<!--在这里要指定数据库表字段和JavaBean成员变量之前的映射关系-->
<!--先指定主键字段和成员之间的映射关系-->
<id column="id" property="id"></id>
<!--先指定非主键字段和成员之间的映射关系
column:字段名
property:成员变量名
-->
<result column="user_id" property="userId"></result>
<result column="number" property="number"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
</resultMap>
<select id="queryAllOrders" resultMap="resultMap1">
SELECT id,user_id,number,createtime,note FROM orderx
</select>
动态标签介绍
(1)动态标签是什么?
用于mybatis将sql与java代码分离(sql写在xml中)
if标签,where标签 forEach标签
(2)动态标签有什么用?
用来根据数据的不同来生成对应的sql
(3)应用场景
高级搜索功能
搜索有多个条件,不是每个条件输入框都有值 ,此时需根据值来生成where条件
if标签与where标签
<select id="queryUserBySexAndName" parameterType="User" resultType="User">
select * from user
<where>
<if test="username != '' and username !=null ">
and username like '${username}%'
</if>
<if test="sex != '' and sex != null">
and sex = #{sex}
</if>
<if test="address != '' and address != null">
and address = #{address}
</if>
</where>
</select>
在接口实现
//根据性别或者名字进行查找
List<User> findByUser(User user);
foreach标签
(1)foreach标签
向sql传递数组或List,mybatis使用foreach解析
(2)如何使用
collection:表示方法传入的集合对象的名字 collection=“xxx”
item:遍历集合时,会将集合中的元素赋值给item
open表示你要拼接的sql以什么开始
close:表示你拼接的sql以什么结束
separator:表示拼接的分隔符
接口中的变量名不能被标签识别,必须在参数的前边加注解@Param(“xxx”)
<!--根据多个id来查找用户
select * from user where id in(1,3,5)
+++++++++
select * from user where 1=1 and id in(1,3,5)
collection:表示方法传入的集合对象的名字
item:遍历集合时,会将集合中的元素赋值给item
open表示你要拼接的sql以什么开始
close:表示你拼接的sql以什么结束
separator:表示拼接的分隔符
-->
<select id="queryUsersByIds" resultType="User">
select * from user
<where>
<foreach collection="ids" item="id" open="and id in(" close=")" separator=",">
#{id}
</foreach>
</where>
</select>
接口中实现
//根据多个ID来查找用户
//这里定义的变量,在UserDao中是不识别的,要想识别,必须在参数的前边加注解@Param("ids")
List<User> queryUsersByIds(@Param("ids") List<Integer> ids);
关联查询
(1)项目不可能只有一个表,一般是多表
(2)多表关系为,一对一,一对多,多对多
(3)查询的数据来自多个表,要使用多表查询
笛卡尔集,显示内连接inner join,左外连接left outer join,右外连接right outer join,子查询select嵌套select
(4)查询的结果要封装成javaBean对象 ,在Mybatis中重点掌握resultType与resultMap
resultMap与association 配置映射(一对一)
映射配置的重点是 Order类中的 User user 成员变量,它的类型User是自定义实现类的类型
autoMapping:表示如果字段名和属性名一致,则自动映射
<!--2:查询每个订单属于哪个用户 一对一 方式2-->
<!--
如果是关联查询,则必须添加属性:autoMapping="true",自动映射
-->
<resultMap id="findAllOrder2Map" type="com.wzx.bean.Order" autoMapping="true">
<!--先指定Order类属性和字段之间的映射关系-->
<id column="id" property="id"></id>
<result column="user_id" property="userId"></result>
<!--先指定Order类中User类属性和字段之间的映射关系
property:表示Order类中User类对象的名字
javaType:表示Order类中包含的User类的全路径名
autoMapping:表示如果字段名和属性名一致,则自动映射
class Order{
User user;
}
-->
<association property="user" javaType="com.wzx.bean.User" autoMapping="true" >
<id column="uid" property="id"></id>
</association>
</resultMap>
<select id="findAllOrder2" resultMap="findAllOrder2Map">
select o.id as id,
o.user_id as userId,
o.number,
o.createtime,
o.note,
u.id as uid,
u.username,
u.birthday,
u.sex,
u.address
from `order` o left join `user` u
on o.user_id=u.id;
</select>
ResultMap与collection配置映射(一对多)
<!-- autoMapping="true" 如果字段名与变量名一样,则不需要映射
如果一个类成员变量出现集合类型,List,则需要使用collection标签了映射,字段与变量的关系
ofType指定的集合List<元素> 元素的类型,不要写成javaType
-->
<resultMap id="findAllUsersMap" type="com.wzx.bean.User" autoMapping="true">
<id property="id" column="uid"></id>
<collection property="orders" ofType="com.wzx.bean.Order" autoMapping="true">
<id property="id" column="oid"></id>
</collection>
</resultMap>
<select id="findAllUsers" resultMap="findAllUsersMap">
select u.id as uid,
u.username,
u.birthday,
u.sex,
u.address,
o.id as oid,
o.user_id as userId,
o.number,
o.createtime,
o.note
from `user` u left join `order` o
on u.id=o.user_id;
</select>