一、多表查询
1.一对多
教程:Mybatis系列教材 (四)- 基础 - 一对多 (how2j.cn)
Category对Product的一对多,通过类别来找对应的产品,无需Product.xml;需要Product实体类,Category实体类(并提供products的集合),Category.xml。在Category.xml中通过left join关联查询两个表。
由于在mybatis-config.xml单独进行连接数据库的配置,就不用向之前那样每次都来写连接数据库的语句,更方便。
2.多对一
教程:Mybatis系列教材 (五)- 基础 - 多对一 (how2j.cn)
Product对Category的多对一,通过产品找其对应的种类,需要用Product.xml;同时记得在mybatis-config.xml中增加对于Product.xml的映射。
mybatis-config.xml中存放与数据库连接的语句和Product.xml,Category.xml的映射;而这两个配置文件主要用来存放sql语句。
二、练习动态sql
1.if标签
教程:Mybatis系列教材 (七)- 动态SQL - mybatis if 标签例子 (how2j.cn)
定义一个select语句,在这中间实现如果没有传参数name,那么就查询所有,如果有name参数,那么就进行模糊查询。这样在对于多个字段的查询时便于维护。
在之前MVC练习中经常会有连接mysql与连接sql server的区别,于是对于模糊查询,我从一开始就去找他俩的区别,但是刚刚发现在连接sql server时,concat('%',#{name},'%')也同样可以表示,不会出现错误。
在第一个查询中,没有传递参数name,所以运行结果是查询所有;第二个中,传递了参数name,为查询Product b的,所以结果是b的信息。
2.where,set,trim标签
where标签:在select语句中出现了多个if标签,会遇到多个条件的矛盾:当前面一个没有参数,后面一个有参数时执行会报错。如果把多个if放在where标签内,where可以自动判断:如果任何条件都不成立,那么就在sql语句里就不会出现where关键字;如果有任何条件成立,会自动去掉多出来的 and 或者 or。
set标签:与where作用相同,只不过其说解决在update语句中多条件的矛盾。
trim标签:用来定制想要的功能
其中where可以用trim定义为:
<trim prefix="WHERE" prefixOverrides="AND |OR ">...</trim>
set用trim定义为:
<trim prefix="SET" suffixOverrides=",">...</trim>
在这中间只有一个条件成立(传递price参数)时:
两个条件均满足(传递两个参数)时:
当我传递两个参数,但price参数改为90,此时满足两个条件的数据没有,结果也为空。
当我把p.setPrice(99.99f);注释掉,不为price传递参数,仅为name传递参数,仍可以正常运行,但是它的price值不再是之前的值,而是变成了0.00(不太理解为什么)
3.choose when otherwise标签
Mybatis里面没有else标签,但是可以使用when otherwise标签来达到这样的效果。
<where>
<choose>
<when>and 条件1</when>
<when>and 条件2</when>
...
<otherwise>and id>1</otherwise>
</choose>
</where>
提供了任何条件,就进行条件查询,否则就使用id>1这个条件。
在这里没有传递任何参数,使用id>1这个条件
4.foreach标签
Mybatis<foreach>标签 - 最强Java代表 - 博客园 (cnblogs.com)查找资料,这个里面对foreach标签解释的挺清楚的。
其中collection 表示迭代集合的名称,本次为list;item 表示本次迭代获取的元素,为list中的元素;index表示当前迭代的位置;以(开始,)结束,“,”作为分隔符。
为list添加id为1,2,3的数据
5.bind标签(再做一次字符串拼接,方便后续使用)
<bind name=
"likename"
value=
"'%' + name + '%'"
/>
这样在后续模糊查询中,可以直接使用其name名:likename