Mybatis框架Mapper.xml映射文件动态sql问题(模糊查询,时间区间判断问题)

基本也都是映射文件的一些需要注意的问题:

第一个:写动态sql的时候,有个查询条件需要匹配模糊查询:

<select id="selectAllEmpTrainingRecord"  resultMap="empTrainMap">
  	select * from course t
  	<where>
  		<if test="course != null" >
  			 <bind name="courseName" value="'%' + course + '%'"/>
           t.courseName like #{courseName}
  		</if>
  	</where>
 order by t.startDate desc
  </select>

网上学习了下,有三种方式

1, 字段名 like %值%

  <select id="selectAllEmpTrainingRecord"  resultMap="empTrainMap">
  	select * from course t
  	<where>
  		<if test="course != null" >
           t.courseName like '%${courseName}%'
  		</if>
  	</where>
 order by t.startDate desc
  </select>

该种方式传参必须用${}不能用#{},所以这样写的弊端就是不安全,不能防sql注入

2,CONCAT()拼接%

例:

<select id="selectAllEmpTrainingRecord"  resultMap="empTrainMap">
      	select * from course t
      	<where>
      		<if test="course != null" >
               t.courseName like CONCAT('%',CONCAT(#{name},'%'))
      		</if>
      	</where>
     order by t.startDate desc
      </select>
     注意: 拼接时%必须加引号 

3,使用元素:bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文

  <select id="selectAllEmpTrainingRecord"  resultMap="empTrainMap">
  	select * from course t
  	<where>
  		<if test="course != null" >
  		 <bind name="courseName" value="'%' + course + '%'"/>
           t.courseName like #{courseName}
  		</if>
  	</where>
 order by t.startDate desc
 </select>

小结:
以上三种方式的区别:
一是数据不安全的,所以最好不用一方法
使用二与三的区别:concat适用于mysql和sql server数据库,oracle数据库不支持,bind适用于mysql,sql server,oracle,所以为了通用性或避免因更换数据库带来的不便,推荐使用第三种bind为好。

再补充一种跟上面第一种类似的方法:
暂称第四种:

4,直接传入带有%实参%的参数

public void selectBykeyWord(String keyword) {
String id = “%” + keyword + “%”;
String roleType = “%” + keyword + “%”;
String roleName = “%” + keyword + “%”;
userDao.selectBykeyWord(id,roleName,roleType);
}

在Mapper层指定各个参数的别名

List<RoleEntity> selectBykeyWord(@Param("id") String id,@Param("roleName") String roleName,@Param("roleType") String roleType);

然后映射文件:
<select id="selectBykeyWord" parameterType="string" resultType="com.why.mybatis.entity.RoleEntity">
   SELECT
        *
    FROM
        t_role
    WHERE
        role_name LIKE #{roleName}
        OR id LIKE #{id}
        OR role_type LIKE #{roleType}
</select>

执行出来的SQL语句:

SELECT
*
FROM
t_role
WHERE
role_name LIKE ‘%why%’
OR id LIKE ‘%why%’
OR role_type LIKE ‘%why%’;

第二个:时间区间判断问题

在有时候的需求中,我们需要获取某一个时间段的数据,这时候就要用到判断时间段;
例子:

<select id="selectEmpTrainingByName"  resultMap="empTrainMap">
  select * from 培训记录表_主表 t
inner join 培训记录表_明细 t1
on t.ExcelServerRCID = t1.ExcelServerRCID
<where>
	<if test="course != null and  course != ''">
		and t.课程名称=#{course}
	</if>

	<if test="empName != null and empName !=''">
		and t1.姓名=#{empName}
	</if>
	<if test="startDate != null and startDate !=''">
		and t.培训日期  >= #{startDate}
	</if>
	<if test="endDate != null and endDate !=''">
		and   #{endDate} >= t.培训日期 
	</if>
</where>	
	 order by t.培训日期 desc
  </select>

开始的时候判断时间区间我是这么写的
在这里插入图片描述
在这里插入图片描述
后面查到说mybaits映射文件中不能写 <= 号 ,所有我后来改成这样:
在这里插入图片描述
报错立马消失。

未完,待续。。。。。。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在MyBatis框架mapper.xml文件中,parametertype是用来传递参数的常用属性。它用于标识传递给SQL语句的参数类型,可以通过parametertype将参数正确地传递给对应的SQL语句。 parametertype属性有几种常见的取值方式: 1. 使用具体的Java类型:可以通过全限定名指定具体的Java类型,例如"java.lang.Integer"、"java.lang.String"等。这样做可以确保参数类型的准确性,并且在编写SQL语句时可以方便地使用Java对象的属性。 2. 使用别名:MyBatis允许为Java类型设置别名,可以使用别名代替具体的Java类型,例如"int"代表"java.lang.Integer"、"string"代表"java.lang.String"等。使用别名可以减少冗长代码,提高可读性。 3. 使用typeHandler:MyBatis提供了一种称为typeHandler的机制,可以将Java类型与数据库的数据类型进行转换。通过使用typeHandler,可以将复杂的Java类型映射到简单的数据库类型或者将数据库类型映射为Java对象,从而实现参数的传递和数据的转换。 通过正确配置parametertype属性,可以确保参数类型的正确传递,使得MyBatis能够正确地将参数映射到对应的SQL语句中,进而执行SQL操作。同时,使用parametertype还可以提高代码的可维护性和可读性,从而更好地使用MyBatis框架进行开发。 ### 回答2: 在MyBatis框架中,mapper.xml文件中的parametertype用于传递参数,是一个常用的方式。parametertype的作用是指定参数的类型,以便在SQL语句中正确地使用和操作这些参数。 parametertype的取值可以是Java类的全限定名、Java基本类型或者别名。当使用Java类的全限定名作为parametertype时,需要注意在SQL语句中使用参数时要使用对应的类属性。 在mapper.xml文件中使用parametertype传递参数的示例如下: ```xml <!-- 使用Java类的全限定名作为parametertype --> <select id="getUserById" resultType="com.example.User" parameterType="java.lang.Integer"> SELECT * FROM user WHERE id = #{id} </select> <!-- 使用Java基本类型作为parametertype --> <update id="updateUsername" parameterType="java.lang.String"> UPDATE user SET username = #{username} WHERE id = #{id} </update> <!-- 使用别名作为parametertype --> <select id="getUserListByName" resultType="com.example.User" parameterType="userParam"> SELECT * FROM user WHERE username LIKE CONCAT('%', #{username}, '%') </select> ``` 通过合理使用parametertype,我们可以在mapper.xml文件中准确地定义和操作参数。这样可以避免不必要的错误,提高代码的可读性和可维护性。此外,parametertype还可以帮助框架自动进行参数类型的转换,简化开发工作。 ### 回答3: 在MyBatis框架中,通过mapper.xml文件中的parametertype属性来传递参数是常见的做法。parametertype属性主要用于指定方法参数的类型,以便在SQL语句中正确地映射传入的参数。 一种常用的情况是将Java对象作为参数传递给SQL语句。在mapper.xml文件中,将parametertype属性设置为Java对象对应的类名,MyBatis就能够自动地将参数对象与SQL语句中的占位符进行匹配。这样,我们可以方便地在SQL语句中使用参数对象的属性值,以实现灵活的数据操作。 另一种常见的用法是将基本类型的值作为参数传递给SQL语句。在mapper.xml文件中,将parametertype属性设置为基本类型对应的包装类,例如Integer、String等,MyBatis会自动将基本类型的值进行封装,然后传递给SQL语句。 此外,如果需要传递多个参数,我们可以使用MyBatis提供的map或者@Param注解来指定参数的名称。在mapper.xml文件中,可以使用#{paramName}的方式来引用这些参数。 总之,parametertype属性在MyBatis框架中是常用的传递参数的方式。它能够灵活地适应不同类型的参数,并且能够方便地在SQL语句中使用参数值,从而实现数据的动态操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值