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 语句 (简单的条件判断)
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(); } }
程序运行结果:
数据库中数据: