JAVA--高級開發--Mybatis高級查詢

<?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="com.bdit.dao.UserDao">
    <!--查詢全部的用戶所對應的角色-->
  <!--多對多查詢時,一個用戶能夠對應多個角色-->
    <resultMap id="Map4" type="user">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
        <result column="address" property="address"/>
        <!--指定從表中應用的實體類的屬性-->
        <collection property="rolesList" ofType="Roles">
            <id column="roleId" property="roleId"/>
            <result column="roleName" property="roleName"/>
            <result column="roleDesc" property="roleDesc"/>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="Map4">
        select u.*,r.* from user u join userroles ur on u.id=ur.uid join roles r on r.roleId=ur.rid;
    </select>
    <!--根據用戶的信息查詢角色實現一對多的關係-->
    <resultMap id="Map5" type="user">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
        <result column="address" property="address"/>
        <!--指定從表中應用的實體類型-->
        <collection property="juese" ofType="Roles">
            <id column="roleId" property="roleId"/>
            <result column="roleName" property="roleName"/>
            <result column="roleDesc" property="roleDesc"/>
        </collection>
    </resultMap>
    <select id="findByid" resultMap="Map5">
        select u.*,r.* from user u left outer join roles r on u.id=r.roleId;
    </select>
</mapper>

複雜查詢java

<?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="com.bdit.dao.IUserDao">

    <!--動態SQL<if>標籤-->
    <select id="findByfind" parameterType="User" resultType="User">
        select  *  from  user where 1=1
        <!--test屬性:中寫的是對象的屬性名-->
        <if test="id!=null and  id!=0">
          and  id=#{id}
        </if>
        <!--test屬性:中寫的是對象的屬性名-->
        <if test="username!=null and username!=''">
            and username like #{username}
        </if>
    </select>

    <!--爲了改進 where 1=1 的條件拼接,咱們能夠採用<where>標籤來簡化開發。-->
    <!-- 動態 SQL <where>標籤-->
<!--    <select id="findByfind" parameterType="User" resultType="User">-->
<!--        select  *  from user-->
<!--        <where>-->
<!--            <if test="id!=null and  id!=0">-->
<!--                and  id=#{id}-->
<!--            </if>-->
<!--            &lt;!&ndash;test屬性:中寫的是對象的屬性名&ndash;&gt;-->
<!--            <if test="username!=null and username!=''">-->
<!--                and username like #{username}-->
<!--            </if>-->
<!--        </where>-->
<!--    </select>-->

    <!--動態 SQL <foreach>標籤-->
    <select id="finds" parameterType="QueryVo" resultType="User">
        select  *  from  user
       <where>
           <if test="stuId!=null and stuId.size()!=0">
               <foreach collection="stuId" open="id in(" close=")" item="sid" separator=",">
                   #{sid}
               </foreach>
           </if>
       </where>
    </select>
    
    <!--高級查詢:實現一對多的信息-->
    <resultMap id="Map3" type="user">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
        <result column="address" property="address"/>
<!--        collection:表示關聯查詢結果集-->
<!--        property 屬性:在一端定義的對多端對象的集合屬性-->
<!--        ofType 屬性:指定關聯查詢的結果集中的對象類即 List 中的對象類型-->
        <!--指定從表中應用實體類的屬性-->
        <collection property="counts" ofType="Account">
            <id  column="id" property="id"/>
            <result column="uid" property="uid"/>
            <result column="money" property="money"/>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="Map3">
        select u.*,a.* from user u left outer join Account a on u.id=a.uid
    </select>
</mapper>

簡單查詢apache

<?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="com.bdit.dao.IAccountDao">
<!--    &lt;!&ndash;把用戶的信息和帳戶的信息封裝在一塊兒,根據帳戶的信息查詢用戶的地址,年齡,姓名&ndash;&gt;-->
<!--    <select id="findAll" resultType="AccountUser">-->
<!--   select a.*,u.username,u.age,u.address from Account a,user u where a.uid=u.id;-->
<!--    </select>-->

    <!--方式二: 使用resultMap:根據帳戶來查詢用戶的全部的信息-->
    <resultMap id="Map2" type="Account">
        <id column="id" property="id"/>
        <result column="uid" property="uid"/>
        <result column="money" property="money"/>
        <!--指定從表中的應用實體的屬性-->
        <association property="user" javaType="user"> <!--java類的別名-->
          <id column="id" property="id"/>
          <result column="username" property="username"/>
          <result column="age" property="age"/>
          <result column="address" property="address"/>
        </association>
    </resultMap>
    <select id="findAll2" resultMap="Map2">
     <!--下面兩條SQL語句通用-->
--    select a.*,u.username,u.age,u.address from Account a,user u where a.uid=u.id;
       select a.*,u.* from Account a,user u where a.uid=u.id;
 </select>
</mapper>

測試類session

package com.bdit;

import com.bdit.dao.IAccountDao;
import com.bdit.dao.IUserDao;
import com.bdit.model.Account;
import com.bdit.model.AccountUser;
import com.bdit.model.QueryVo;
import com.bdit.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

//測試類
public class mybatisTest2 {
    private InputStream input;
    private SqlSessionFactory factory;
    private SqlSession session;
    private IAccountDao iAccountDao;
    @Before //封裝好的數據,初始化時加載
    public void init()throws IOException {
        //1 、 讀取配置文件-->SqlMapConfig核心的配置文件
        input = Resources.getResourceAsStream("SqlMapConfig.xml");
        //二、建立SqlSessionFactoryBuilder構建者的對象。
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        // 三、使用構建者對象建立工廠對象:SqlSessionFactory
        factory = builder.build(input);
        //四、使用SqlSessionFactory對象建立SqlSession對象
        //4.1 =設置事務爲自動提交
        session = factory.openSession(true);
        //五、使用SqlSession對象建立Dao接口的代理對象
        iAccountDao = session.getMapper(IAccountDao.class);
    }
    @After
    public  void  destory()throws IOException {
        //提交事務 --上面設置爲自動提交
        //session.commit();
        //關閉釋放資源
        session.close();
        input.close();
    }
    @Test   //把帳戶的信息和用戶的信息封裝在一塊兒,根據帳戶來查詢,實現一對一的關係
    public void find(){
        List<AccountUser>list=iAccountDao.findAll();
        for(AccountUser us:list){
            System.out.println(us);
        } //實現一對一的查詢
    }
    @Test  //方式二:使用resultMap映射文件來完成一對一的關係。
    public  void find2(){
        List<Account>list2=iAccountDao.findAll2();
        for(Account  uu:list2){
            System.out.println(uu);
        }
    }

}
package com.bdit;

import com.bdit.dao.IUserDao;
import com.bdit.dao.RolesDao;
import com.bdit.model.QueryVo;
import com.bdit.model.Roles;
import com.bdit.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

//測試類
public class mybatisTest3 {
    private InputStream input;
    private SqlSessionFactory factory;
    private SqlSession session;
    private RolesDao rolesDao;
    @Before //封裝好的數據,初始化時加載
    public void init()throws IOException {
        //1 、 讀取配置文件-->SqlMapConfig核心的配置文件
        input = Resources.getResourceAsStream("SqlMapConfig.xml");
        //二、建立SqlSessionFactoryBuilder構建者的對象。
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        // 三、使用構建者對象建立工廠對象:SqlSessionFactory
        factory = builder.build(input);
        //四、使用SqlSessionFactory對象建立SqlSession對象
        //4.1 =設置事務爲自動提交
        session = factory.openSession(true);
        //五、使用SqlSession對象建立Dao接口的代理對象
        rolesDao = session.getMapper(RolesDao.class);
    }
    @After
    public  void  destory()throws IOException {
        //提交事務 --上面設置爲自動提交
        //session.commit();
        //關閉釋放資源
        session.close();
        input.close();
    }
    @Test   //多對多的查詢:實現一個角色能夠賦予多個用戶
    public  void  findaLL(){
        List<Roles>list=rolesDao.findAll();
        for(Roles  rr:list){
            System.out.println(rr);
        }
    }

    @Test //一個角色對應多個用戶:實現一對多的關係
    public  void find(){
      List<Roles>list1=rolesDao.findByid();
        for(Roles  lwj:list1){
            System.out.println(lwj);
        }
    }
}
相關文章
相關標籤/搜索