1. 程式人生 > 其它 >Mybatis中association、collection、discriminator的使用

Mybatis中association、collection、discriminator的使用

1、dbconfig.properties資料庫連線配置

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://192.168.121.200:3306/mybatis
username=root
password=root

2、log4j.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n"/>
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

3、mybatis-config.xml配置檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="dbconfig.properties"/>

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    
    <typeAliases>
        <package name="com.atguigu.domain"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        <mapper resource="com/atguigu/mapper/UserMapper.xml"/>-->
        <package name="com.atguigu.mapper"/>
    </mappers>
</configuration>

4、實體類

public class User {
    private Long userId;
    private Long deptId;
    private String userName;
    private String email;
    private Dept dept;
}

public class Dept {
    private Long deptId;
    private String deptName;
    private List<User> users;
}

5、Mapper介面

public interface UserMapper {
    public User getUserById(Long id);

    public User getUserAndDeptByUserId(Long userId);

    public User getUserAndDeptByUserIdStep(Long userId);

    public User getUserByDeptId(Long deptId);

}

public interface DeptMapper {
    public Dept getDeptByDeptId(Long deptId);

    public Dept getDeptAndUserByDeptId(Long deptId);

    public Dept getDeptAndUserByDeptIdStep(Long deptId);
}

6、mapper XML

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">
<mapper namespace="com.atguigu.mapper.UserMapper">

<!--    association-巢狀結果集 開始 -->
    <resultMap id="userAndDeptResultMap1" type="user">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name" />
        <result property="email" column="email" />
        <result property="deptId" column="dept_id" />
        <result property="dept.deptId" column="dept_id" />
        <result property="dept.deptName" column="dept_name" />
    </resultMap>

    <resultMap id="userAndDeptResultMap2" type="user">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name" />
        <result property="email" column="email" />
        <result property="deptId" column="dept_id" />
        <association property="dept" javaType="dept">
            <result property="deptId" column="dept_id" />
            <result property="deptName" column="dept_name" />
        </association>
    </resultMap>

    <select id="getUserAndDeptByUserId" resultMap="userAndDeptResultMap2">
        SELECT
            u.user_id,
            u.user_name,
            u.email,
            u.dept_id,
            d.dept_name
        FROM
            sys_user u
        LEFT JOIN sys_dept d ON d.dept_id = u.dept_id
        WHERE
            u.user_id = #{userId}
    </select>

<!--    association-巢狀結果集 結束 -->

<!--    association-分段結果集 開始 -->
    <resultMap id="userAndDeptResultMapStep" type="user">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name" />
        <result property="email" column="email" />
        <result property="deptId" column="dept_id" />
        <association property="dept" javaType="dept"
                     select="com.atguigu.mapper.DeptMapper.getDeptByDeptId"
                     column="dept_id"
        >
            <result property="deptId" column="dept_id" />
            <result property="deptName" column="dept_name" />
        </association>
    </resultMap>

    <select id="getUserAndDeptByUserIdStep" resultMap="userAndDeptResultMapStep">
        select * from sys_user where user_id = #{id}
    </select>

<!--    association-分段結果集 結束 -->

    <select id="getUserById" resultType="user">
        select * from sys_user where user_id = #{id}
    </select>
    <select id="getUserByDeptId" resultType="user">
        select * from sys_user where dept_id = #{deptId}
    </select>

</mapper>

DeptMapper.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="com.atguigu.mapper.DeptMapper">
    <select id="getDeptByDeptId" resultType="dept">
        select * from sys_dept where dept_id = #{id}
    </select>

    <!--    collection-巢狀結果集 開始 -->
    <resultMap id="DeptAndUserResultMap" type="dept">
        <id property="deptId" column="dept_id"/>
        <result property="deptName" column="dept_name"/>
        <collection property="users" ofType="user" columnPrefix="u_">
            <id property="userId" column="user_id"/>
            <result property="userName" column="user_name"/>
            <result property="email" column="email"/>
        </collection>
    </resultMap>
    <select id="getDeptAndUserByDeptId" resultMap="DeptAndUserResultMap">
        SELECT
            u.user_id AS u_user_id,
            u.user_name AS u_user_name,
            u.email AS u_email,
            u.dept_id,
            d.dept_name
        FROM
            sys_dept d
        LEFT JOIN sys_user u ON u.dept_id = d.dept_id
        WHERE
            d.dept_id = #{deptId}
    </select>
    <!--    collection-巢狀結果集 結束 -->

    <!--    collection-分步結果集 開始 -->

    <resultMap id="resultMap103" type="dept">
        <id property="deptId" column="dept_id"/>
        <result property="deptName" column="dept_name"/>
        <collection property="users"
                    ofType="user"
                    column="dept_id"
                    select="com.atguigu.mapper.UserMapper.getUserByDeptId"
        >
        </collection>
    </resultMap>

    <resultMap id="resultMap104" type="dept">
        <id property="deptId" column="dept_id"/>
        <result property="deptName" column="dept_name"/>
    </resultMap>

    <resultMap id="DeptAndUserResultMapStep" type="dept">
        <discriminator javaType="long" column="dept_id">
            <case value="103" resultMap="resultMap103"/>
            <case value="104" resultMap="resultMap104"/>
        </discriminator>
    </resultMap>

    <select id="getDeptAndUserByDeptIdStep" resultMap="DeptAndUserResultMapStep">
        select * from sys_dept where dept_id = #{deptId}
    </select>
    <!--    collection-分佈結果集 結束 -->
</mapper>