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
时间: 2024-10-09 18:38:04