1.动态SQL,解决关联sql字符串的问题,mybatis的动态sql基于OGNL表达式java
if语句,在DeptMapper.xml增长以下语句;sql
<select id="selectByLikeName" resultType="org.mybatis.example.dao.Dept" parameterType="org.mybatis.example.dao.Dept"> select d.deptno,d.dname,d.loc from dept d where 1=1 <if test="dname!=null and dname!=''"> AND dname like #{dname} </if> </select>
DeptMapper.java接口中增长以下代码session
public Dept selectByLikeName(Dept dept);
测试类以下:mybatis
public class Test23 { public static void main(String[] args) { SqlSession session=SqlSessionFactoryUtil.getSqlSession(); DeptMapper mapper=session.getMapper(DeptMapper.class); Dept d=new Dept(); d.setDname("开发部"); Dept dept=mapper.selectByLikeName(d); System.out.println(dept.getDname()); }}
若是查询雇员的姓名,查询出雇员而且找到一些部门呢?app
EmpMapper.xml增长以下代码ide
<select id="selectByLike" resultMap="getEmpresultMap" parameterType="org.mybatis.example.dao.Emp"> select d.deptno,d.dname,d.loc,e.empno,e.ename from Dept d join emp e on d.deptno=e.deptno where 1=1 <if test="ename!=null and ename!=''"> AND ename like #{ename} </if> <if test="dept!=null and dept.dname!=null"> AND dname like #{dept.dname} </if> </select>
EmpMapper.java增长以下代码:测试
public List<Emp> selectByLike(Emp e);spa
测试类:.net
public class Test24 { public static void main(String[] args) { SqlSession session=SqlSessionFactoryUtil.getSqlSession(); EmpMapper mapper=session.getMapper(EmpMapper.class); Emp e=new Emp(); e.setEname("张%"); List<Emp>empList=mapper.selectByLike(e); for(Emp emp:empList){ System.out.println("全部名字首字母为张的员工是:"+emp.getEname()); } }}
3 choose when otherwise语句xml
有时候针对,有多重选择的状况,可使用choose语句
<select id="selectByLikeTwo" parameterType="org.mybatis.example.dao.Emp" resultMap="getEmpresultMap"> select d.deptno,d.dname,d.loc,e.empno,e.ename,e.sal from Dept d join emp e on d.deptno=e.deptno where 1=1 <choose> <when test="ename!=null">AND ename like #{ename}</when> <when test="dept!=null and dept.dname!=null">AND dname=#{dept.dname}</when> <otherwise>AND sal >5000</otherwise> </choose> </select>
EmpMapper.java增长接口
public List<Emp> selectByLikeTwo(Emp e);
public class Test25 { public static void main(String[] args) { SqlSession session=SqlSessionFactoryUtil.getSqlSession(); EmpMapper mapper=session.getMapper(EmpMapper.class); Emp e=new Emp(); Dept d=new Dept(); d.setDname("开发部"); e.setDept(d); List<Emp>empList=mapper.selectByLikeTwo(e); for(Emp emp:empList){ System.out.println("全部开发部的员工:"+emp.getEname()); } }}
4.
<select id="selectByLikeName" resultType="org.mybatis.example.dao.Dept" parameterType="org.mybatis.example.dao.Dept"> select d.deptno,d.dname,d.loc from dept d where <if test="dname!=null"> 1=1 </if> <if test="dname!=null and dname!=''"> AND dname like #{dname} </if> </select>
测试类
public static void main(String[] args) { SqlSession session=SqlSessionFactoryUtil.getSqlSession(); DeptMapper mapper=session.getMapper(DeptMapper.class); Dept d=new Dept(); //或者设置为null d.setDname("开发部");//设置为null的时候注释 List<Dept>deptList=mapper.selectByLikeName(d); System.out.println(deptList.get(0).getDname()); }
5. foreach
动态SQL迭代一个集合,一般放在In条件语句中,foreach容许指定一个集合,声明集合项和索引变量,他们能够用在元素体内,也容许指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是智能的,不会偶然地附加多余的分隔符。
在EmpMapper.xml中增长代码段
<select id="selectDeptIn" resultType="org.mybatis.example.dao.Dept"> select * from dept d where deptno in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
在接口EmpMapper.java中增长代码
public List<Dept> selectDeptIn(List<Integer>list);
测试类代码段
public class Test26 { public static void main(String[] args) { SqlSession session=SqlSessionFactoryUtil.getSqlSession(); DeptMapper mapper=session.getMapper(DeptMapper.class); List<Integer>idList=new ArrayList<Integer>(); idList.add(5); idList.add(6); List<Dept>deptList=mapper.selectDeptIn(idList); System.out.println(deptList.get(0).getDname()); System.out.println(deptList.get(1).getDname()); }}
对于在Mybatis中出现的TooManyResultsException异常,须要将接口的方法返回类型修改成List<T>泛型类型便可。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每个元素进行迭代时的别名.
index指 定一个名字,用于表示在迭代过程当中,每次迭代到的位置.
open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号做为分隔 符.
close表示以什么结束.
<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
select * from t_news n where
<foreach collection="listTag" index="index" item="tag" open=""
separator="or" close="">
#{tag} in n.tags
</foreach>
</select>
因此 去除左右括号 和 把,改为 or 进行 。 就能够转化为这种形式。
select * from t_news n where ? in n.tags or ? in n.tags 这样能够用List<String> 来查。
可是查不到数据
须要使用以下方式:
<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
select * from t_news n where
<foreach collection="listTag" index="index" item="tag" open=""
separator="or" close="">
n.tags like '%'||#{tag}||'%'
</foreach>
<lect>
生成的SQL为
select * from t_news n where n.tags like ? or n.tags like ?
foreach : 用的更多的地方为: 根据Id批量删除 / 判断什么 in 集合中(此时须要生成(**,***,)的形式)