DynamicSQL
if 判断
if标签里的test 是判断传入的参数java
和where标签结合
where 标签能够自动把前面的and给去除mysql
<!-- 查询员工,要求,携带了哪一个字段查询条件就带上这个字段的值 --> <!-- public List<Employee> getEmpsByConditionIf(Employee employee); --> <select id="getEmpsByConditionIf" resultType="com.atguigu.mybatis.bean.Employee"> select * from tbl_employee <!-- where --> <where> <!-- test:判断表达式(OGNL) OGNL参照PPT或者官方文档。 c:if test 从参数中取值进行判断 碰见特殊符号应该去写转义字符: &&: --> <if test="id!=null"> id=#{id} </if> <if test="lastName!=null && lastName!="""> and last_name like #{lastName} </if> <if test="email!=null and email.trim()!="""> and email=#{email} </if> <!-- ognl会进行字符串与数字的转换判断 "0"==0 --> <if test="gender==0 or gender==1"> and gender=#{gender} </if> </where> </select>
查询:sql
Employee employee = new Employee(null, "Admin", null, null);
查询的时候若是某些条件没带可能sql拼装会有问题(好比第一个id没有就会多一个and),解决办法:
一、给where后面加上1=1,之后的条件都and xxx.
二、mybatis使用where标签来将全部的查询条件包括在内。
mybatis就会将where标签中拼装的sql,多出来的and或者or去掉
可是where只会去掉第一个多出来的and或者or。
数据库
和set标签结合
更新操做 可能会多, 放进set标签 set就会解决mybatis
<!--public void updateEmp(Employee employee); --> <update id="updateEmp"> <!-- Set标签的使用 --> update tbl_employee <set> <if test="lastName!=null"> last_name=#{lastName}, </if> <if test="email!=null"> email=#{email}, </if> <if test="gender!=null"> gender=#{gender} </if> </set> where id=#{id} </update>
trim 字符串截取
trim 代替where
-
where标签只能解决前面多出来的and,若是咱们把 and都写后面,就要用到trim标签代替where标签oracle
-
trim的属性:app
- prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
prefix给拼串后的整个字符串加一个前缀 - prefixOverrides="":
前缀覆盖: 去掉整个字符串前面多余的字符 - suffix="":后缀
suffix给拼串后的整个字符串加一个后缀 - suffixOverrides=""
后缀覆盖:去掉整个字符串后面多余的字符
经过这些属性咱们就能够自定义字符串的截取规则ide
- prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
-
查询员工,要求,携带了哪一个字段查询条件就带上这个字段的值测试
<!--public List<Employee> getEmpsByConditionTrim(Employee employee); --> <select id="getEmpsByConditionTrim" resultType="com.atguigu.mybatis.bean.Employee"> select * from tbl_employee <!-- 自定义字符串的截取规则 --> <trim prefix="where" suffixOverrides="and"> <if test="id!=null"> id=#{id} and </if> <if test="lastName!=null && lastName!="""> last_name like #{lastName} and </if> <if test="email!=null and email.trim()!="""> email=#{email} and </if> <!-- ognl会进行字符串与数字的转换判断 "0"==0 --> <if test="gender==0 or gender==1"> gender=#{gender} </if> </trim> </select>
trim代替set
<!-- Trim:更新拼串--> update tbl_employee <trim prefix="set" suffixOverrides=","> <if test="lastName!=null"> last_name=#{lastName}, </if> <if test="email!=null"> email=#{email}, </if> <if test="gender!=null"> gender=#{gender} </if> </trim> where id=#{id} </update>
choose(when,otherwise) 分支选择
需求:若是带了id就用id查,若是带了lastName就用lastName查;只会进入其中一个ui
<!-- public List<Employee> getEmpsByConditionChoose(Employee employee); --> <select id="getEmpsByConditionChoose" resultType="com.atguigu.mybatis.bean.Employee"> select * from tbl_employee <where> <!-- 若是带了id就用id查,若是带了lastName就用lastName查;只会进入其中一个 --> <choose> <when test="id!=null"> id=#{id} </when> <when test="lastName!=null"> last_name like #{lastName} </when> <when test="email!=null"> email = #{email} </when> <otherwise> gender = 0 </otherwise> </choose> </where> </select>
foreach
集合遍历
collection:指定要遍历的集合: (在接口中定义方法时入参加上@param(“ids”) 能够 指定遍历集合的名字,这样collection 就能够直接写这个注解指定的名字了)
-
list类型的参数会特殊处理封装在map中,map的key就叫list
-
item:将当前遍历出的元素赋值给指定的变量
-
separator:每一个元素之间的分隔符
-
open:遍历出全部结果拼接一个开始的字符
-
close:遍历出全部结果拼接一个结束的字符
-
index:索引。
遍历list的时候是index就是索引,item就是当前值
遍历map的时候index表示的就是map的key,item就是map的值 -
#{变量名}就能取出变量的值也就是当前遍历出的元素
xml文件
<!--public List<Employee> getEmpsByConditionForeach(@param("ids")List<Integer> ids); --> <select id="getEmpsByConditionForeach" resultType="com.atguigu.mybatis.bean.Employee"> select * from tbl_employee <foreach collection="ids" item="item_id" separator="," open="where id in(" close=")"> #{item_id} </foreach> </select>
测试的java代码
List<Employee> list = mapper.getEmpsByConditionForeach(Arrays.asList(1,2)); for (Employee emp : list) { System.out.println(emp); }
批量保存
MySQL下批量保存
<!-- 批量保存 --> <!--public void addEmps(@Param("emps")List<Employee> emps); --> <!--MySQL下批量保存:能够foreach遍历 mysql支持values(),(),()语法--> <insert id="addEmps"> insert into tbl_employee( <include refid="insertColumn"></include> ) values <foreach collection="emps" item="emp" separator=","> (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id}) </foreach> </insert>
测试代码:
@Test public void testBatchSave() throws IOException{ SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try{ EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class); List<Employee> emps = new ArrayList<>(); emps.add(new Employee(null, "smith0x1", "smith0x1@atguigu.com", "1",new Department(1))); emps.add(new Employee(null, "allen0x1", "allen0x1@atguigu.com", "0",new Department(1))); mapper.addEmps(emps); openSession.commit(); }finally{ openSession.close(); } }
内置参数
两个内置参数:
不仅是方法传递过来的参数能够被用来判断,取值。。。
mybatis默认还有两个内置参数:
-
_parameter:表明整个参数
单个参数:_parameter就是这个参数
多个参数:参数会被封装为一个map;_parameter就是表明这个map -
_databaseId:若是配置了databaseIdProvider标签。
_databaseId就是表明当前数据库的别名oracle
<!--public List<Employee> getEmpsTestInnerParameter(Employee employee); --> <select id="getEmpsTestInnerParameter" resultType="com.atguigu.mybatis.bean.Employee"> <if test="_databaseId=='mysql'"> select * from tbl_employee <if test="_parameter!=null"> where last_name like #{lastName} </if> </if> <if test="_databaseId=='oracle'"> select * from employees <if test="_parameter!=null"> where last_name like #{_parameter.lastName} </if> </if>
bind 绑定
<!-- bind:能够将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值 --> <bind name="_lastName" value="'%'+lastName+'%'"/>
sql标签 抽取可重用的sql片断
sql标签抽取可重用的sql片断。方便后面引用
一、sql抽取:常常将要查询的列名,或者插入用的列名抽取出来方便引用
二、include来引用已经抽取的sql:
三、include还能够自定义一些property,sql标签内部就能使用自定义的属性
include-property:取值的正确方式${prop},
#{不能使用这种方式}
<sql id="insertColumn"> <if test="_databaseId=='oracle'"> employee_id,last_name,email </if> <if test="_databaseId=='mysql'"> last_name,email,gender,d_id </if> </sql>
用这个sql字段
<insert id="addEmps"> insert into tbl_employee( <include refid="insertColumn"> <property name="testColomn" value="abc"/> </include> ) values <foreach collection="emps" item="emp" separator=","> (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id}) </foreach> </insert>