Mybatis的动态sql和多表操作
文章目录
一、动态sql
1.学习后小总结
- 学习过程中使用了resultMap,主要的作用是将查询到的结果映射到一个结果集当中,之后的多表操作中起到了很大的作用。
- 在SqlMapConfig文件中,properties标签可以配置外部连接池信息。使用外部文件后注意当前文件连接池value的写法
- 在SqlMapConfig文件中,typeAliases标签用于配置别名。typeAlias用于配置具体的类,package用于配置一个包,其包含的类就是他的类名。
- 这里还需要注意的是,在.xml文件里面的sql里面的变量名称需要和对应的类保持一致
2.动态语句的if标签和where标签
当我们处理sql语句的时候,有时候需要达到一种,例如:传入值就条件查询没有传值就普通查询的效果。这个时候就需要用到了if标签。如图:
这里当图二传入了UserName时,图一的if就会对UserName进行判断。若是不为空那么语句就增加后面的条件,若是为空则进行普通查询。此处需要注意的是UserName需要与前面的类保持一致。
3.动态语句的foreach标签
当我们在查询中,sql语句需要用到in这个功能的时候。例如:select * from user where id in (1, 2, 3, 4, 5);
就需要传入一个数组,然后在.xml文件中运用foreach便利集合进入标签。
上图可以看到,在定义集合后并赋值41,42后,将list集合传入了Ids中。注意此处需要在前面的User类中也定义一个ids的集合变量。private List<Integer> ids;
之后,xml文件检测到ids不为空则会进行遍历。 在foreach标签中,collection填要遍历的集合,open填开始的部分,close填结束的部分,item填遍历的每个元素,separator填分隔符,中间的内容为:item的值
二、多表操作
1.学习后小总结
- 多表操作关系分为,一对一,多对一(也相当于一对一),一对多,多对多。
- 在sql语句中多表查询,were = 和left join on区别在于:前者只会显示满足条件的,后者会显示所有的查询,但是条件不满足的会显示为空。
- 实现多表主要是依靠xml中的,resultMap标签的映射。
2.一对一或多对一
- 先在定义变量的类中,定义一个主表实体的对象引用。
- 在xml文件中利用result标签的association映射到结果集。
在账户表中定义用户变量,此时加入一个用户一个账户。主语在xml文件中:的<association property="user" column="uid" javaType="user">
参数,property是上面定义的user,column是两个表连接的依据,javaType是填写user对应的类。
2.一对多
- 现在主表定义从表的集合引用
- 在xml文件中定义resultmap的collection
- 假定关系是一个用户(user)对应多个账户(account)
- 此处我感觉一对多,mybatis是通过id将多条数据整合在一起的。
现在user类中定义集合accounts,然后定义resultmap,column对应数据库的列名,property对应类的变量名。 collection中,property对应类的变量名,ofType对应变量名的类。
2.多对多
1.假定是多个用户对应多个角色。那么就应该需要有三个表,user,role,和一个关系表:user_role。然后其他的和一对多差不多。
以下是文件目录,分别对角色和用户以一对多的关系进行分别查询。已满足多对多。