时间:2021-05-20
动态SQL就是动态的生成SQL。
if标记
假设有这样一种需求:查询用户,当用户名不等于“admin”的时候,我们还需要密码为123456。
数据库中的数据为:
MyBatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--定义别名 注意typeAliases一定要在environments之前--><typeAliases><typeAlias type="jike.book.pojo.JiKeUser" alias="JiKeUser"/><typeAlias type="jike.book.pojo.Author" alias="Author"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/jikebook"/><property name="username" value="root"/><property name="password" value="*****"/></dataSource></environment></environments><mappers><mapper resource="jike/book/map/jikeUser.xml"/></mappers></configuration>JiKeUser.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="/"><select id="selectSQL" resultType="JiKeUser" parameterType="JiKeUser">SELECT * FROM jikebook.jikeuserWHERE 1=1<if test="userName!='admin'">AND password=#{password}</if></select></mapper>测试类:
package jike.book.test;import jike.book.pojo.JiKeUser;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 java.io.IOException;import java.io.Reader;import java.util.List;/*** DateTime: 2016/9/6 13:36* 功能:* 思路:*/public class TestSQL {public static void main(String[] args) {// 资源路径String resource="jike/book/map/MyBatisConfig.xml";Reader reader=null;SqlSession session;try {reader= Resources.getResourceAsReader(resource);} catch ( IOException e ) {e.printStackTrace();}SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);session=sqlMapper.openSession();JiKeUser jiKeUser=new JiKeUser();jiKeUser.setPassword("123456");List<JiKeUser> userList=session.selectList("selectSQL",jiKeUser);for ( JiKeUser user:userList ) {System.out.println("userName:"+user.getUserName());}session.close();}}运行结果为:
choose标记
假设我们当前有这么一个需求:查询用户,如果用户名不为空就加上用户名这个条件,如果id不为空也加上id这个条件,否则的话就是设置密码不为空,这就是一个多路选择。
MyBatisConfig.xml不改变,在JikeUser.xml中加上:
<select id="selectJiKeUserChoose" resultType="JiKeUser" parameterType="JiKeUser">select * from jikeuser where 1=1<choose><when test="userName!=null">and userName like #{userName}</when><when test="id!=0">and id =#{id}</when><otherwise>and password is not null</otherwise></choose></select>测试类:假设用户名不为空:
package jike.book.test;import jike.book.pojo.JiKeUser;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 java.io.IOException;import java.io.Reader;import java.util.List;/*** DateTime: 2016/9/6 13:36* 功能:* 思路:*/public class TestSQL {public static void main(String[] args) {// 资源路径String resource="jike/book/map/MyBatisConfig.xml";Reader reader=null;SqlSession session;try {reader= Resources.getResourceAsReader(resource);} catch ( IOException e ) {e.printStackTrace();}SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);session=sqlMapper.openSession();JiKeUser jiKeUser=new JiKeUser();jiKeUser.setUserName("YEN");List<JiKeUser> userList=session.selectList("selectJiKeUserChoose",jiKeUser);for ( JiKeUser user:userList ) {System.out.println("userName:"+user.getUserName());}session.close();}}结果为:
假设不设置用户名这个条件,即注释掉jiKeUser.setUserName("YEN");:
where标记、set标记
上面我们在choose中查询是不能确定子连接条件中的and是写还是不写,因此加了一个1=1.而where会只能的去判断该不该加。
<select id="selectJiKeUserWhere" resultType="JiKeUser" parameterType="JiKeUser">select * from jikeuser<where><if test="userName!=null">and userName like #{userName}</if><if test="id!=null">and id =#{id}</if></where></select>set标记智能赋值,会自动去掉多余的”,”。
<update id="updateJiKeUserSet" parameterType="JiKeUser">update JiKeUser<set><if test="userName != null">userName=#{userName},</if><if test="password != null">password=#{password},</if></set>where id=#{id}</update>操作之前的数据:
操作:
操作结果:
<update id="updateUserTrim" parameterType="JiKeUser">UPDATE JiKeUser<trim prefix="SET" suffixOverrides="," suffix="WHERE id = #{id}" ><if test="userName != null and userName != '' ">userName = #{userName},</if><if test="password != null and password != '' ">password=#{password},</if></trim></update>foreach标记
通常用于循环查询或循环赋值
<select id="selectJiKeUserForeach" resultType="JiKeUser" parameterType="list">select * from jikeuser<where>id in<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach></where></select>测试:
以上所述是小编给大家介绍的Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接“where“、“set“以及“values(“等前缀,或者
trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码: 1、 select*fromuser ANDname=#{na
A.where标签会自动删除第一个多余的and或者or,set标签会自动删除最后一个','B.trim标记,是一个格式化的标记,可以完成set或者是where标
1.通过trim格式化标记set或where功能2.对于set自动删除最后一个“,”,对于where自动删除最后一个“and|or”使用示例如下:1、selec
在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了f