动态SQL
根据不同的条件执行不同的SQL语句
Mybatis中动态SQL在mapper.xml里面添加逻辑判断
前期准备:
1. 准备好之前getMapper接口绑定和参数传递的环境
if
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| //接口需要写方法 List<Log> selByAccinAccout(@Param("accout") String accout,@Param("accin") String accin);
//配置xml文件 <select id="selByAccinAccout" resultType="log"> select * from log where 1=1 //if是需要写where1=1
<!-- OGNL表达式 直接写key / 对象的属性 不需要添加任何特定字符号 --> <if test="accin!=null and accin!=''"> and accin=#{accin} </if>
<if test="accout!=null and accout!=''"> and accout=#{accout} </if> </select>
|
where (比if在sql少写where 1=1)
先去掉前面的and 然后加where (先去后加)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| //接口需要写方法 List<Log> selByAccinAccout(@Param("accout") String accout,@Param("accin") String accin);
<select id="selByAccinAccout" resultType="log"> select * from log //省去了if情况要写的where 1=1 <where> <if test="accin!=null and accin!=''"> and accin=#{accin} </if>
<if test="accout!=null and accout!=''"> and accout=#{accout} </if> </where>
</select>
|
choose when otherwise
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| //接口需要写方法 List<Log> selByAccinAccout(@Param("accout") String accout,@Param("accin") String accin);
<select id="selByAccinAccout" resultType="log"> select * from log <!-- OGNL表达式 直接写key / 对象的属性 不需要添加任何特定字符号 --> <where> <choose> <when test="accin!=null and accin!=''"> //其实相当于将if改成了when and accin=#{accin} </when> <when test="accout!=null and accout!=''"> and accout=#{accout} </when> </choose> </where> </select>
|
set 修改sqlset从句
去掉最后一个逗号 如果set里面有内容就会生成set关键字 (先去后加)
1 2 3 4
| 凑出形式: update log set id=?,accin=?,accout=?, (最后一个逗号会被set删除掉 ) where id=?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| //接口写方法 int upd(Log log);
//配置xml里面
<update id="upd" parameterType="log">
update log <set> id=#{id}, <if test="accin!=null and accin!=''"> accin=#{accin}, </if> <if test="accout!=null and accout!=''"> accout=#{accout}, </if> </set> where id=#{id}
</update>
//测试类使用接口产生getMapper对象 --然后创建log对象 set添加值 LogMapper logMapper = session.getMapper(LogMapper.class); Log log=new Log(); log.setId(1); log.setAccIn(accin); //上面输入 log.setAccOut(accout); //上面输入 int index=logMapper.upd(log); //获得结果 //提交 session.commit(); //一定要记得提交!!! 更新呀 session.close(); System.out.println("程序执行结束");
|
trim 可以去除和添加
trim属性介绍
1 2 3 4
| prefix 在前面添加内容(+) prefixOverrides 去掉前面内容(-) suffix 在后面添加内容(+) suffixOverrides 去掉后面内容(-)
|
模拟其他功能
先删除and 后添加where (模拟where功能)
1 2 3 4
| 凑出形式: select * from log where accin=? //先删除and 然后添加where
|
1 2 3 4 5 6 7
| <select id="selByLog" parameterType="log" resultType="log"> select * from log <trim prefix="where" prefixOverrides="and"> and accin={accin} </trim> </select>
|
先删除逗号 后添加set (模拟set功能)
1 2 3 4
| 凑出形式: update log set id=?,accin=?,accout=?, (最后一个逗号会被set删除掉 ) where id=?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <update id="upd" parameterType="log"> update log <trim prefix="sex" suffixOverrides=,""> id=#{id}, <if test="accin!=null and accin!=''"> accin=#{accin}, </if> <if test="accout!=null and accout!=''"> accout=#{accout}, </if> </trim> where id={id} </update>
|
bind 重新赋值 / 模糊查询
模糊查询
原内容前/后添加内容
1 2 3 4
| <select id="selByLog" parameterType="log"> <bind name="accin" value="'%'+accin+'%'"> #{money} </select>
|
foreach
循环参数内容 **
**内容前后添加内容
添加分隔符
属性介绍
1. collection 要遍历的集合
2. item 迭代变量
#{迭代变量名}获取内容
3. open 循环后左边添加内容
4. close 循环后右边添加内容
5. separator 每层循环时 元素之间的分隔符
在in查询
1 2 3 4
| 凑出来: select * from log where id in (1,2,3);
|
1 2 3 4 5 6
| <select id="selIn" parameterType="list" resultType="list"> select * from log where id in
<foreach collection="list" item="abc" open="(" close=")" separator=","> #{abc} </select>
|
批量新增 (效率低)
1. 写sql语句批量新增:
1 2 3 4
| 凑出来: insert into log values (default,1,2,3),(default,12,2,3),(default,1,22,3)
|
2. openSession()必须指定
1
| factory.openSession(ExecutorType.BATCH); //底层的PreparedStatement.addBatch();
|
sql + include 多表查询
多表查询 (sql片段复用)
*将mysql这个表然后内容是四个属性 上面select可以直接include调用 *
1 2 3 4 5 6 7 8
| <select id=""> select <include refid="mysql"></include> //直接include的refid标签调用mysql表 from log </select>
<sql id="mysql"> id,accin,accout,money //给mysql这个表添加一个id 内容是四个属性 </sql>
|