mybatis.5.動態SQL

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 集合中(此時須要生成(**,***,)的形式)

相關文章
相關標籤/搜索