当前位置:
文档之家› 第4章 动态sql和条件查询
第4章 动态sql和条件查询
INSERT INTO `items` VALUES ('2', '笔记本', '6000.0', '笔记本性能 好,质量好!!!!!', null, '2015-02-09 13:22:57');
INSERT INTO `items` VALUES ('3', '背包', '200.0', '名牌背包,容量 大质量好!!!!', null, '2015-02-06 13:23:02');
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
MyBatis
商品表插入数据:
INSERT INTO `items` VALUES ('1', '台式机', '3000.0', '该电脑质量 非常好!!!!', null, '2015-02-03 13:22:53');
</if> </sql>
MyBatis
配置解析: collection: 指定集合属性, 这里就是 ids。 item: 遍历生成的单个对象,自定义名称 open: 开始遍历时拼接的 sql 串。 close: 结束遍历时拼接的 sql 串。 separator: 遍历的对象中需要拼接的 sql 串
<select id=“findUserList” parameterType=“UserQueryVo” resultType=“User”>
select * from user <where> <!-- where 可以自动去掉第一个 and -->
<if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="ername!=null and ername!=''"> and ername like #{ername} </if>
动态sql和条件查询
MyBatis
4.1 动态sql
MyBatis
4.1.1 动态sql
动态 sql 是 mybatis 中的一个核心, 那么什么是 动态 sql?举个例子:
select * from user where user.sex = #{user.sex} and ername like #{ername}
如果 user 是 null 怎么办? 或者 user.sex 或者 ername 为 null 呢? 所以更严谨的做法应该 是在执行这个语句之前要先进行判断才对, 确保都 不为空,那么我们再去查询。 这就涉及到了 mybatis 中的动态 sql 了。
MyBatis
UserMapper.xml中:
MyBatis
订单表插入数据:
INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);
ername!=''"> and ername like #{ername}
</if> </if> </sql>
MyBatis
UserMapper.xml中:
<select id="findUserList" parameterType="UserQueryVo" resultType="User">
MyBatis
4.2 条件查询
MyBatis
表之间的关系图
MyBatis
商品表(items):
CREATE TABLE `items` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(32) NOT NULL COMMENT '商品名称', `price` FLOAT(10,1) NOT NULL COMMENT '商品定价', `detail` TEXT COMMENT '商品描述', `pic` VARCHAR(64) DEFAULT NULL COMMENT '商品图片', `createtime` DATETIME NOT NULL COMMENT '生产日期', PRIMARY KEY (`id`)
MyBatis
用户表(user):
CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` date default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</if> </where> </select>
MyBatis
4.1.2 sql片段
如果好几个 statement 都需要进行判断, 而且动态
sql 部分都一样, 这就会导致一些代码的重复
<sql id="query_user_where"> <if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="ername!=null and
向sql传入数组或者list
SELECT * FROM USER WHERE id=1 OR id=12 OR id=17 SELECT * FROM USER WHERE id IN(1,12,17)
UserQueryVo中:
//传入多个 id private List<Integer> ids;
MyBatis
订单表(orders):
CREATE TABLE `orders` ( `id` int(11) NOT NULL auto_increment, `user_id` int(11) NOT NULL COMMENT '下单用户id', `number` varchar(32) NOT NULL COMMENT '订单号', `createtime` datetime NOT NULL COMMENT '创建订单时间', `note` varchar(100) default NULL COMMENT '备注', PRIMARY KEY (`id`), KEY `FK_orders_1` (`user_id`), CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);
MyBatis
订单明细表(orders):
CREATE TABLE `orderdetail` ( `id` int(11) NOT NULL auto_increment, `orders_id` int(11) NOT NULL COMMENT '订单id', `items_id` int(11) NOT NULL COMMENT '商品id', `items_num` int(11) default NULL COMMENT '商品购买数量', PRIMARY KEY (`id`), KEY `FK_orderdetail_1` (`orders_id`), KEY `FK_orderdetail_2` (`items_id`), CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8;