Mybatis动态sql语句
一
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
解释含义:
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item集合中每一个元素进行迭代时的别名,
index表示在迭代过程中,每次迭代到的位置,
open该语句以什么开始,
separator在每次进行迭代之间以什么符号作为分隔 符,
close以什么结束,
在使用foreach的时候最关键的也是最容易出错的就是collection属性,
该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,
主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了
二
<if test="userName != null and userName != ''">
<bind name="nameLike" value="'%' + userName + '%'"/>
and user_name like #{nameLike}
</if>
!
由于不同的数据库,concat函数的用法不一样,Mysql的有3个参数,而oracle的只有2个。这就造成了这条SQL在不同环境中运行可能会出错。为了避免这种错误,可以用<bind>标签.
value的值写OGNL表达式,OGNL表达式的使用不做过多说明,如果想在OGNL表达式中使用字符串
- 简单写法:用引号扩起来,到底使用单引号还是双引号是由外层引号决定的。
- 标准写法:用%{’’}或%{""}把表达式括起来,强制转成字符串
bind标签的name属性填写一个参数名,value填写这个参数的值(使用OGNL表达式),bind标签写上后,在标签后面的上下文中使用的和bind标签name值同名的参数,它的值就会被替换为bind标签的value的值。如上面的例子中,在执行这条select语句时,#{pattern}的值就会为"’%’ + _parameter.getTitle() + ‘%’"计算执行后的值。
三
<select id="queryCourseByTypeAndAcademy" resultType="com.tfjybj.itoo.teach.model.CourseModel">
SELECT
*
FROM
tt_course
WHERE
is_delete=0 AND
course_type in (
<foreach collection="courseType" item="courseType" separator=",">
#{courseType}
</foreach>
)
<if test="academyId != ''">
<bind name="academyId" value="academyId"/>
and academy_id = #{academyId}
</if>
order by
convert(name using gbk)
</select>
其中的convert(name using gbk) name 字段,按汉语拼音的顺序排序。
四 sql语句模糊查询三种方式
<!--根据学院或专业名称模糊查询行政班信息-->
WHERE
<if test="strLike!=''">
<bind name="_strLike" value="'%'+ strLike +'%'"/>
tc.name like #{_strLike} or ta.`name`like #{_strLike} or ta.`abbreviation` like #{_strLike} and
</if>
<!--根据班级,教师,课程名称来查询课表信息-->
<if test="courseName!=''">
<bind name="courseName" value="'%'+ courseName +'%'"/>
and f.course_name like #{courseName}
</if>
<if test="teacherName!=''">
<bind name="teacherName" value="'%'+ teacherName +'%'"/>
and f.teacher_name like #{teacherName}
</if>
<if test="className!=''">
<bind name="className" value="'%'+ className +'%'"/>
and c.name like #{className}
</if>
<!--根据关键词模糊查询学号或姓名student-->
<if test="strLike !=''">
<bind name="strLike" value="'%' + strLike + '%'"/>
AND
concat(s.name,s.code) LIKE #{strLike}
</if>
五
BeanUtils.copyProperties(x, courseScheduleEntity);
1、 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同)。
2、 BeanUtils.copyProperties(obj1,obj2); 经常闹混不知道是谁给谁赋值,无意中先到"后付前"这个词来帮助自己记忆这个功能。即将obj2的值赋值给obj1。
3、 如果2中实例obj2为空对象,即值new了他的实例并没有赋值的话obj1对应的属性值也会被设置为空置。
4、BeanUtils与PropertyUtils对比(这里对比copyProperties方法)
PropertyUtils的copyProperties()方法几乎与BeanUtils.copyProperties()相同,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,BeanUtils 不支持这个功能,但是BeanUtils速度会更快一些。