欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mybatis之动态SQL(代码实例)

程序员文章站 2022-03-09 21:32:14
动态sql是mybatis的—个强大的特性。在使用jdbc操作数据时,如果查询条件特别多,将条件串联成sql字符串是一项痛苦的事情,通常的解决方法是写很多的if-else条件语句和字符串...

动态sql是mybatis的—个强大的特性。在使用jdbc操作数据时,如果查询条件特别多,将条件串联成sql字符串是一项痛苦的事情,通常的解决方法是写很多的if-else条件语句和字符串进行拼接,并确保不能忘了空格或在字段的最后省略逗号。mybatis使用一种强大的动态sql语言来改进这种情形,动态sql基于ognl的表达式,可使我们方便地在sql语句中实现某些逻辑。

案例1 使用动态sql进行查询

sql语句:

<select id="selectbycon"   
      parametertype="com.obtk.entitys.conditionentity"   
            resulttype="studententity">  
        select * from student  where  1=1  
      
            <if test="gender!=null">  
               and gender=#{gender}  
            </if>  
            <if test="stuname!=null">  
               and stuname like concat('%',#{thename},'%')  
            </if>  
            <if test="minage!=null">  
               and age>=#{minage}  
            </if>  
            <if test="maxage!=null">  
               and age<![cdata[<=]]>#{maxage}  
            </if>  
            <if test="address!=null">  
               and address=#{address}  
            </if>  
      
    </select>  

代码:

package com.obtk.test2;

import java.util.list;

import org.apache.ibatis.session.sqlsession;

import com.obtk.entitys.conditionentity;
import com.obtk.entitys.studententity;
import com.obtk.utils.mybatisutil;

public class testconquery {
	public static void main(string[] args) {
		sqlsession session=null;
		try {
			//4.得到session
			session=mybatisutil.getsession();
			conditionentity con=new conditionentity();
			con.setminage(20);
			con.setmaxage(44);
			con.setgender("男");
			//5.执行语句
			list stulist=session.
			         selectlist("stu.selectbycon",con);
			for(studententity stu : stulist){
				system.out.println(stu.getstuname()+","+stu.getgender()
						+","+stu.getage());
			}
		} catch (exception e) {
			e.printstacktrace();
		}finally{
			mybatisutil.closesession();
		}
	}
}

或者使用where标签,如下:

<select id="selectbycon"   
      parametertype="com.obtk.entitys.conditionentity"   
            resulttype="studententity">  
        select * from student  
        <where>  
            <if test="gender!=null">  
               and gender=#{gender}  
            </if>  
            <if test="stuname!=null">  
               and stuname like concat('%',#{thename},'%')  
            </if>  
            <if test="minage!=null">  
               and age>=#{minage}  
            </if>  
            <if test="maxage!=null">  
               and age<![cdata[<=]]>#{maxage}  
            </if>  
            <if test="address!=null">  
               and address=#{address}  
            </if>  
        </where>  
    </select>  

代码同上。

where元素的作用是在写入where元素的地方输出一个where。另外,mybatis会智能处理输出条件,如果所有条件都不满足,那么mybatis会查出所有的记录;如果输出后是以and开头的,mybatis会把第一个and忽略。因此不用写1=1这样的条件了。

案例2 使用动态sql进行更新操作

sql语句


		update student 
		
			stuname=#{stuname},
			gender=#{gender},
			age=#{age},
			address=#{address},
			deptidd=#{deptidd},
		
		where stuid=#{stuid}
	

代码:

package com.obtk.test2;

import org.apache.ibatis.session.sqlsession;

import com.obtk.entitys.studententity;
import com.obtk.utils.mybatisutil;

public class testupdatebycon {
	public static void main(string[] args) {
		sqlsession session=null;
		try {
			//4.得到session
			session=mybatisutil.getsession();
			studententity thestu=new studententity("小绿花", "女", 23, "火星");
			thestu.setstuid(129);
			//5.执行语句,参数比较多,就用实体类的对象传参
			int theid=session.update("stu.updatebycon", thestu);
			session.commit();
			system.out.println("修改成功!"+theid);
		} catch (exception e) {
			e.printstacktrace();
		}finally{
			mybatisutil.closesession();
		}
	}
}