1. 程式人生 > >Mybatis 動態SQL 與 核心對映

Mybatis 動態SQL 與 核心對映

Mybatis 動態SQL 與 核心對映

  • MyBatis 框架是基於SQL 的對映,SQL 對映檔案在此框架中的非常重要。動態SQL 是MyBatis 提供的, 根據指定的條件來執行指定的SQL 語句, 使SQL 對映檔案中的SQL 語句在執行時具有動態性

常見屬性

在這裡插入圖片描述

動態SQL的標籤

  • if 標籤
  • where 標籤
  • trim 標籤
<select id="selectByUser" resultType="User" >
        /* prefix加字首/prefixOverrides去除第一個不需要的and關鍵字/suffix第三個是加字尾/suffixOverrides 去除最後一個不需要的符號或關鍵字 */
select u.*,r.id from smbms_user u,smbms_role r <trim prefix="where" prefixOverrides="and" suffix="and u.userRole=r.id"> <if test="userRole != null">and u.userRole=#{userRole}</if> <if test="userName !=null and userName != ''"> and userName like concat
('%',#{userName},'%') </if> </trim> </select>

建立實體類,UserMapper介面,UserMapper.xml

UserMapper
public interface UserMapper {
   
    //根據使用者角色,與名字來進行模糊查詢
    //使用註解的方式來注入引數
    List<User> selectByUser(@Param("userName")String userName,@Param("userRole") Integer userRole)
; List<User> selectByMap(Map<String,String> map); //複雜查詢 List<User> selectByRole(User user); //根據名字來查詢,當前使用者的地址 List<User> selectByAddress(String userName); //增加一個使用者 int addUser(User user); //修改使用者 int updateUser(User user); //查詢出userRole為 2 後者3 的使用者,傳一個數組 List<User> selectArrayUser(Integer[] userRole); List<User> selectListUser(List<Integer> list); }
UserMapper.xml
<!-- 找到的是你關聯的那個介面類,他的包名加上類名-->
<mapper namespace="com.offcn.dao.UserMapper">
    <!-- 這個id 的名字必須跟你userMapperDao 一致 -->
    <select id="selectAllUser" resultType="com.offcn.entity.User">
        select * from smbms_user
    </select>
    <select id="selectByUser" resultType="User" >
        /* prefix加字首/prefixOverrides去除第一個不需要的and關鍵字/suffix第三個是加字尾/suffixOverrides 去除最後一個不需要的符號或關鍵字 */
        select u.*,r.id from smbms_user u,smbms_role r
        <trim prefix="where" prefixOverrides="and" suffix="and u.userRole=r.id">
            <if test="userRole != null">and u.userRole=#{userRole}</if>
            <if test="userName !=null and userName != ''">
                and userName like concat('%',#{userName},'%')
            </if>
        </trim>
    </select>
    <!-- resultMap 相當於一個結果集,這個id 必須對應的是你的 resultMap的值,type 代表你的返回值型別(可以給起別名)
    <id property=""></id> 只代表id  比錢的實體類的屬性名, column  代表的是你的資料庫列名
    其它的不是id的屬性就用名稱resule
    mabatis 的封裝  是 你的資料庫的列名 ,必須跟你的 實體bean的屬性名相同
    用  resultMap 的情況 第一種:當你的資料庫的列名跟你的屬性名不匹配的時候
                         第二種:也就是 複雜查詢(一對一的關係,一對多的關係)
    -->
    <resultMap id="selectByMapResult" type="User">
        <id property="id" column="id"></id>
        <result property="userName" column="userName"></result>
        <result property="userRole" column="userRole"></result>
    </resultMap>
    <select id="selectByMap" parameterType="Map" resultMap="selectByMapResult">
        select u.*,r.id from smbms_user u,smbms_role r where userName like concat('%',#{uName},'%') and u.userRole=#{uRole} and u.userRole = r.id
    </select>



    <resultMap id="selectByRoleResult" type="User">
        <id property="id" column="id"></id>
        <result property="userName" column="userName"></result>
        <result property="userRole" column="userRole"></result>
        <!-- 在mybatis 配置 一對一的關係,拿到的是屬性名,javaType 代表型別,可以給別名 -->
        <association property="role" javaType="Role">
            <id property="id" column="id"></id>
            <result property="roleName" column="roleName"></result>
            <result property="roleCode" column="roleCode"></result>
        </association>
    </resultMap>
    <select id="selectByRole" parameterType="User" resultMap="selectByRoleResult">
        select u.*,r.id,r.roleName,r.roleCode from smbms_user u,smbms_role r where userName like concat('%',#{userName},'%') and u.userRole=#{userRole} and u.userRole = r.id
    </select>

    <resultMap id="selectByAddressResult" type="User">
        <id property="id" column="id"></id>
        <result property="userName" column="userName"></result>
        <result property="userRole" column="userRole"></result>
        <!-- 開始配置一對多的關係,這裡是 ofType(配置一對多的關係裡必須加的)也是給的型別 -->
        <collection property="addressDesc" ofType="Address">
            <id property="id" column="a_id"></id>
            <result property="contact" column="contact"></result>
            <result property="addressDesc" column="addressDesc"></result>
        </collection>
    </resultMap>
    <select id="selectByAddress" parameterType="String" resultMap="selectByAddressResult">
        select u.*,a.addressDesc,a.contact from smbms_user u,smbms_address a where u.userName=#{userName} and u.id=a.userId;
    </select>

    <insert id="addUser" parameterType="User">
        insert into smbms_user(userCode,userName,userPassword,gender,birthday)
        value(#{userCode},#{userName},#{userPassword},#{gender},#{birthday})
    </insert>

    <!-- prefix 加上字首 -->
    <update id="updateUser" parameterType="User" >
        update smbms_user
        <trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
            <if test="userCode != null">userCode=#{userCode},</if>
            <if test="userName != null">userName=#{userName},</if>
            <if test="userPassword != null">userPassword=#{userPassword},</if>
            <if test="gender != null">gender=#{gender},</if>
            <if test="birthday != null">birthday=#{birthday},s</if>
        </trim>
    </update>
    <!-- collection 第一個是你遍歷的型別,每一個遍歷的條目/open 以什麼開始/separator 以什麼分割/sclose 以什麼結束
           item 裡面的值必須跟 foreach 裡面的一樣
    -->
    <select id="selectArrayUser" resultType="User">
        select * from  smbms_user where userRole in
        <foreach collection="array" item="uRole" open="(" separator="," close=")">
            #{uRole}
        </foreach>
    </select>

    <select id="selectListUser" resultType="User">
        select * from  smbms_user where userRole in
        <foreach collection="list" item="uRole" open="(" separator="," close=")">
            #{uRole}
        </foreach>
    </select>
</mapper>

測試

public class Test {
    public static void main(String[] args) {
        try {
            SqlSession sqlSession = SqlSessionUtils.getSqlSessionUtils().sqlSession;
            
            /*------------------根據資料庫表級別查詢------------------*/
            User user = new User();
            user.setUserRole(3);
            user.setUserName("孫");
            List<User> list = sqlSession.getMapper(UserMapper.class).selectByUser("孫",null);
            for (User u : list) {
                System.out.println(u.getUserName()+"\t"+u.getUserRole());
            }

            /*------------------map集合形式查詢------------------*/
            //如果你用Map 來進行傳參  你所給的鍵名  必須跟你  userMapper 裡面的那個佔位符一直
            Map map = new HashMap();
            map.put("uName",'孫');
            map.put("uRole",'3');

            List<User> list = sqlSession.getMapper(UserMapper.class).selectByMap(map);

                for (User u : list) {
                    System.out.println(u.getUserName() + "\t" + u.getUserRole());
                }

            /*-----------------------------------------------*/
            User user = new User();
            user.setUserRole(3);
            user.setUserName("孫");
            List<User> list = sqlSession.getMapper(UserMapper.class).selectByRole(user);
            for (User u : list) {
                System.out.println(u.getUserName() + "\t" + u.getUserRole());
                Role role = u.getRole();
                System.out.println(role.getRoleName()+"\t"+role.getRoleCode());
            }

            /*-------------------------------------------------------------*/
            List<User> list = sqlSession.getMapper(UserMapper.class).selectByAddress("祥傑");
            for (User u : list) {
                System.out.println(u.getUserName()+"\t"+u.getUserRole());
                List<Address> addressList = u.getAddressDesc();
                for (Address a : addressList) {
                    System.out.println(a.getAddressDesc()+"\t"+a.getContact());
                }
            }

            /*-------------------------新增方法-------------------------*/
            User user = new User();
            user.setUserCode("hehe");
            user.setUserName("呵呵");
            user.setUserPassword("123123");
            user.setGender(null);
            user.setBirthday(null);
            int num = sqlSession.getMapper(UserMapper.class).addUser(user);
            System.out.println(num);

            /*-----------------------修改功能------------------------*/
            User user = new User();
            user.setUserName("咋滴");
            user.setUserCode("wawa");
            user.setId(23);
            int num = sqlSession.getMapper(UserMapper.class).updateUser(user);
            System.out.println(num);

            /*---------------------------array查詢------------------------------*/
            List<User> list = sqlSession.getMapper(UserMapper.class).selectArrayUser(new Integer[]{2,3});
            for (User u :
                    list) {
                System.out.println(u.getUserName());
            }

            /*-------------------list查詢------------------------*/
            List<Integer> list = new ArrayList<Integer>();
            list.add(2);
            list.add(3);
            List<User> list1 = sqlSession.getMapper(UserMapper.class).selectListUser(list);
            for (User u :
                    list1) {
                System.out.println(u.getUserName());
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}