重新学习Mybatis(四)

动态SQL:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE mapper
  3  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5 <mapper namespace="com.it.mybatis.dao.EmployeeMapperDynamicSQL">
  6     <!-- 
  7 • if:判断
  8 • choose (when, otherwise):分支选择;带了break的swtich-case
  9     如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个
 10 • trim 字符串截取(where(封装查询条件), set(封装修改条件))
 11 • foreach 遍历集合
 12      -->
 13      <!-- 查询员工,要求,携带了哪个字段查询条件就带上这个字段的值 -->
 14      <!-- public List<Employee> getEmpsByConditionIf(Employee employee); -->
 15      <select id="getEmpsByConditionIf" resultType="com.it.mybatis.bean.Employee">
 16          select * from tbl_employee
 17          <!-- where -->
 18          <where>
 19              <!-- test:判断表达式(OGNL)
 20              OGNL参照官方文档。
 21                     c:if  test
 22              从参数中取值进行判断
 23              
 24              遇见特殊符号应该去写转义字符:
 25              &&:
 26              -->
 27              <if test="id!=null">
 28                  id=#{id}
 29              </if>
 30              <if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
 31                  and last_name like #{lastName}
 32              </if>
 33              <if test="email!=null and email.trim()!=&quot;&quot;">
 34                  and email=#{email}
 35              </if> 
 36              <!-- ognl会进行字符串与数字的转换判断  "0"==0 -->
 37              <if test="gender==0 or gender==1">
 38                   and gender=#{gender}
 39              </if>
 40          </where>
 41      </select>
 42      
 43      <!--public List<Employee> getEmpsByConditionTrim(Employee employee);  -->
 44      <select id="getEmpsByConditionTrim" resultType="com.it.mybatis.bean.Employee">
 45          select * from tbl_employee
 46          <!-- 后面多出的and或者or where标签不能解决 
 47          prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
 48                  prefix给拼串后的整个字符串加一个前缀 
 49          prefixOverrides="":
 50                  前缀覆盖: 去掉整个字符串前面多余的字符
 51          suffix="":后缀
 52                  suffix给拼串后的整个字符串加一个后缀 
 53          suffixOverrides=""
 54                  后缀覆盖:去掉整个字符串后面多余的字符
 55                  
 56          -->
 57          <!-- 自定义字符串的截取规则 -->
 58          <trim prefix="where" suffixOverrides="and">
 59              <if test="id!=null">
 60                  id=#{id} and
 61              </if>
 62              <if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
 63                  last_name like #{lastName} and
 64              </if>
 65              <if test="email!=null and email.trim()!=&quot;&quot;">
 66                  email=#{email} and
 67              </if> 
 68              <!-- ognl会进行字符串与数字的转换判断  "0"==0 -->
 69              <if test="gender==0 or gender==1">
 70                   gender=#{gender}
 71              </if>
 72          </trim>
 73      </select>
 74      
 75      <!-- public List<Employee> getEmpsByConditionChoose(Employee employee); -->
 76      <select id="getEmpsByConditionChoose" resultType="com.it.mybatis.bean.Employee">
 77          select * from tbl_employee 
 78          <where>
 79              <!-- 如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个 -->
 80              <choose>
 81                  <when test="id!=null">
 82                      id=#{id}
 83                  </when>
 84                  <when test="lastName!=null">
 85                      last_name like #{lastName}
 86                  </when>
 87                  <when test="email!=null">
 88                      email = #{email}
 89                  </when>
 90                  <otherwise>
 91                      gender = 0
 92                  </otherwise>
 93              </choose>
 94          </where>
 95      </select>
 96      
 97      <!--public void updateEmp(Employee employee);  -->
 98      <update id="updateEmp">
 99          <!-- Set标签的使用 -->
100          update tbl_employee 
101         <set>
102             <if test="lastName!=null">
103                 last_name=#{lastName},
104             </if>
105             <if test="email!=null">
106                 email=#{email},
107             </if>
108             <if test="gender!=null">
109                 gender=#{gender}
110             </if>
111         </set>
112         where id=#{id} 
113 <!--         
114         Trim:更新拼串
115         update tbl_employee 
116         <trim prefix="set" suffixOverrides=",">
117             <if test="lastName!=null">
118                 last_name=#{lastName},
119             </if>
120             <if test="email!=null">
121                 email=#{email},
122             </if>
123             <if test="gender!=null">
124                 gender=#{gender}
125             </if>
126         </trim>
127         where id=#{id}  -->
128      </update>
129      
130      <!--public List<Employee> getEmpsByConditionForeach(List<Integer> ids);  -->
131      <select id="getEmpsByConditionForeach" resultType="com.it.mybatis.bean.Employee">
132          select * from tbl_employee
133          <!--
134              collection:指定要遍历的集合:
135                  list类型的参数会特殊处理封装在map中,map的key就叫list
136              item:将当前遍历出的元素赋值给指定的变量
137              separator:每个元素之间的分隔符
138              open:遍历出所有结果拼接一个开始的字符
139              close:遍历出所有结果拼接一个结束的字符
140              index:索引。遍历list的时候是index就是索引,item就是当前值
141                            遍历map的时候index表示的就是map的key,item就是map的值
142              
143              #{变量名}就能取出变量的值也就是当前遍历出的元素
144            -->
145          <foreach collection="ids" item="item_id" separator=","
146              open="where id in(" close=")">
147              #{item_id}
148          </foreach>
149      </select>
150      
151      <!-- 批量保存 -->
152      <!--public void addEmps(@Param("emps")List<Employee> emps);  -->
153      <!--MySQL下批量保存:可以foreach遍历   mysql支持values(),(),()语法-->
154     <insert id="addEmps">
155          insert into tbl_employee(
156              <include refid="insertColumn"></include>
157          ) 
158         values
159         <foreach collection="emps" item="emp" separator=",">
160             (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
161         </foreach>
162      </insert><!--   -->
163      
164      <!-- 这种方式需要数据库连接属性allowMultiQueries=true;
165          这种分号分隔多个sql可以用于其他的批量操作(删除,修改) -->
166      <!-- <insert id="addEmps">
167          <foreach collection="emps" item="emp" separator=";">
168              insert into tbl_employee(last_name,email,gender,d_id)
169              values(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
170          </foreach>
171      </insert> -->
172      
173      <!-- Oracle数据库批量保存: 
174          Oracle不支持values(),(),()
175          Oracle支持的批量方式
176          1、多个insert放在begin - end里面
177              begin
178                 insert into employees(employee_id,last_name,email) 
179                 values(employees_seq.nextval,'test_001','test_001@atguigu.com');
180                 insert into employees(employee_id,last_name,email) 
181                 values(employees_seq.nextval,'test_002','test_002@atguigu.com');
182             end;
183         2、利用中间表:
184             insert into employees(employee_id,last_name,email)
185                select employees_seq.nextval,lastName,email from(
186                       select 'test_a_01' lastName,'test_a_e01' email from dual
187                       union
188                       select 'test_a_02' lastName,'test_a_e02' email from dual
189                       union
190                       select 'test_a_03' lastName,'test_a_e03' email from dual
191                )    
192      -->
193      <insert id="addEmps" databaseId="oracle">
194          <!-- oracle第一种批量方式 -->
195          <!-- <foreach collection="emps" item="emp" open="begin" close="end;">
196              insert into employees(employee_id,last_name,email) 
197                 values(employees_seq.nextval,#{emp.lastName},#{emp.email});
198          </foreach> -->
199          
200          <!-- oracle第二种批量方式  -->
201          insert into employees(
202              <!-- 引用外部定义的sql -->
203              <include refid="insertColumn">
204                  <property name="testColomn" value="abc"/>
205              </include>
206          )
207                  <foreach collection="emps" item="emp" separator="union"
208                      open="select employees_seq.nextval,lastName,email from("
209                      close=")">
210                      select #{emp.lastName} lastName,#{emp.email} email from dual
211                  </foreach>
212      </insert>
213      
214      <!-- 两个内置参数:
215          不只是方法传递过来的参数可以被用来判断,取值。。。
216          mybatis默认还有两个内置参数:
217          _parameter:代表整个参数
218              单个参数:_parameter就是这个参数
219              多个参数:参数会被封装为一个map;_parameter就是代表这个map
220          
221          _databaseId:如果配置了databaseIdProvider标签。
222              _databaseId就是代表当前数据库的别名oracle
223       -->
224       
225       <!--public List<Employee> getEmpsTestInnerParameter(Employee employee);  -->
226       <select id="getEmpsTestInnerParameter" resultType="com.it.mybatis.bean.Employee">
227               <!-- bind:可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值 -->
228               <bind name="_lastName" value="'%'+lastName+'%'"/>
229               <if test="_databaseId=='mysql'">
230                   select * from tbl_employee
231                   <if test="_parameter!=null">
232                       where last_name like #{lastName}
233                   </if>
234               </if>
235               <if test="_databaseId=='oracle'">
236                   select * from employees
237                   <if test="_parameter!=null">
238                       where last_name like #{_parameter.lastName}
239                   </if>
240               </if>
241       </select>
242       
243       <!-- 
244           抽取可重用的sql片段。方便后面引用 
245           1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用
246           2、include来引用已经抽取的sql:
247           3、include还可以自定义一些property,sql标签内部就能使用自定义的属性
248                   include-property:取值的正确方式${prop},
249                   #{不能使用这种方式}
250       -->
251       <sql id="insertColumn">
252               <if test="_databaseId=='oracle'">
253                   employee_id,last_name,email
254               </if>
255               <if test="_databaseId=='mysql'">
256                   last_name,email,gender,d_id
257               </if>
258       </sql>
259       
260 </mapper>

 

posted on 2020-05-10 17:30  betterLearing  阅读(118)  评论(0编辑  收藏  举报