mybatis 使用動態SQL


RoleMapper.java

public interface RoleMapper {
    
    public void add(Role role);
    
    public void update(Role role);
    
    public void delete(Role role);
    
    public List<Role> getRoleList(Role role);
}

RoleMapper.xml

<?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.bdqn.dao.RoleMapper">
    <!-- where/if(判斷參數) - 將實體類不為空的屬性作為where條件, 能智能的處理 and or ,不必擔心多余導致語法錯誤-->  
    <!-- <select id="getRoleList" resultType="Role" parameterType="Role">
        select * from role
        <where>
            <if test="roleCode != null">
                and roleCode like CONCAT ('%',#{roleCode},'%')
            </if>
            <if test="roleName != null">
                and roleName like CONCAT ('%',#{roleName},'%')
            </if>
        </where>
    </select> -->
    
    <!-- if/trim代替where(判斷參數) - 將實體類不為空的屬性作為where條件 -->
   <!--  <select id="getRoleList" resultType="Role" parameterType="Role">
        select * from role
        <trim prefix="where" prefixOverrides="and | or">
            <if test="roleCode != null">
                and roleCode like CONCAT ('%',#{roleCode},'%')
            </if>
            <if test="roleName != null">
                and roleName like CONCAT ('%',#{roleName},'%')
            </if>
        </trim>
    </select> -->
    
    <!-- choose(判斷參數) - 按順序將實體類第一個不為空的屬性作為where條件 -->
     <select id="getRoleList" resultType="Role" parameterType="Role">
         select * from role
         <where>
             <choose>
                 <when test="roleCode != null">
                     and roleCode like CONCAT ('%',#{roleCode},'%')
                 </when>
                 <when test="roleName != null">
                     and roleName like CONCAT ('%',#{roleName},'%')
                 </when>
                 <otherwise></otherwise>
             </choose>
         </where>
     </select>
    
    
    <insert id="add" parameterType="Role">
        insert into role (roleCode,roleName) 
            values (#{roleCode},#{roleName})
    </insert>
    
    <update id="update" parameterType="Role">
        update role set roleCode=#{roleCode},roleName=#{roleName}
            where id=#{id}
    </update>
    
    <delete id="delete" parameterType="Role">
        delete from role where id=#{id}
    </delete>

</mapper>

UserMapper.java

public interface UserMapper {
    
    public int count();
    
    public void add(User user);
    
    public void update(User user);
    
    public void delete(User user);
    
    public List<User> getUserList();
    
    //根據roleId獲取用戶列表
    public List<User> getUserListByRoleId(Role role);
    
    //獲取指定用戶的地址列表(user表-address表:1對多關系)
    public User getAddressListByUserId(User user);
    
    //根據條件,獲取用戶表數據列表(動態sql)
    public List<User> searchUserList(User user);
    
    //根據部門條件,獲取用戶表數據列表-foreach_array
    public List<User> getUserByDepId_foreach_array(String[] depIds);
    
    //根據部門條件,獲取用戶表數據列表-foreach_list
    public List<User> getUserByDepId_foreach_list(List<String> depIdList);
    
}

UserMapper.xml

<?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">

<!-- namespace的名字需要跟接口的類名一致 -->
<mapper namespace="cn.bdqn.dao.UserMapper">
    <!-- 
    1、resultMap屬性:type為java實體類;id為此resultMap的標識
    2、resultMap的子元素:
        id – 一般對應到數據庫中該行的ID,設置此項可以提高Mybatis性能.
        result – 映射到JavaBean 的某個“簡單類型”屬性,String,int等.
        association – 映射到JavaBean 的某個“復雜類型”屬性,其他JavaBean類.
        collection –復雜類型集合 
     -->
     
    <!--根據roleId獲取用戶列表: 當數據庫中的字段信息與對象的屬性不一致時需要通過resultMap來映射 -->
    <!-- <resultMap type="User" id="seachUserResult">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
        <result property="roleId" column="roleId"/>
        <result property="roleName" column="roleName"/>
    </resultMap>
    
    <select id="getUserListByRoleId" parameterType="Role" resultMap="seachUserResult">
        select u.*,r.roleName as roleName from user u,role r where u.roleId = r.id and u.roleId = #{id}
    </select> -->
    
    <!-- 根據roleId獲取用戶列表 association start-->
    <resultMap type="User" id="seachUserResult">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode" />
        <result property="userName" column="userName" />
        <result property="roleId" column="roleId" />
        <!-- <association property="role" javaType="Role" >
            <result property="id" column="id"/>
            <result property="roleCode" column="roleCode"/>
            <result property="roleName" column="roleName"/>
        </association> -->
        <association property="role" javaType="Role" resultMap="roleMap"/>
    </resultMap>
    
    <resultMap type="Role" id="roleMap">
        <result property="id" column="id"/> 
        <result property="roleCode" column="roleCode"/> 
        <result property="roleName" column="roleName"/> 
    </resultMap>
    
    <select id="getUserListByRoleId" parameterType="Role" resultMap="seachUserResult">
        select u.*,r.roleCode as roleCode,r.roleName as roleName from user u,role r where u.roleId = r.id and u.roleId = #{id}
    </select>
    
    <!-- association end-->
    
    <!-- 獲取指定用戶的地址列表(user表-address表:1對多關系) collection start-->
    <resultMap type="User" id="userMap">
        <id property="id" column="userId"/>
        <collection property="addressList" ofType="Address">
            <id property="id" column="a_id"/>
            <result property="postCode" column="postCode"/>
            <result property="addressContent" column="addressContent"/>
        </collection>
    </resultMap>
    
    <select id="getAddressListByUserId" parameterType="User" resultMap="userMap">
        select *,a.id as a_id from user u,address a where u.id=a.userId and u.id=#{id}
    </select>
    <!-- collection end -->
    
    <resultMap type="User" id="seachUser">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
        <result property="roleId" column="roleId"/>
        <result property="roleName" column="roleName"/>
    </resultMap>
    
    <!-- <select id="searchUserList" parameterType="User" resultMap="seachUser">
        select u.*,r.roleName as roleName from user u,role r where u.roleId = r.id
            and u.roleId = #{roleId}
            and u.userCode like CONCAT ('%',#{userCode},'%')  //防止sql注入
            and u.userName like CONCAT ('%',#{userName},'%') 
    </select> -->
    
    <!-- 
    1、有些時候,sql語句where條件中,需要一些安全判斷,例如按性別檢索,如果傳入的參數是空的,此時查詢出的結果很可能是空的,也許我們需要參數為空時,是查出全部的信息。這是我們可以使用動態sql,增加一個判斷,當參數不符合要求的時候,我們可以不去判斷此查詢條件。
    2、mybatis 的動態sql語句是基於OGNL表達式的。可以方便的在 sql 語句中實現某些邏輯. 總體說來mybatis 動態SQL 語句主要有以下幾類: 
        if 語句 (簡單的條件判斷) 
        choose (when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似.
        trim (對包含的內容加上 prefix,或者 suffix 等,前綴,后綴) 
        where (主要是用來簡化sql語句中where條件判斷的,能智能的處理 and or ,不必擔心多余導致語法錯誤) 
        set (主要用於更新時) 
        foreach (在實現 mybatis in 語句查詢時特別有用) 
     -->
    
    <!--  if(判斷參數) - 將實體類不為空的屬性作為where條件 -->
    <select id="searchUserList" parameterType="User" resultMap="seachUser">
        select u.*,r.roleName as roleName from user u,role r where u.roleId = r.id
            <if test="roleId!=null">
                and u.roleId = #{roleId}
            </if>
            <if test="userCode != null">
                and u.userCode like CONCAT ('%',#{userCode},'%')  
            </if>
            <if test="userName != null">
                and u.userName like CONCAT ('%',#{userName},'%') 
            </if>
    </select>
    
    
    
    
    
    <select id="count" resultType="int">
        select count(1) from user
    </select>
    
    <insert id="add" parameterType="User">
        insert into user (userCode,userName,userPassword) 
            values (#{userCode},#{userName},#{userPassword})
    </insert>
    
    <!-- if/set(判斷參數) - 將實體類不為空的屬性更新 -->  
    <!-- <update id="update" parameterType="User">
        update user 
            <set>
                <if test="userCode != null and userCode != ''">userCode=#{userCode},</if>
                <if test="userName != null">userName=#{userName},</if>
                <if test="userPassword != null">userPassword=#{userPassword},</if>
                <if test="roleId != null">roleId=#{roleId}</if>
            </set>
            where id=#{id}
    </update> -->
    
    <!-- if/trim代替set(判斷參數) - 將實體類不為空的屬性更新 --> 
    <update id="update" parameterType="User">
        update user 
         <trim prefix="set" suffixOverrides=",">
             <if test="userCode != null and userCode != ''">userCode=#{userCode},</if>
            <if test="userName != null">userName=#{userName},</if>
            <if test="userPassword != null">userPassword=#{userPassword},</if>
            <if test="roleId != null">roleId=#{roleId}</if>
         </trim>
         where id=#{id}
    </update>
    
    <!--注意: 你可以傳遞一個List實例或者數組作為參數對象傳給MyBatis。
              當你這么做的時候,MyBatis會自動將它包裝在一個Map中,用名稱在作為鍵。
          List實例將會以“list”作為鍵,而數組實例將會以“array”作為鍵。
                      配置文件中的parameterType是可以不配置的-->
    <resultMap type="User" id="userMapByDep">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
    </resultMap>
    <!-- foreach(循環array參數) - 作為where中in的條件 -->
    <select id="getUserByDepId_foreach_array" resultMap="userMapByDep">
        select * from user  where depId in 
            <foreach collection="array" item="depIds" open="(" separator="," close=")">
                #{depIds}
            </foreach>
    </select>
    
    <!-- foreach(循環List<String>參數) - 作為where中in的條件 -->
    <select id="getUserByDepId_foreach_list" resultMap="userMapByDep">
        select * from user  where depId in 
            <foreach collection="list" item="depIdList" open="(" separator="," close=")">
                #{depIdList}
            </foreach>
    </select>
    
    
    <delete id="delete" parameterType="User">
        delete from user where id=#{id}
    </delete>
    
    <select id="getUserList" resultType="User">
        select * from user
    </select>
</mapper>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM