Mybatis关系查询
一对一查询:两个表之间的关系是一对一的关系,一个表中的属性只对应另一个表中的一个属性。(如:人与身份证)
xml文件:
<resultMap id="cardUser" type="User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<!-- 一对多映射关系 javaType指的是Java所在的类-->
<!-- property="card" : 指的是用户表中的引用类型 javaType="Card" :指的是引用类型所在的类(写路径)-->
<association property="card" javaType="Card">
<result property="cardId" column="card_id"></result>
<result property="cardName" column="card_name"></result>
<result property="cardPassword" column="card_password"></result>
</association>
</resultMap>
<!-- 一对一关系查询 -->
<select id="selectCardUser" resultMap="cardUser">
select * from user,card where user.card_id=card.card_id and user.id=#{id}
</select>
注意:
1、association 标签用于映射一对一关系,一对多,多对多关系并补适用
2、property="card" : 指的是用户表中的引用类型 javaType="Card" :指的是引用类型所在的类(写路径)
3、这种对应关系需要使用到resultMap指定返回的类型,否则会无法进行映射
一对多映射关系 :一张表中的数据可以对应另外一张表的多个数据(一对多实际上是多对多的一种特殊的表现形式)
xml文件:
<resultMap id="bankUser" type="User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<!-- 一对多映射关系 -->
<!-- collection:标签定义一对多关系进行映射 property="bank" :指在实体类中引用名称 ofType="Bank" :引用类型所在的类(路径) -->
<collection property="bank" ofType="Bank">
<result property="bankId" column="bank_id"></result>
<result property="bankName" column="bank_name"></result>
<result property="bankPassword" column="bank_password"></result>
<result property="userId" column="user_id"></result>
</collection>
</resultMap>
<!-- 一对多的关系查询 -->
<select id="selectBankUser" resultMap="bankUser">
select * from user,bank where bank.user_id = user.id and user.id=#{id}
</select>
注意:
1、在使用一对多关系查询时,在实体类中需要用集合进行返回(如:List),因为可能返回多个结果,使用集合接收
2、collection:标签定义一对多关系进行映射 property="bank" :指在实体类中引用名称 ofType="Bank" :引用类型所在的类(路径)
mybatis动态sql
if条件判断:标签中使用test属性进行条件的判断,满足就执行,不满住进行忽略
xml文件:
<!-- 条件查询-->
<select id="selectTest01" resultType="User">
select * from user
<if test="username !=null and username != ''">
where username=#{username}
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
</select>
测试代码
@Test
public void test10() throws IOException {
SqlSession session = DBUtils.getSession();
UserMapper mapper =session.getMapper(UserMapper.class);
User u = new User();
u.setUsername("admin");
u.setPassword("123");
List<User> user = mapper.selectTest01(u);
System.out.println(user);
session.close();
}
可以发现执行程序成功,但是程序不严谨
当一个条件不成立呢?
发现问题:当一次个条件无法满足时,sql语句就会出现错误
这时可以使用where标签进行修改xml文件
修改xml文件,其他代码你不变 :
<select id="selectTest01" resultType="User">
select * from user
<where>
<if test="username !=null and username != ''">
and username=#{username}
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
</where>
</select>
执行程序:
执行成功:因为where标签可以默认的提供where,不用自己书写,并且自己写的and不受影响,mybatis会自动帮我们进行覆盖。(注意:第一个SQL语句可以写and也可以不写and,但是后面的sql语句必须写and)
trim条件语句
<!-- trim条件查询-->
<!-- <trim prefix="where" prefixOverrides="and"> prefix="where" : 添加前缀 ,prefixOverrides="and":前缀覆盖-->
<select id="selectTest01" resultType="User">
select * from user
<trim prefix="where" prefixOverrides="and | or">
<if test="username !=null and username != ''">
username=#{username}
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
</trim>
</select>
trim prefix="where" prefixOverrides="and"> prefix="where" : 添加前缀 (相当于添加了一个where),prefixOverrides="and":前缀覆盖(sql前缀有and或者or的时候进行覆盖,但是不能添加,需要手写)