<selectid="findByCondition"parameterType="user"resultType="user"> select * from user where id=#{id} and username=#{username} and password=#{password} </select>
<selectid="findByCondition"parameterType="user"resultType="user"> select * from user <where> <iftest="id!=0"> and id=#{id} </if> <iftest="username!=null"> and username=#{username} </if> <iftest="password!=null"> and password=#{password} </if> </where> </select>
使用后,原测试用例在省略参数后也可以正常查询到符合条件的数据
foreach标签
在实际应用中,我们还可能遇到查询条件不唯一的情况,例如所有编号为1或2或3的查询结果,如果单纯利用sql语句的方式可以写为SELECT * FROM user WHERE id IN (1,2,3),而实际开发中这个list集合一般是由service层传递给mapper层作为参数进行查询,此时就需要用到foreach标签进行集合的遍历
foreach标签的属性值较多,其分别代表:
collection:集合类型,可以为list或array
item:表示遍历的元素的名称
open:语句开头的内容,根据sql语句进行填写
close:语句结束的部分,同样根据sql语句进行填写即可
separator:元素之间的分隔符,分割每个遍历元素的
标签体中写元素格式即可
1 2 3 4 5 6 7 8
<selectid="findByList"parameterType="list"resultType="user"> select * from user <where> <foreachcollection="list"item="id"open="id in ("close=")"separator=","> #{id} </foreach> </where> </select>
foreach标签的拼接结果是id IN (1,2,3) 再利用where标签将其与原语句拼接后得到SELECT * FROM user WHERE id IN (1,2,3)
sql片段的抽取
对于配置文件中高度重复的sql语句片段,我们可以利用抽取的思想对语句片段进行抽取,方便复用和修改
1 2 3 4 5 6 7 8 9 10 11 12
<!--sql语句的抽取--> <sqlid="selectAll">select * from user</sql>
publicclassDateTypeHandlerextendsBaseTypeHandler<Date> { //将Java类型转换为数据库所需的类型,参数i表示将转换后数据插入的位置,字段躲在的列 @Override publicvoidsetNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType)throws SQLException { //将日期转为长整型 long time = date.getTime(); //设置参数 preparedStatement.setLong(i,time); }
//将数据库类型转换为Java所需的类型 //s参数表示数据表字段的名称,resultSet是查询结果集 @Override public Date getNullableResult(ResultSet resultSet, String s)throws SQLException { //获取数据库中的数据 Long dateTime=resultSet.getLong(s); //转化为Java中的Date类型 Date date=new Date(dateTime); //返回数据 return date; }
//将数据库类型转换为Java所需的类型 @Override public Date getNullableResult(ResultSet resultSet, int i)throws SQLException { //获取数据库中的数据 Long dateTime=resultSet.getLong(i); //转化为Java中的Date类型 Date date=new Date(dateTime); //返回数据 return date; }
//将数据库类型转换为Java所需的类型 @Override public Date getNullableResult(CallableStatement callableStatement, int i)throws SQLException { //获取数据库中的数据 Long dateTime=callableStatement.getLong(i); //转化为Java中的Date类型 Date date=new Date(dateTime); //返回数据 return date; } }