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);
        }
    }
}
相关文章
相关标签/搜索