1.动态SQL,解决关联sql字符串的问题,mybatis的动态sql基于OGNL表达式
if语句,在DeptMapper.xml增加如下语句;
select d.deptno,d.dname,d.loc from dept d where 1=1AND dname like #{dname}
DeptMapper.java接口中增加如下代码
public Dept selectByLikeName(Dept dept);
测试类如下:
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()); } }
如果查询雇员的姓名,查询出雇员并且找到一些部门呢?
EmpMapper.xml增加如下代码
select d.deptno,d.dname,d.loc,e.empno,e.ename from Dept d join emp e on d.deptno=e.deptno where 1=1AND ename like #{ename}AND dname like #{dept.dname}
EmpMapper.java增加如下代码:
public ListselectByLike(Emp e);
测试类:
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("张%"); ListempList=mapper.selectByLike(e); for(Emp emp:empList){ System.out.println("所有名字首字母为张的员工是:"+emp.getEname()); } } }
3 choose when otherwise语句
有时候针对,有多重选择的情况,可以使用choose语句
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=1AND ename like #{ename}AND dname=#{dept.dname}AND sal >5000
EmpMapper.java增加接口
public ListselectByLikeTwo(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); ListempList=mapper.selectByLikeTwo(e); for(Emp emp:empList){ System.out.println("所有开发部的员工:"+emp.getEname()); } } }
4.
select d.deptno,d.dname,d.loc from dept d where1=1AND dname like #{dname}
测试类
public static void main(String[] args) { SqlSession session=SqlSessionFactoryUtil.getSqlSession(); DeptMapper mapper=session.getMapper(DeptMapper.class); Dept d=new Dept(); //或者设置为null d.setDname("开发部");//设置为null的时候注释 ListdeptList=mapper.selectByLikeName(d); System.out.println(deptList.get(0).getDname()); }
5. foreach
动态SQL迭代一个集合,通常放在In条件语句中,foreach允许指定一个集合,声明集合项和索引变量,他们可以用在元素体内,也允许指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是智能的,不会偶然地附加多余的分隔符。
在EmpMapper.xml中增加代码段
select * from dept d where deptno in#{item}
在接口EmpMapper.java中增加代码
public ListselectDeptIn(Listlist);
测试类代码段
public class Test26 { public static void main(String[] args) { SqlSession session=SqlSessionFactoryUtil.getSqlSession(); DeptMapper mapper=session.getMapper(DeptMapper.class); ListidList=new ArrayList(); idList.add(5); idList.add(6); ListdeptList=mapper.selectDeptIn(idList); System.out.println(deptList.get(0).getDname()); System.out.println(deptList.get(1).getDname()); } }
对于在Mybatis中出现的TooManyResultsException异常,需要将接口的方法返回类型修改为List泛型类型即可。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名.
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.
open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符.
close表示以什么结束.
select * from t_news n where