zoukankan      html  css  js  c++  java
  • mybatis--MyBatis动态SQL语句

    mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:
    1. if 语句 (简单的条件判断)
    2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
    3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
    4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
    5. set (主要用于更新时)
    6. foreach (用于mybatis语句查询)

     
    1.if语句(简单的条件判断)
    (1)数据库my的user表数据为:
     
     
    (2)首先创建一个mybatis项目,mybatis_008

    (3)建立com.zk.dao包下的IUser接口:

    IUser.java

    package com.zk.dao;
    
    import org.apache.ibatis.annotations.Param;
    import com.zk.pojo.User;
    
    public interface IUser {
    		public User findUserWithNameLike(@Param("id")int id, @Param("name")String name);
    }
    

    (4)在com.zk.pojo包下建立User实现IUser接口中的方法,并配置UserMapper.xml

    User.java

    package com.zk.pojo;
    
    public class User {
    	private int id;
    	private String name;
    	private String level;
    	private String phone;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getLevel() {
    		return level;
    	}
    	public void setLevel(String level) {
    		this.level = level;
    	}
    	public String getPhone() {
    		return phone;
    	}
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + ", level=" + level
    				+ ", phone=" + phone + "]";
    	}
    }
    

    UserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.zk.dao.IUser">
    <select id="findUserWithNameLike" resultType="User">
      SELECT * FROM user 
      WHERE id = #{id} <if test="name!= null">
        AND name like #{name}
      </if>
    </select>
    </mapper>
    

    (5)配置config/configure.xml

    configure.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <typeAliases>
    <typeAlias alias="User" type="com.zk.pojo.User" />
    </typeAliases>
    
    <environments default="development">
    	    <environment id="development">
    		<transactionManager type="JDBC" />
    		<dataSource type="POOLED">
    		<property name="driver" value="com.mysql.jdbc.Driver" />
    		<property name="url" value="jdbc:mysql://localhost:3306/my"/>
    		<property name="username" value="root"/>
    		<property name="password" value="123456"/>
    		</dataSource>
    		</environment>
    	</environments>
    
    	<mappers>
    	     <!-- // power by http://www.yiibai.com -->
    	     <mapper resource="com/zk/pojo/UserMapper.xml" />
    	</mappers>
    </configuration>
    

    (6)实现main函数

    MainApp.java

    package Main;
    
    import java.io.IOException;
    import java.io.Reader;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import com.zk.dao.IUser;
    import com.zk.pojo.User;
    
    public class MainApp {
    	private static SqlSessionFactory sqlsessionfactory;
    	private static Reader reader;
    	
    	static{
    		try {
    			reader=Resources.getResourceAsReader("config/configure.xml");
    			sqlsessionfactory=new SqlSessionFactoryBuilder().build(reader);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	public SqlSessionFactory getSqlSessionFactory()
    	{
    		return sqlsessionfactory;
    	}
    	
    	public static void main(String[]args)
    	{
    		select(1,"c");
    	}
    	
    	public static void select(int id,String name){
    		//获取session连接
    		SqlSession session=sqlsessionfactory.openSession();
    		//获取mapper
    		IUser usermap=session.getMapper(IUser.class);
    		//selectAllUser();
    		User user = usermap.findUserWithNameLike(id, name);
    		//执行查询
    		System.out.println(user.toString());
    		session.commit();
    		//selectAllUser();
    	}
    }
    

      Main执行结果如下:

    2. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)

    (1) UserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.zk.dao.IUser">
    <select id="findUserWithNameLike" resultType="User">
      SELECT * FROM user    
      <where>  <if test="id!=null">id like #{id}</if>
      <if test="name!=null">AND name like #{name}</if>
      </where>
      </select>
    </mapper>
    

    运行结果如下:

    3. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.

    同样原始的数据库,仅更改pojo层的UserMapper.xml,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.zk.dao.IUser">
    <select id="findUserWithNameLike" resultType="User">
      SELECT * FROM user where
        <choose>
        <when test="id!=null">
        id like #{id}
        </when>
        <when test="name!=null">
        AND name like #{name}
        </when>
        </choose>
      
    </select>
    </mapper>

     运行后得到的结果如下图所示:

    4. set (主要用于更新时)

    (1)IUser.java

    package com.zk.dao;
    
    
    
    import com.zk.pojo.User;
    
    
    public interface IUser {
    	public User updateUser(User user);
    }
    

    (2)UserMapper.xml和User.java

    User.java

    package com.zk.pojo;
    
    public class User {
    	private int id;
    	private String name;
    	private String level;
    	private String phone;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getLevel() {
    		return level;
    	}
    	public void setLevel(String level) {
    		this.level = level;
    	}
    	public String getPhone() {
    		return phone;
    	}
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + ", level=" + level
    				+ ", phone=" + phone + "]";
    	}
    }
    

    UserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.zk.dao.IUser">
    <update id="updateUser" parameterType="User">
    update user
    <set>
    <if test="name!=null">name=#{name},</if>
    <if test="level!=null">level=#{level},</if>
    <if test="phone!=null">phone=#{phone}</if>
    </set>
    where id=#{id}
    </update>
    </mapper>
    

    (3)configure.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <typeAliases>
    <typeAlias alias="User" type="com.zk.pojo.User" />
    </typeAliases>
    
    <environments default="development">
    	    <environment id="development">
    		<transactionManager type="JDBC" />
    		<dataSource type="POOLED">
    		<property name="driver" value="com.mysql.jdbc.Driver" />
    		<property name="url" value="jdbc:mysql://localhost:3306/my"/>
    		<property name="username" value="root"/>
    		<property name="password" value="123456"/>
    		</dataSource>
    		</environment>
    	</environments>
    
    	<mappers>
    	     <mapper resource="com/zk/pojo/UserMapper.xml" />
    	</mappers>
    </configuration>
    

    (4)Main.java

    package Main;
    
    import java.io.IOException;
    import java.io.Reader;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import com.zk.dao.IUser;
    import com.zk.pojo.User;
    
    public class MainApp {
    	private static SqlSessionFactory sqlsessionfactory;
    	private static Reader reader;
    	
    	static{
    		try {
    			reader=Resources.getResourceAsReader("config/configure.xml");
    			sqlsessionfactory=new SqlSessionFactoryBuilder().build(reader);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	public SqlSessionFactory getSqlSessionFactory()
    	{
    		return sqlsessionfactory;
    	}
    	
    	public static void main(String[]args)
    	{
    		SqlSession session=sqlsessionfactory.openSession();
    		User user=new User();
    		user.setId(1);
    		user.setName("a");
    		user.setLevel("a");
    		user.setPhone("137298647");
    		
    		session.update("updateUser",user);
    		session.commit();
    	}
    } 

    运行结果如下: 

     5. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)

     IUser.java

    package com.zk.dao;
    
    import org.apache.ibatis.annotations.Param;
    import com.zk.pojo.User;
    
    public interface IUser {
    	public User findUserWithNameLike(@Param("id")int id, @Param("name")String name);
    }
    

    User.java

    package com.zk.pojo;
    
    public class User {
    	private int id;
    	private String name;
    	private String level;
    	private String phone;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getLevel() {
    		return level;
    	}
    	public void setLevel(String level) {
    		this.level = level;
    	}
    	public String getPhone() {
    		return phone;
    	}
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + ", level=" + level
    				+ ", phone=" + phone + "]";
    	}
    }
    

     UserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.zk.dao.IUser">
    <select id="findUserWithNameLike" resultType="User">
      SELECT * FROM user  
    <trim prefix="WHERE" prefixOverrides="AND">
    	<if test="id!=null">
    	  id=#{id}
    	</if> 
    	<if test="name!= null">
    	  AND name like #{name}
    	</if>
    </trim>
    </select>
    </mapper>

    MainApp.java

    package Main;
    
    import java.io.IOException;
    import java.io.Reader;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import com.zk.dao.IUser;
    import com.zk.pojo.User;
    
    public class MainApp {
    	    private static SqlSessionFactory sqlsessionfactory;
    	    private static Reader reader;
    	     
    	    static{
    	        try {
    	            reader=Resources.getResourceAsReader("config/configure.xml");
    	            sqlsessionfactory=new SqlSessionFactoryBuilder().build(reader);
    	        } catch (IOException e) {
    	            // TODO Auto-generated catch block
    	            e.printStackTrace();
    	        }
    	    }
    	     
    	    public SqlSessionFactory getSqlSessionFactory()
    	    {
    	        return sqlsessionfactory;
    	    }
    	     
    	    public static void main(String[]args)
    	    {
    	        select(1,"a");
    	    }
    	     
    	    public static void select(int id,String name){
    	        //获取session连接
    	        SqlSession session=sqlsessionfactory.openSession();
    	        //获取mapper
    	        IUser usermap=session.getMapper(IUser.class);
    	        //selectAllUser();
    	        User user = usermap.findUserWithNameLike(id, name);
    	        //执行查询
    	        System.out.println(user.toString());
    	        session.commit();
    	        //selectAllUser();
    	    }
    }
    

    执行结果如下:

     

     6. foreach (用于mybatis语句查询)

    UserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.zk.dao.IUser">
    <select id="findUsersWithIdforeach" resultType="User">
      SELECT * FROM user  
      <where>id in
      <foreach collection="list" item="item" open="(" close=")" separator=",">
      #{item}
      </foreach>
      </where>
    </mapper>
    

    IUser.java

    package com.zk.dao;
    
    import java.util.List;
    import org.apache.ibatis.annotations.Param;
    
    import com.zk.pojo.User;
    
    public interface IUser {
    	public List<User> findUsersWithIdforeach(@Param("list")List<Integer> list);
    }
    

    Main.java

    package Main;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import com.zk.dao.IUser;
    import com.zk.pojo.User;
    
    public class MainApp {
    	 private static SqlSessionFactory sqlsessionfactory;
    	    private static Reader reader;
    	     
    	    static{
    	        try {
    	            reader=Resources.getResourceAsReader("config/configure.xml");
    	            sqlsessionfactory=new SqlSessionFactoryBuilder().build(reader);
    	        } catch (IOException e) {
    	            // TODO Auto-generated catch block
    	            e.printStackTrace();
    	        }
    	    }
    	     
    	    public SqlSessionFactory getSqlSessionFactory()
    	    {
    	        return sqlsessionfactory;
    	    }
    	     
    	    public static void main(String[]args)
    	    {
    	        select(1,"a");
    	    }
    	     
    	    public static void select(int id,String name){
    	        //获取session连接
    	        SqlSession session=sqlsessionfactory.openSession();
    	        //获取mapper
    	        IUser usermap=session.getMapper(IUser.class);
    	        //selectAllUser();
    	        List ids=new ArrayList();
    	        ids.add(1);
    	        ids.add(2);
    	        ids.add(3);
    	        ids.add(4);
    	        //执行查询
    	        //System.out.println(user.toString());
    	        List<User> users=usermap.findUsersWithIdforeach(ids);
    	        for(User u:users)
    	        {
    	        	System.out.println(u);
    	        }
    	        session.commit();
    	        //selectAllUser();
    	    }
    }

    程序运行结果:

    数据库中数据:

  • 相关阅读:
    hibernate set的3个属性
    我的Android进阶之旅------&gt;Android无第三方Jar包的源代报错:The current class path entry belongs to container ...的解决方法
    SAN,NAS,DAS的差别
    SSDT表概念具体解释
    《COM本质论》COM是一个更好的C++心得分享
    Hadoop学习小结
    出来混,是否应该吹牛皮
    出来混,是否应该吹牛皮
    创业的关键:顺势而为
    创业的关键:顺势而为
  • 原文地址:https://www.cnblogs.com/longlyseul/p/11273626.html
Copyright © 2011-2022 走看看