mybatis的动态sql
2016-06-27 10:32
495 查看
在mybatis中,动态sql是比较重要的一部分,这时的我们可以减少很多工作量,同时可以让程序员在编码中有很高的灵活性。
通过mybatis提供的各种标签方法实现动态拼接sql。1 If
<!--传递pojo综合查询用户信息 --><select id="findUserList" parameterType="user" resultType="user">
select * from user
where 1=1
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</select>
注意要做不等于空字符串校验。
2 Where
上边的sql也可以改为:<selectid="findUserList" parameterType="user" resultType="user">
select * from user
<where>
<if test="id!=nulland id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
<where />可以自动处理第一个and。
3 foreach
向sql传递数组或List,mybatis使用foreach解析,如下:
3.1 通过pojo传递list
u 需求
传入多个id查询用户信息,用下边两个sql实现:
SELECT * FROM USERS WHERE username LIKE '%张%' AND (id=10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%张%' id IN (10,89,16)
u 在pojo中定义list属性ids存储多个用户id,并添加getter/setter方法
u mapper.xml
<iftest="ids!=null and ids.size>0">
<foreach collection="ids" open="
and id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
u 测试代码:
List<Integer> ids= new ArrayList<Integer>();
ids.add(1);//查询id为1的用户
ids.add(10); //查询id为10的用户
queryVo.setIds(ids);
List<User> list = userMapper.findUserList(queryVo);
3.2 传递单个List
传递List类型在编写mapper.xml没有区别,唯一不同的是只有一个List参数时它的参数名为list。
如下:
u Mapper.xml
<selectid="selectUserByList" parameterType="java.util.List"
resultType="user">
select * from user
<where>
<!-- 传递List,List中是pojo -->
<if test="list!=null">
<foreach collection="list" item="item"
open="and id in(" separator="," close=")">
#{item.id}
</foreach>
</if>
</where>
</select>
u Mapper接口
public List<User>selectUserByList(List userlist) throws Exception;
u 测试:
Public void testselectUserByList()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//构造查询条件List
List<User> userlist = newArrayList<User>();
User user = new User();
user.setId(1);
userlist.add(user);
user = new User();
user.setId(2);
userlist.add(user);
//传递userlist列表查询用户列表
List<User>list =userMapper.selectUserByList(userlist);
//关闭session
session.close();
}
3.3 传递单个数组(数组中是pojo):
请阅读文档学习。u Mapper.xml
<!--传递数组综合查询用户信息 -->
<select id="selectUserByArray" parameterType="Object[]"
resultType="user">
select * from user
<where>
<!-- 传递数组 -->
<if test="array!=null">
<foreach collection="array" index="index"
item="item" open="and id in(" separator=","
close=")">
#{item.id}
</foreach>
</if>
</where>
</select>
sql只接收一个数组参数,这时sql解析参数的名称mybatis固定为array,如果数组是通过一个pojo传递到sql则参数的名称为pojo中的属性名。
index:为数组的下标。
item:为数组每个元素的名称,名称随意定义
open:循环开始
close:循环结束
separator:中间分隔输出
u Mapper接口:
public List<User>selectUserByArray(Object[] userlist) throws Exception;
u 测试:
Public void testselectUserByArray()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//构造查询条件List
Object[] userlist = new Object[2];
User user = new User();
user.setId(1);
userlist[0]=user;
user = new User();
user.setId(2);
userlist[1]=user;
//传递user对象查询用户列表
List<User>list =userMapper.selectUserByArray(userlist);
//关闭session
session.close();
}
3.4 传递单个数组(数组中是字符串类型):
请阅读文档学习。u Mapper.xml
<!--传递数组综合查询用户信息 -->
<select id="selectUserByArray" parameterType="Object[]"
resultType="user">
select * from user
<where>
<!-- 传递数组 -->
<if test="array!=null">
<foreach collection="array" index="index" item="item" open="and
idin(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
</select>
如果数组中是简单类型则写为#{item},不用再通过ognl获取对象属性值了。
u Mapper接口:
public List<User>selectUserByArray(Object[] userlist) throws Exception;
u 测试:
Public void testselectUserByArray()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//构造查询条件List
Object[] userlist = new Object[2];
userlist[0]=”1”;
userlist[1]=”2”;
//传递user对象查询用户列表
List<User>list =userMapper.selectUserByArray(userlist);
//关闭session
session.close();
}
4 Sql片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下:
<!--传递pojo综合查询用户信息 -->
<select id="findUserList" parameterType="user"
resultType="user">
select * from user
<where>
<if test="id!=null and id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
u 将where条件抽取出来:
<sqlid="query_user_where">
<if test="id!=nulland id!=''">
and id=#{id}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</sql>
u 使用include引用:
<selectid="findUserList" parameterType="user"
resultType="user">
select * from user
<where>
<include refid="query_user_where"/>
</where>
</select>
注意:如果引用其它mapper.xml的sql片段,则在引用时需要加上namespace,如下:
<include refid="namespace.sql片段”/>
相关文章推荐
- SQL中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- SQL Server 语句操纵数据库
- SQL(结构化查询语句)
- oracle sql日期比较
- linux快速部署mysql服务器
- sql 存储过程分页
- 在WINXP系统上安装SQL Server企业版的方法
- 通过批处理调用SQL的方法(osql)
- SQL Server 存储过程的分页
- ASP程序与SQL存储过程结合使用详解
- SQL SERVER编写存储过程小工具
- 防御SQL注入攻击时需要注意的一个问题
- Microsoft Sql server2005的安装步骤图文详解及常见问题解决方案
- PostgreSQL教程(十九):SQL语言函数
- SQL Server复制需要有实际的服务器名称才能连接到服务器