1. 程式人生 > >mybatis快速入門(四)

mybatis快速入門(四)

北京 sele let dtd reac doctype his com 條件

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快速入門(四)