第十章 Mybatis练习2---练习动态sql and多表查询

一、多表查询

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值