mybatis动态标签<where><if><foreach>以及sql片段

1.创建一个包装类UserQueryVo.java

package cn.my.mybatis.entity;

public class UserQueryVo {

    private User user;

    public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
}

2.UserMapp.xml里面添加新增一个查询sql

<!-- 入参类型是包装类 -->
<select id="findByNameAndSex" parameterType="cn.my.mybatis.entity.UserQueryVo" resultType="cn.my.mybatis.entity.User">
select * from user
<!-- where标签可以去掉首个and ,sql动态标签和jstl标签很类似,大家看一下应该就差不多了 -->
<where>
<if test="user != null">
<if test="user.sex != null and user.sex != ''">
and sex=#{user.sex}
</if>
<if test="user.username != null and user.username != ''">
and username=#{user.username}
</if>
</if>
</where>
</select>

3.UserDaoMapper.java文件中添加映射方法

public List<User> findByNameAndSex(UserQueryVo userVo);

4.TestUserMapper.java文件中添加测试方法

 /**
* 根据名称和sex查询
*/
@Test
public void testFindByNameAndSex(){
SqlSession session = factory.openSession();
UserDaoMapper dao = session.getMapper(UserDaoMapper.class);//获取mybatis的动态代码实现接口对象
//这里就是构建包装类
UserQueryVo userQueryVo = new UserQueryVo();
User user = new User();
user.setUsername("王小二");
user.setSex("男");
userQueryVo.setUser(user); List<User> list = dao.findByNameAndSex(userQueryVo);
session.commit();
session.close();
System.out.println(list);
}

运行结果:[User [id=28, username=王小二, sex=男, birthday=Sat Sep 23 00:00:00 CST 2017, address=河南郑州]]

上面where和if标签都是使用过了

foreach标签使用

1.UserMapp.xml里面添加新增一个查询sql

  <!-- 入参类型是包装类 -->
<select id="findByIds" parameterType="cn.my.mybatis.entity.UserQueryVo" resultType="cn.my.mybatis.entity.User">
select * from user
<!-- where标签可以去掉首个and ,sql动态标签和jstl标签很类似,大家看一下应该就差不多了 -->
<where>
<if test="listIds != null">
collection:UserQueryVo的属性名,item表示临时名称下面使用的,open:拼接字符串的开始,close拼接字符串的结束,separator:分隔符
<foreach collection="listIds" item="id" open=" id in (" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>

2.UserDaoMapper.java文件中添加映射方法

public List<User> findByIds(UserQueryVo userVo);

3.TestUserMapper.java文件中添加测试方法

  @Test
public void testFindByIds(){
SqlSession session = factory.openSession();
UserDaoMapper dao = session.getMapper(UserDaoMapper.class);//获取mybatis的动态代码实现接口对象
//这里就是构建包装类
UserQueryVo userQueryVo = new UserQueryVo();
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(10);
ids.add(22);
userQueryVo.setListIds(ids); List<User> list = dao.findByIds(userQueryVo);
session.commit();
session.close();
for (User user : list) {
System.out.println(user);
}
}

sql语句为:

select * from user WHERE id in ( ? , ? , ? ) 

运行结果:

User [id=1, username=王五, sex=2, birthday=null, address=null]
User [id=10, username=张三, sex=1, birthday=Thu Jul 10 00:00:00 CST 2014, address=北京市]
User [id=22, username=陈小明, sex=1, birthday=null, address=河南郑州]

上面基本的都讲完了,还差最后一个sql片段了

那我们把UserMapper.xml改造一下即可,里面只讲条件提取到sql标签中了,其它的所有代码都不需要变化。上代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.my.dao.UserDaoMapper">
<select id="findById" parameterType="int" resultType="cn.my.mybatis.entity.User">
select * from user where id=#{id}
</select> <!-- sql片段 -->
<sql id="byNameAndSex_where">
<if test="user != null">
<if test="user.sex != null and user.sex != ''">
and sex=#{user.sex}
</if>
<if test="user.username != null and user.username != ''">
and username=#{user.username}
</if>
</if>
</sql> <!-- 入参类型是包装类 -->
<select id="findByNameAndSex" parameterType="cn.my.mybatis.entity.UserQueryVo" resultType="cn.my.mybatis.entity.User">
select * from user
<!-- where标签可以去掉首个and ,sql动态标签和jstl标签很类似,大家看一下应该就差不多了 -->
<where>
<!-- 将原有的代码直接写进sql标签中就搞定,如果sql片段在其它xml文件中那么直接引入其它文件的sql片段路径即可 -->
<include refid="byNameAndSex_where"/>
</where>
</select> <!-- sql片段 -->
<sql id="byIds_where">
<if test="listIds != null">
<!-- collection:UserQueryVo的属性名,item表示临时名称下面使用的,open:拼接字符串的开始,close拼接字符串的结束,separator:分隔符 -->
<foreach collection="listIds" item="id" open=" id in (" close=")" separator=",">
#{id}
</foreach>
</if>
</sql> <!-- 入参类型是包装类 -->
<select id="findByIds" parameterType="cn.my.mybatis.entity.UserQueryVo" resultType="cn.my.mybatis.entity.User">
select * from user
<!-- where标签可以去掉首个and ,sql动态标签和jstl标签很类似,大家看一下应该就差不多了 -->
<where>
<!-- 将原有的代码直接写进sql标签中就搞定,如果sql片段在其它xml文件中那么直接引入其它文件的sql片段路径即可 -->
<include refid="byIds_where"/>
</where>
</select> <!-- 新增映射 修改id名称为了以后封装basedao-->
<insert id="insert" parameterType="cn.my.mybatis.entity.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO `user` (`username`,`birthday`,`sex`,`address`)
VALUES(#{username},#{birthday},#{sex},#{address})
</insert> <!-- 修改用户 修改id名称为了以后封装basedao-->
<update id="update" parameterType="cn.my.mybatis.entity.User">
UPDATE `user`
SET
`username` = #{username},
`birthday` = #{birthday},
`sex` = #{sex},
`address` = #{address}
WHERE `id` = #{id} ;
</update>
<!-- 删除 修改id名称为了以后封装basedao -->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
</mapper>
写得可能不够好,如果有需要加群一起研究的可以q我,939705214,也可以直接加群号581591235,也可以加微信群号

												

mybatis快速入门(四)的更多相关文章

  1. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  2. MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  3. MyBatis学习总结(一)——MyBatis快速入门(转载)

    本文转载自http://www.cnblogs.com/jpf-java/p/6013537.html MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...

  4. MyBatis入门学习教程-MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  5. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  6. 【转】MyBatis学习总结(一)——MyBatis快速入门

    [转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...

  7. MyBatis学习总结-MyBatis快速入门的系列教程

    MyBatis学习总结-MyBatis快速入门的系列教程 [MyBatis]MyBatis 使用教程 [MyBatis]MyBatis XML配置 [MyBatis]MyBatis XML映射文件 [ ...

  8. MyBatis学习笔记(一)——MyBatis快速入门

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...

  9. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

随机推荐

  1. tcp_sync_server and tcp_sync_client

    #include <iostream> #include <fstream> #include <sstream> #include <boost/asio. ...

  2. zabbix如何监控进程

    zabbix中item的配置如下: zabbix中trigger的配置如下:

  3. 日程管理 FullCalendar

    日程管理,采用著名组件FullCalendar日历插件实现FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发1.实现按 ...

  4. 基于Parallax设计HTML视差效果

    年关将至,给大家拜年. 最近时间充裕了一点,给大家介绍一个比较有意思的控件:Parallax.它可以用来实现鼠标移动时,页面上的元素也做偏移的视差效果.在一些有表现层次,布局空旷的页面上,用来做Hea ...

  5. Redis缓存 序列化对象存储乱码问题

    使用Redis缓存对象会出现下图现象: 键值对都是乱码形式. 解决以上问题: 如果是xml配置的 我们直接注入官方给定的keySerializer,valueSerializer,hashKeySer ...

  6. Navi.Soft31.任务管理器(定时同步+数据采集)

    1系统简介 1.1功能简述 在众多的软件分类中,有几类的软件不是很重要,但也很重要.它们有的是每隔一段时间需要执行一些任务的软件,我们叫它定时类软件:还有一种软件是采集网页中的数据,我们叫它采集类软件 ...

  7. css中的关于margin-top,position和z-index的一些bug解决方案

    这两天在写一个demo的时候,就碰到一些css的问题,不知道能不能算bug,很有可能是因为我写的代码太少,孤陋寡闻了_(:зゝ∠)_.记录一下,以防下次遇到同样问题. 进入正题: 1.问题描述:div ...

  8. Yii2 Restful Api 401

    采用Yii2 Restful Api方式为APP提供数据,默认你已经做好了所有的编码和配置工作.采用Postman测试接口: 出现这个画面的一个可能原因是:access_token的写法有误,如果你使 ...

  9. SpringBoot Hello World

    本文首发于我的github博客 前言 SpringBoot是Spring MVC升级版,基于『约定优于配置』的原则,快速开发出web程序. 环境 本系列笔记环境如下: Sun JDK1.8.0_20 ...

  10. CodeForces - 730A 贪心+模拟

    贪心策略: 1.只有一个最大值,选着第二大的一起参加比赛减分. 2.有奇数个最大值,选择三个进行比赛. 3.偶数个最大值,选择两个进行比赛. 为什么不把最大值全部选择? 因为最多只能选五个,有可能选择 ...