MyBatis之where语句

针对模糊查询的三种方式

业务层传递数据,在映射文件取值时where语句理论上应写为where user_name like #{user_name}%,但实际上控制台会报错。

### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘%‘ at line 1

提示的是数据库Sql语句的错误,如果使用了log4j日志,控制台显示:

DEBUG [main] - ==> Preparing: select * from web_user where user_name like ?%
DEBUG [main] - ==> Parameters: 悟(String)

后面会解释为什么会出错。所以直接取值是不行的,可以使用下面的几种方式。

一  在业务层进行处理

在业务层接收到数据时,首先对数据进行一次简单的处理操作。

//接口中的方法为List<User> where01(String user_name);try {
    sqlSession = MyBatisUtil.getSqlSession();
    String user_name = "悟";
    List<User> list = sqlSession.getMapper(UserDao.class).where01(user_name + "%");
    logger.debug(list);
  } finally {
    MyBatisUtil.closeSqlSession(sqlSession);
  }

映射文件中的sql语句为:

<select id="where01" resultType="self.exercise.bean.User" parameterType="string">
  select * from web_user where user_name like #{user_name}
</select>

此时日志在控制台输出

DEBUG [main] - ==>  Preparing: select * from web_user where user_name like ?
DEBUG [main] - ==> Parameters: 悟%(String)

二  在映射文件取值时进行处理

在业务层不进行数据处理,在映射文件中不用#{}取值,改为${}方式取值。

<select id="where01" resultType="self.exercise.bean.User" parameterType="string">
  select * from web_user where user_name like ‘${_parameter}%‘
</select>

控制台的信息:

DEBUG [main] - ==>  Preparing: select * from web_user where user_name like ‘悟%‘
DEBUG [main] - ==> Parameters: 

由此可以看出#和$的区别

#会将字符串进行预处理,用一对引号加在字符串外边,再替代?如#{user_name}% -->‘悟‘%,所以直接用#{}接值控制台报错的原因就在于此。

$将取到的数据直接替换掉,并不会进行预处理。如‘${_parameter}%‘ -->‘悟%‘

三  在映射文件用方法进行拼接

在业务层不进行数据处理,在映射文件调用MySql的concat(param1,param2,...)进行拼接

<select id="where03" resultType="self.exercise.bean.User" parameterType="string">
  select * from web_user where user_name like concat(#{user_name},"%")
</select>

日志:

DEBUG [main] - ==>  Preparing: select * from web_user where user_name like concat(?,"%")
DEBUG [main] - ==> Parameters: 悟(String)

针对多条件的where语句

当有多个查询条件时,也有几种方式可以实现。

一  用if标签进行条件筛选 

//接口中的方法为List<User> wheremore(@Param("userName") String user_name, @Param("account") String account);try {
     sqlSession = MyBatisUtil.getSqlSession();
     String user_name = "悟";
     String account = "wukong";
     List<User> list = sqlSession.getMapper(UserDao.class).wheremore(user_name, account);
     logger.debug(list);
  } finally {
    MyBatisUtil.closeSqlSession(sqlSession);
  }

映射文件中的内容为:

<select id="wheremore" resultType="self.exercise.bean.User">
    select * from web_user where 1=1
    <if test="userName != null and userName != ‘‘.trim()">
        and user_name like concat(#{userName},"%")
    </if>
    <if test="account != null and account != ‘‘.trim()">
        and account = #{account}
    </if>
</select>

其中,test中的变量对应的为map中的key值、类中的属性名或者接口中param方法映射出的属性名

test中进行测试时一些运算符需要进行用转义运算符替换,现整理一些我知道的:

逻辑与    and     &amp;&amp;
大于        >     &gt;
小于              只能用&lt;
等于       ==

判断一个字符串不为空串的几种方式:

<if test="user_name != ‘‘.trim()"></if>
<if test="user_name.lengh() != 0"></if>

以上的多条件查询方法,where后面跟着 1=1,每次执行sql语句都会进行一次判断(即使条件全部为空),当数据量很大时效率低下,可以where标签进行改进。

<select id="wheremore02" resultType="self.exercise.bean.User">
  select * from web_user
  <where>
    <if test="userName != null and userName != ‘‘.trim()">
      and user_name like concat(#{userName},"%")
    </if>    <if test="account != null &amp;&amp; account.length() != 0">      and account = #{account}
      </if>
  </where>
</select>

where标签会检索语句,将where中的第一个and 或者or 去掉,这里的and 和or 都是sql中的关键字,如果名为and_user_name的属性在最前面,则不会被检索出来。

二  用choose标签,相当于Java中的switch分支语句

<select id="wheremore03" resultType="self.exercise.bean.User">
    select * from web_user
    <where>
        <choose>
            <when test="userName != null and userName != ‘‘.trim()">
                and user_name like concat(#{userName},"%")
            </when>
            <when test="account != null &amp;&amp; account.length() != 0">
                and account = #{account}
            </when>
        </choose>
    </where>
</select>                                                                 
时间: 2024-10-21 18:32:18

MyBatis之where语句的相关文章

mybatis实战教程(mybatis in action)之八: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条件判断的,能智能的处理 a

在mybatis执行SQL语句之前进行拦击处理

比较适用于在分页时候进行拦截.对分页的SQL语句通过封装处理,处理成不同的分页sql. 实用性比较强. import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Properties; import org.apache.ibatis.e

java mybatis学习之$和#区别,mapper代理接口,动态SQL,在日志中输出mybatis的sql语句

1.在mybatis中,$和#的区别: #{}:表示一个预处理参数,参数类型不定,是根据传入的参数类型来设定的.类似于JDBC中的? 特例使用,模糊查询:(针对oracle): and username like concat(concat('%',#{username}),'%') ${}:相当于是我们的JDBC里的字符串拼接.这里就相当于传入的就是一个字符串(不管传入什么样的数据类型,都是字符串) and username like '%${value}%' 2.$和#在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条件判断的,能智能的

MyBatis的foreach语句详解

MyBatis的foreach语句详解 MyBatis的foreach语句详解 1人收藏此文章, 我要收藏 发表于3个月前 , 已有113次阅读 共0个评论 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,se

log4j打印MyBatis的sql语句配置

log4j.rootLogger=DEBUG,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) -%m%n log4j.logger.com.ibatis=debug log4j

mybatis显示sql语句 log4j.properties配置文件

log4j.properties配置如下: 1 将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句,方便调试: 2 3 ### 设置Logger输出级别和输出目的地 ### 4 log4j.rootLogger=debug,stdout,logfile 5 6 7 ### 把日志信息输出到控制台 ### 8 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 9 #log4j.appender.

基于SpringJDBC的类mybatis形式SQL语句管理的思考与实现

SpringJDBC为我们提供了一个非常方便的数据库访问接口,我们都知道使用JdbcTemplate对数据库进行操作时需要传入执行的SQL语句.在小型系统中,SQL语句可能并不会太多,这个时候我们无论采取什么方式进行管理都没有关系.但是当系统逐渐庞大后,我们就要考虑以一种恰当的方式对这些SQL进行管理了.我们将首先介绍比较常见的几种SQL管理方式,然后再讨论类mybatis形式的SQL管理方式. 在方法中直接构造并传入 这种方式是在需要执行数据库操作的方法内直接硬编码SQL语句.这样做的好处在于

通过Log4j的DEBUG级别来显示mybatis的sql语句

    为了更加方便调试sql语句,需要显示mybatis的sql语句.     网络上的一般方式都是通过log4j来实现,但是很多都有问题.      经过实验,以下代码能够保持正常:(只显示mybatis的sql语句的debug语句,其他的debug不显示)     log4j.rootLogger = DEBUG,CONSOLE,LogFile,ErrorFile #注意这里需要改成DEBUG # 应用于控制台 log4j.appender.CONSOLE = org.apache.log

ssm环境下配置log4j打印mybatis的sql语句

首先附上官网的说明文档: mybatis Logging环境spring4.3.0+springmvc4.3.0+mybatis3.4.0 按官方文档的说明 1 SLF4J 2 Apache Commons Logging 3 Log4j 2 4 Log4j 5 JDK logging mybatis会使用最先找到的(按上文列举的顺序查找),不少应用服务器的classpath中已经包含Commons Logging,如Tomcat和WebShpere, 所以MyBatis会把它作为具体的日志实现