MyBatis---join 查詢


在實際業務中,經常能碰到多表關聯查詢

下面的Demo,講舉例join查詢在MyBatis中的實現

User 類:

package com.zy.domain;

import java.io.Serializable;
import java.util.List;

/**
 * @author gacl
 * users表所對應的實體類
 */
public class User  implements Serializable{

    //實體類的屬性和表的字段名稱一一對應
    private int id;
    private String name;
    private int age;
    private List<Role> role;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    
    public List<Role> getRole() {
        return role;
    }

    public void setRole(List<Role> role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
}

Role 類:

package com.zy.domain;

import java.io.Serializable;

public class Role implements Serializable{

    private int rid;
    private int userId;
    private String roleName;
    public int getRid() {
        return rid;
    }
    public void setRid(int rid) {
        this.rid = rid;
    }
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    
    
}

Mapping配置文件:

<?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,namespace的值習慣上設置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的
例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后綴)
 -->
<mapper namespace="com.zy.mapping.userMapper">
    <!-- 在select標簽中編寫查詢的SQL語句, 設置select標簽的id屬性為getUser,id屬性值必須是唯一的,不能夠重復
    使用parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型
    resultType="me.gacl.domain.User"就表示將查詢結果封裝成一個User類的對象返回
    User類就是users表所對應的實體類
    -->
    <resultMap id="queryForListMap" type="com.zy.domain.User">  
        <id column="id" property="id" jdbcType="INTEGER"/>  
        <result column="name" property="name" jdbcType="VARCHAR"/>  
        <result column="age" property="age" jdbcType="INTEGER"/>  
        <collection property="role" javaType="java.util.List" ofType="com.zy.domain.Role">  
            <id column="rid" property="rid" jdbcType="INTEGER" />  
            <result column="userId" property="userId" jdbcType="VARCHAR" />  
            <result column="roleName" property="roleName" jdbcType="VARCHAR" />  
        </collection>  
    </resultMap>
    <select id="queryForList" resultMap="queryForListMap">  
        SELECT  
          u.id,  
          u.name,  
          u.age,  
          r.rid,  
          r.userId,  
          r.roleName 
        FROM  
          users u  
        LEFT JOIN  
          role r  
        ON  
          u.id = r.userid  
    </select> 
</mapper>

Test類:

package com.zy.test;

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

import com.zy.domain.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;

public class Test1 {

    public static void main(String[] args) throws IOException {
        //mybatis的配置文件
        String resource = "config.xml";
        //使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件)
        InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
        //構建sqlSession的工廠
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)
        //Reader reader = Resources.getResourceAsReader(resource); 
        //構建sqlSession的工廠
        //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //創建能執行映射文件中sql的sqlSession
        SqlSession session = sessionFactory.openSession();
        /**
         * 映射sql的標識字符串,
         * me.gacl.mapping.userMapper是userMapper.xml文件中mapper標簽的namespace屬性的值,
         * getUser是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
         */
        /*String statement = "com.zy.mapping.userMapper.getUser";//映射sql的標識字符串
        //執行查詢返回一個唯一user對象的sql
        User user = session.selectOne(statement, 1);*/
        /*String statement = "com.zy.mapping.userMapper.addUser";
        User user = new User();
        user.setName("張三");
        user.setAge(20);
        int user2 = session.insert(statement, user);
        session.commit();
        session.close();
        System.out.println(user2);*/
        //updateUser(session);
        //deleteUser(session);
        queryList(session);
    }

    
    public static void queryList(SqlSession session){
        String statement = "com.zy.mapping.userMapper.queryForList";
        List<Object> resultList = session.selectList(statement);
        System.out.println(resultList);
    }
}

 


免責聲明!

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



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