Mybatis模糊查询的几种方式

我们进行模糊查询时,如果是Mysql数据库,经常用到的是一个concat用“%”和参数相连接,而Oracle是用“||”这样的连接符。这样SQL就要2种区实现,造成了数据库不可以更改的局面,于是Mybatis框架有了bind这个元素,我们就完全不用数据库的语言了。如:

第一种 用bind实现模糊查询 通用数据库

  1. List<RoleEntity> selectBykeyWord(@Param("keyword") String keyword);
  2. <select id="selectBykeyWord" parameterType="string" resultType="com.why.mybatis.entity.RoleEntity">
  3. <bind name="pattern" value="'%' + keyword + '%'" >bind>
  4. SELECT
  5. *
  6. FROM
  7. t_role
  8. WHERE
  9. role_name LIKE #{pattern}
  10. select>

这样我们把值赋给了pattern,我们就可以在select语句中就可以用,提高了数据库的可移植性,建议用这种方法。

如果keyword为空,会出现:Error querying database. Cause: java.lang.NullPointerException的错误,可以这样:

  1. List<RoleEntity> selectBykeyWord(@Param("keyword") String keyword);
  2. <select id="selectBykeyWord" parameterType="string" resultType="com.why.mybatis.entity.RoleEntity">
  3. SELECT
  4. *
  5. FROM
  6. t_role
  7. WHERE 1=1
  8. <if test="keyword!=null and keyword!=''">
  9. <bind name="pattern" value="'%' + keyword + '%'" >bind>
  10. and role_name LIKE #{pattern}
  11. if>
  12. select>

第2种 mysql数据库 用concat连接

  1. public int countFirstName(String firstName);
  2. <select id="countFirstName" parameterType="string" resultType="int">
  3. SELECT
  4. count(*) FROM t_role WHERE role_name LIKE concat('%',#{firstName},'%')
  5. select>

第3种 模糊查询Oracle数据库 也有2种
由于在oracle中 concat不支持三个参数的 如concat(‘%’,#{studentName},’%’),如果我们要查询前后的话,一个是在前面添加%一个是在后面添加%,如果只需要前面或者后面添加%的模糊查询的话,只需要一个就好了

  1. public int countFirstName(String firstName);
  2. <select id="countFirstName" parameterType="string" resultType="int">
  3. SELECT
  4. count(*) FROM t_role WHERE role_name LIKE concat(concat('%',#{firstName}),'%')
  5. select>

用”||“连接符查询大小写匹配查询

  1. SELECT * FROM TABLENAME WHERE UPPER(SUBSYSTEM) LIKE '%' || UPPER('jz') || '%'
  2. --或者是
  3. SELECT * FROM TABLENAME WHERE LOWER(SUBSYSTEM) LIKE '%' || LOWER('jz') || '%'

第4种 可以在service层把要查询的字符拼接好‘%’再传入进来

  1. public void countFirstName(String firstName) {
  2. String firstName = "%" + firstName + "%";
  3. userDao.countFirstName(firstName);
  4. }
  5. public int countFirstName(String firstName);
  6. <select id="countFirstName" parameterType="string" resultType="int">
  7. SELECT
  8. count(*) FROM t_role WHERE role_name LIKE #{firstName}
  9. select>

建议:大家用第一种方法最好。