publicclassBookDaoImplimplementsBookDao{ //无参的构造方法 publicBookDaoImpl(){ System.out.println("book dao constructor is running"); } publicvoidsave(){ System.out.println("book dao save ..."); } }
B --> C{Let me think} C -->|One| D[Laptop] C -->|Two| E[iPhone] C -->|Three| F[Car]
![[Pasted image 20240327083210.png]]
多合一结构
1 2 3
A --> C B --> C D --> C
![[Pasted image 20240327083404.png]]
需求
比如说一个任务流程图,需要同时确认了 A 和 B,才能执行 C,那么流程图该怎么表达
参考案例 1:
1 2 3 4 5 6
graph TD A[Christmas] -->|Get money| B(Go shopping) B --> C{Let me think} C -->|One| D[Laptop] C -->|Two| E[iPhone] C -->|Three| F[Car]
参考案例 2:
1 2 3 4
graph TD A[First node] --> C B --> C D --> C
根据案例 2,如何给 A,B 添加样式,以区别显示呢:
1 2 3 4 5 6 7 8
graph TD style A fill:#9f9,stroke:#333,stroke-width:2px; style B fill:red; style D fill:cyan,stroke:dark gray; style C fill:yellow; A --> C B --> C D --> C
<selectid="selectAll"resultMap="brandResultMap"> select * from tb_brand </select>
resultMap 标签中:
id:唯一标识
type:映射的类型,支持别名
id 子标签:完成主键字段的映射,具有属性 column 表的列名和 property 实体类的属性,以上代码中并没有演示 id 子标签的使用
result 子标签:完成一半字段的映射,具有属性 column 表的列名和 property 实体类的属性
注意:select 标签中原先的 resultType="brand" 改为了 resultMap="brandResultMap",因为在 resultMap 标签中 type 属性也定义了类型
根据 id 查询数据
1、编写接口方法:Mapper 接口
参数:id
返回类型:Brand 类
1 2
//传入一个id,最终返回一个Brand类型 Brand selectById(int id);
2、编写 SQL 语句
1 2 3 4 5
<select id="selectById" resultMap="brandResultMap" > select* from tb_brand where id = #{id}; </select>
3、执行方法,测试
只需要修改执行方法这一部分代码,其他地方不需要改动
1 2 3 4
//4.执行方法 int id = 1; Brand brand = brandMapper.selectById(id); //返回一个brand对象 System.out.println(brand);
条件查询 - 多条件查询
1、编写接口方法:Mapper 接口
参数:所有查询条件
返回类型:List<Brand>
2、编写 SQL 语句
1 2 3 4 5 6 7
<select id="selectByCondition" resultMap="brandResultMap"> select* from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName}; </select>
解决方案 1:在 where 后面添加一个恒等式,然后所有的判断条件语句中都可以加上 and 这个关键词
1 2 3 4 5 6 7 8 9 10 11 12
select* from tb_brand where1=1 <if test="status!=null"> and status = #{status} </if> <if test="companyName!=null and companyName!='' "> and company_name like #{companyName} </if> <if test="brandName!=null and brandName!='' "> and brand_name like #{brandName} </if>
解决方案 2:利用 MaBatis 提供的 where 标签
这样的话,就不需要管到底用户传递了几个参数过来,会动态判断是否需要添加 and 关键字
1 2 3 4 5 6 7 8 9 10 11
<where> <if test="status!=null"> and status = #{status} </if> <if test="companyName!=null and companyName!='' "> and company_name like #{companyName} </if> <if test="brandName!=null and brandName!='' "> and brand_name like #{brandName} </if> </where>
<!--单条件查询--> <selectid="selectByConditionSingle"resultMap="brandResultMap"> select * from tb_brand where <choose><!--相当于switch--> <whentest="status!=null"><!--相当于case--> status = #{status} </when> <whentest="companyName!=null and companyName!=''"> company_name like #{companyName} </when> <whentest="brandName!=null and brandName!='' "> and brand_name like #{brandName} </when> </choose> </select>
<choose><!--相当于switch--> <whentest="status!=null"><!--相当于case--> status = #{status} </when> <whentest="companyName!=null and companyName!=''"> company_name like #{companyName} </when> <whentest="brandName!=null and brandName!='' "> and brand_name like #{brandName} </when> <otherwise><!--相当于default--> 1 = 1 </otherwise> </choose>
那么更进一步,可以和前面的 where 标签结合起来,就不需要使用到 otherwise 标签了
1 2 3 4 5 6 7 8 9 10 11 12 13
<where> <choose><!--相当于switch--> <when test="status!=null"><!--相当于case--> status = #{status} </when> <when test="companyName!=null and companyName!=''"> company_name like #{companyName} </when> <when test="brandName!=null and brandName!='' "> and brand_name like #{brandName} </when> </choose> </where>
<!--MaBatis会将数组参数封装为一个Map集合,默认情况下 key为array value为数组 但是通过使用@param注解之后,使用ids已经替换了默认的array,因此collection="ids" --> <deleteid="deleteByIds"> delete from tb_brand where id in ( <foreachcollection="ids"item="id"> #{id} </foreach> ) </delete>
<!--MaBatis会将数组参数封装为一个Map集合,默认情况下 key为array value为数组 但是通过使用@param注解之后,使用ids已经替换了默认的array,因此collection="ids" --> <deleteid="deleteByIds"> delete from tb_brand where id in ( <foreachcollection="ids"item="id"separator=","> #{id} </foreach> ) </delete>
3、执行方法
传入一个 ids 数组
1 2
//4.执行方法 brandMapper.deleteByIds(ids);
改进
如下代码可以正常执行功能,但是 foreach 标签包裹在小括号中,可不可以去掉外边的小括号呢?
1 2 3 4 5 6 7 8 9 10 11 12 13
<!--MaBatis会将数组参数封装为一个Map集合,默认情况下 key为array value为数组 但是通过使用@param注解之后,使用ids已经替换了默认的array,因此collection="ids" --> <deleteid="deleteByIds"> delete from tb_brand where id in ( <foreachcollection="ids"item="id"separator=","> #{id} </foreach> ) </delete>
改为如下代码,即在 foreach 标签中添加 open 和 close 属性
1 2 3 4 5 6 7
<deleteid="deleteByIds"> delete from tb_brand where id in <foreachcollection="ids"item="id"separator=","open="("close=")"> #{id} </foreach> </delete>