动态sql -》if 、where
<!-- 动态Sql-->
<select id="selectSql" parameterType="com.zks.vo.Emp" resultType="com.zks.vo.Emp">
select <include refid="empColumn"></include> from emp
<where>
and <if test="job!=null">
job=#{job}
</if>
and <if test="sal!=null">
sal>#{sal}
</if>
</where>
</select>
/**
*测试动态代码块,多条件查询
*/
public void selectSql(){
//获取数据库链接
SqlSession sqlSession=MyBatiesUtils.getSqlSession();
Emp emp=new Emp();
emp.setJob("SALESMAN");
emp.setSal(1000.0);
//获取数据
List<Emp> empList=sqlSession.selectList("com.zks.dao.EmpMapper.selectSql",emp);
empList.stream().forEach(System.out::println);
}
情景:查询员工信息,用工号,和姓名,如果给工号了,就用工号查,如果给姓名了就用姓名查
```css
动态sql->choose when otherwise
<!-- 二选一动态查询-->
<select id="selectChoose" parameterType="com.zks.vo.Emp" resultType="com.zks.vo.Emp">
select <include refid="empColumn"></include> from emp
<where>
<choose>
<when test="empname!=null">
ename=#{empname}
</when>
<when test="empno!=null">
empno=#{empno}
</when>
<otherwise>
1!=1
</otherwise>
</choose>
</where>
</select>
注意这里的动态sql:它会按照顺序查询,这里就会先按ename 查,再按empno查,只会二选1
/**
* 二选一查询
*/
public void selectChoose(){
//获取数据库链接
SqlSession sqlSession=MyBatiesUtils.getSqlSession();
Emp emp=new Emp();
// emp.setEmpname(“SMITH”);
emp.setEmpno(7499);
Emp result=sqlSession.selectOne(“com.zks.dao.EmpMapper.selectChoose”,emp);
System.out.println(result);
}
动态sql-》set,在需要update时候,不知道具体要set哪一个,这种情况和where 一样
<update id="updateSql" parameterType="emp">
update emp
<set>
<if test="empname!=null">
,ename=#{empname}
</if>
<if test="ename!=null">
,ename=#{ename}
</if>
</set>
where empno=#{empno}
</update>
foreach的使用
1.foreach做参数,参数是一个list
<select id="selectForeach" parameterType="list" resultType="com.zks.vo.Emp">
select * from emp where job in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
//获取数据库链接
SqlSession sqlSession=MyBatiesUtils.getSqlSession();
List<String> list=new ArrayList<>();
list.add("CLERK");
list.add("SALESMAN");
List<Emp> empList=sqlSession.selectList("com.zks.dao.EmpMapper.selectForeach",list);
empList.stream().forEach(System.out::println);
sqlSession.close();
2.foreach做批量插入
<!-- 批量插入-->
<insert id="insertSql" parameterType="list">
<foreach collection="list" item="item" open="begin" separator=";" close=";end;">
insert into dept values(#{item.deptno},#{item.dname},#{item.loc})
</foreach>
</insert>
/**
* foreach批量插入第一种方法
*/
public void insertSql(){
Listlist=new ArrayList<>();
for (int i = 50; i < 60; i++) {
Dept dept=new Dept();
dept.setDeptno(i);
dept.setDname(“dname”+i);
dept.setLoc(“loc”+i);
list.add(dept);
}
//获取数据库链接
SqlSession sqlSession= MyBatiesUtils.getSqlSession();
int count=sqlSession.insert(“com.zks.dao.DeptMapper.insertSql”,list);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
foreach做批处理的第二种方式是利用伪表查询
模糊查询的四种方式
<!-- 模糊查询四种方式方法1,这种情况下,输入的ename需要在前后加上%-->
<select id="selectLike1" parameterType="String">
select * from emp where ename like #{ename}
</select>
<!-- 模糊查询四种方式方法2,这种情况下直接输入查询的条件,用$符号是字符串的链接-->
<select id="selectLike2" parameterType="String">
select * from emp where ename like '%${ename}%'
</select>
<!-- 模糊查询四种方式方法3,这种情况下直接输入查询的条件-->
<select id="selectLike2" parameterType="String">
select * from emp where ename like concat('%',#{ename},'%')
</select>
<!-- 模糊查询四种方式方法3,这种情况下直接输入查询的条件-->
<select id="selectLike2" parameterType="String">
<bind name="enameLike" value="'%+#{ename}+%'"/>
select * from emp where ename like #{enameLike}
</select>