• Mybatis中使用association及collection进行一对多双向关联示例(含XML版与注解版)


    XML版本:

    实体类:

    package com.sunwii.mybatis.bean;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    
    @Data
    @ToString
    @NoArgsConstructor
    public class Dept {
        private Integer id;
        private String name;
        private List<Employee> employees = new ArrayList<Employee>();
        
        public Dept(Integer id) {
            this.id = id;
        }
        
        public String toLazyString() {
            return "Dept:{id: "+this.id+" ; name: "+this.name+"}";
        }
    }
    package com.sunwii.mybatis.bean;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    public class Employee {
        protected Integer id;
        protected String name;
        protected Dept dept;
    
        public Employee(Integer id) {
            this.id = id;
        }
    
        public String toLazyString() {
            return "Employee:{id: " + this.id + "; name: " + this.name + "}";
        }
    
        @Override
        public String toString() {
            return "Employee(id=" + this.id + ", name=" + this.name + ", dept={id=" + this.dept.getId() + ", name="
                    + this.dept.getName() + "})";
        }
    }

    Mapper接口:

    package com.sunwii.mybatis.mapper;
    
    import com.sunwii.mybatis.bean.Dept;
    
    public interface DeptMapper {
        public Dept selectById(Integer id);
        public int insertDept(Dept dept);
        public int updateDept(Dept dept);
        public int deleteDept(Dept dept);
    }
    package com.sunwii.mybatis.mapper;
    
    import com.sunwii.mybatis.bean.Employee;
    
    public interface EmployeeMapper {
        public Employee selectById(Integer id);
        public int insertEmployee(Employee employee);
        public int updateEmployee(Employee employee);
        public int deleteEmployee(Employee employee);
    }

    Mapper映射文件:

    <?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.sunwii.mybatis.mapper.DeptMapper">
        <resultMap type="Dept" id="DeptMap_basic">
            <id property="id" column="did" />
            <result property="name" column="name" />
        </resultMap>
        <resultMap type="Dept" id="DeptMap" extends="DeptMap_basic">
             <!-- 一对多关联:使用select引用方式 -->
            <collection property="employees" column="did" ofType="Employee" select="com.sunwii.mybatis.mapper.EmployeeMapper.selectByDept" fetchType="lazy">
            </collection>
        </resultMap>
        
        <select id="selectById" parameterType="Integer"
            resultMap="DeptMap">
            select id as did, name from t_dept d where d.id=#{id}
        </select>
    
        <insert id="insertDept" parameterType="Dept" keyColumn="id"
            keyProperty="id" useGeneratedKeys="true">
            insert into t_dept(name)
            values(#{name})
        </insert>
    
    
        <update id="updateDept" parameterType="Dept">
            update t_dept set
            name=#{name}
            where id=#{id}
        </update>
    
        <delete id="deleteDept" parameterType="Dept">
            delete from t_dept
            where
            id=#{id}
        </delete>
    </mapper>
    <?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.sunwii.mybatis.mapper.EmployeeMapper">
        <resultMap type="Employee" id="EmployeeMap_basic">
            <id property="id" column="id" />
            <result property="name" column="name" />
        </resultMap>
        <resultMap type="Employee" id="EmployeeMap" extends="EmployeeMap_basic">
            <!-- 多对一关联:使用select引用方式 -->
            <association property="dept" column="dept_id"
                javaType="Dept"
                select="com.sunwii.mybatis.mapper.DeptMapper.selectById"
                fetchType="lazy" />
        </resultMap>
        <select id="selectById" parameterType="Integer"
            resultMap="EmployeeMap">
            select id, name, dept_id from t_employee e where e.id=#{id}
        </select>
        <select id="selectById2" parameterType="Integer"
            resultMap="EmployeeMap">
            select e.id id, e.name name,d.id did,d.name dname from
            t_employee e
            inner join t_dept
            d on e.dept_id=d.id and e.id=#{id}
        </select>
    
        <select id="selectByDept" parameterType="Integer"
            resultMap="EmployeeMap_basic">
            select id, name, dept_id from t_employee e where
            e.dept_id=#{dept.id}
        </select>
    
        <insert id="insertEmployee" parameterType="Employee"
            keyColumn="id" keyProperty="id" useGeneratedKeys="true">
            insert into t_employee(name
            <if test="dept!=null">
                ,dept_id
            </if>
            )
            values(#{name}
            <if test="dept!=null">
                ,#{dept.id}
            </if>
            )
        </insert>
    
    
        <update id="updateEmployee" parameterType="Employee">
            update t_employee set
            name=#{name} ,dept_id=#{dept.id}
            where id=#{id}
        </update>
    
        <delete id="deleteEmployee" parameterType="Employee">
            delete from t_employee
            where id=#{id}
        </delete>
    </mapper>

    业务层接口实现类:

    package com.sunwii.mybatis.service.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.sunwii.mybatis.bean.Dept;
    import com.sunwii.mybatis.mapper.DeptMapper;
    import com.sunwii.mybatis.service.DeptService;
    
    @Service
    public class DeptServiceImpl implements DeptService {
        @Autowired
        private DeptMapper deptMapper;
    
        @Override
        public Dept getDept(Integer id) {
            return deptMapper.selectById(id);
        }
    
        @Override
        @Transactional
        public void insertDept(Dept dept) {
            deptMapper.insertDept(dept);
        }
    
        @Override
        @Transactional
        public void updateDept(Dept dept) {
            deptMapper.updateDept(dept);
        }
    
        @Override
        @Transactional
        public void deleteDept(Dept dept) {
            deptMapper.deleteDept(dept);
        }
    
    }
    package com.sunwii.mybatis.service.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.sunwii.mybatis.mapper.DeptMapper;
    import com.sunwii.mybatis.mapper.EmployeeMapper;
    import com.sunwii.mybatis.service.EmployeeService;
    import com.sunwii.mybatis.bean.*;
    
    @Service
    public class EmployeeServiceImpl implements EmployeeService {
        @Autowired
        private EmployeeMapper employeeMapper;
        @Autowired
        private DeptMapper deptMapper;
    
        @Override
        public Employee getEmployee(Integer id) {
            return employeeMapper.selectById(id);
        }
    
        @Override
        @Transactional
        public void insertEmployee(Employee employee) {
            Dept dept = employee.getDept();
            //如果需要的话,就先新增部门
            if(dept!=null && dept.getId()==null) {
                deptMapper.insertDept(dept);
            }
            
            employeeMapper.insertEmployee(employee);
        }
    
        @Override
        @Transactional
        public void updateEmployee(Employee employee) {
            employeeMapper.updateEmployee(employee);
        }
    
        @Override
        @Transactional
        public void deleteEmployee(Employee employee) {
            employeeMapper.deleteEmployee(employee);
        }
    
    }

    Spring配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
    
        <!-- 引入jdbcs配置文件 -->
        <context:property-placeholder
            location="classpath:jdbc.properties" />
    
        <!-- 数据库连接池 -->
        <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="${driver}" />
            <property name="url" value="${url}" />
            <property name="username" value="${user}" />
            <property name="password" value="${password}" />
            <property name="maxActive" value="210" />
            <property name="maxIdle" value="50" />
        </bean>
    
        <!-- mybatis -->
        <bean id="sessionFactory"
            class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="configLocation"
                value="classpath:mybatis-config.xml" />
            <property name="mapperLocations"
                value="classpath:com/sunwii/mybatis/bean/*.xml" />
        </bean>
    
        <!-- Mapper动态代理开发扫描 -->
        <mybatis:scan base-package="com.sunwii.mybatis.mapper" />
    
        <!-- 事务管理器 -->
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
    
        <!-- 事务注解 -->
        <tx:annotation-driven
            transaction-manager="transactionManager" />
    
        <!-- 组件扫描 -->
        <!-- Service扫描 -->
        <context:component-scan
            base-package="com.sunwii.mybatis.service.impl" />
    </beans>

    Mybatis配置文件:

    <?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>
        <settings>
            <setting name="lazyLoadingEnabled" value="true" />
            <setting name="aggressiveLazyLoading" value="false" />
        </settings>
        
        <typeAliases>
            <package name="com.sunwii.mybatis.bean" />
        </typeAliases>
        
    </configuration>

    测试类:

    package com.sunwii.mybatis.test.one2many;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    
    import com.sunwii.mybatis.bean.Dept;
    import com.sunwii.mybatis.bean.Employee;
    import com.sunwii.mybatis.service.DeptService;
    import com.sunwii.mybatis.service.EmployeeService;
    import com.sunwii.mybatis.util.SpringUtil;
    
    public class TestOne2Many {
        private ApplicationContext context = SpringUtil.getContext();
        private EmployeeService employeeService = (EmployeeService)context.getBean(EmployeeService.class);
        private DeptService deptService = (DeptService)context.getBean(DeptService.class);
        
        @Test
        public void testEmployeeInsert() {
            // 多对一:添加。
            Employee employee = new Employee();
            employee.setName("e-1");
            Dept dept = deptService.getDept(1);
            employee.setDept(dept);
            
            employeeService.insertEmployee(employee);
            
        }
        
    
        @Test
        public void testEmployeeInsert2() {
            // 多对一:添加。
            Employee employee = new Employee();
            employee.setName("e-2");
            //Dept dept = deptService.getDept(1);
            //employee.setDept(dept);
            
            employeeService.insertEmployee(employee);
            
            
        }
    
        @Test
        public void testEmployeeSelect() {
            // 多对一:查询。
            int id = 16;
            Employee employee = employeeService.getEmployee(id);
            
            System.out.println(employee.toLazyString());
            System.out.println(employee);
        }
        
    
    
        @Test
        public void testEmployeeUpdate() {
            // 多对一:更新。
            int id = 15;
            Employee employee = employeeService.getEmployee(id);
            employee.setName("eeeeeeeeeeeee15");
            employeeService.updateEmployee(employee);
        }
        
        
    
        @Test
        public void testEmployeeDelete() {
            // 多对一:删除。
            int id=15;
            Employee employee = new Employee(id);
            employeeService.deleteEmployee(employee);
            
        }
        
    
        @Test
        public void testDeptSelect() {
            // 一对多:更新。
            int id=1;
            Dept dept = deptService.getDept(id);
            System.out.println(dept.toLazyString());
            System.out.println(dept);
        }
    
        @Test
        public void testDeptUpdate() {
            // 一对多:更新。
            int id=2;
            Dept dept = new Dept(id);
            dept.setName("ddddddddd2");
            deptService.updateDept(dept);
        }
    }

    注解版本:

    注解版本只是将Mapper映射文件去掉,将映射注解到Mapper接口中(并使用了动态sql提供器),其它东西不变。

    Mapper接口(注解版):

    package com.sunwii.mybatis.mapper;
    
    import org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Many;
    import org.apache.ibatis.annotations.Options;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.annotations.Update;
    import org.apache.ibatis.mapping.FetchType;
    
    import com.sunwii.mybatis.bean.Dept;
    
    public interface DeptMapper {
        public static final String select = "select id,name from t_dept where id=#{id}";
        public static final String insert = "insert into t_dept(name) values(#{name})";
        public static final String update = "update t_dept set name=#{name}";
        public static final String delete = "delete from t_dept where id=#{id}";
        
        public static final String one2many = "com.sunwii.mybatis.mapper.EmployeeMapper.selectByDept";
        
        @Select(select)
        @Results(id = "DeptMap", value= {
                @Result(property = "id", column = "id"),
                @Result(property = "name", column = "name"),
                @Result(property = "employees", column = "id",
                many = @Many(
                        select = one2many,
                        fetchType = FetchType.LAZY))
        })
        public Dept selectById(Integer id);
    
        @Insert(insert)
        @Options(keyColumn = "id", keyProperty = "id", useGeneratedKeys = true)
        public int insertDept(Dept dept);
    
        @Update(update)
        public int updateDept(Dept dept);
    
        @Delete(delete)
        public int deleteDept(Dept dept);
    }
    package com.sunwii.mybatis.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.InsertProvider;
    import org.apache.ibatis.annotations.One;
    import org.apache.ibatis.annotations.Options;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.annotations.Update;
    import org.apache.ibatis.mapping.FetchType;
    
    import com.sunwii.mybatis.bean.Employee;
    import com.sunwii.mybatis.provider.EmployeeDynamicSqlProvider;
    
    public interface EmployeeMapper {
        public static final String select = "select id,name,dept_id from t_employee where id=#{id}";
        public static final String selectByDept = "select id,name from t_employee where dept_id=#{deptId}";
        public static final String insert = null;// dynamic sql provider
        public static final String update = "update t_employee set name=#{name},dept_id=#{dept.id}";
        public static final String delete = "delete from t_employee where id=#{id}";
        
        public static final String many2one = "com.sunwii.mybatis.mapper.DeptMapper.selectById";
        
        @Select(select)
        @Results(id="EmployeeMap", value= {
                @Result(property = "id",column = "id"),
                @Result(property = "name", column = "name"),
                @Result(property = "dept",column = "dept_id",
                    one = @One(
                            select = many2one,
                            fetchType = FetchType.LAZY))
        })
        public Employee selectById(Integer id);
        
        @Select(selectByDept)
        @Results(id="EmployeeMap_basic", value= {
                @Result(property = "id",column = "id"),
                @Result(property = "name", column = "name")
        })
        public List<Employee> selectByDept(Integer deptId);
    
        @InsertProvider(type = EmployeeDynamicSqlProvider.class, method = "insert")
        @Options(keyColumn = "id", keyProperty = "id", useGeneratedKeys = true)
        public int insertEmployee(Employee employee);
    
        @Update(update)
        public int updateEmployee(Employee employee);
    
        @Delete(delete)
        public int deleteEmployee(Employee employee);
    }

    动态SQL提供器:

    package com.sunwii.mybatis.provider;
    
    import org.apache.ibatis.jdbc.SQL;
    
    import com.sunwii.mybatis.bean.Employee;
    
    public class EmployeeDynamicSqlProvider {
        private SQL NOTNULLSET(String columnAndValue, SQL sqlObject, Object object) {
            if(object!=null) {
                return sqlObject.SET(columnAndValue);
            }
            
            return sqlObject;
        }
        
        private SQL NOTNULLVALUES(String column, String value, SQL sqlObject, Object object) {
            if(object!=null) {
                return sqlObject.VALUES(column,value);
            }
            
            return sqlObject;
        }
        
        
        public String insert(Employee employee) {
            return new SQL() {
                {
                    INSERT_INTO("t_employee");
                    VALUES("name", "#{name}");
                    
                    NOTNULLVALUES("dept_id","#{dept.id}",this, employee.getDept());
                }
            }.toString();
        }
    }

    多对多的示例:

    https://www.cnblogs.com/dreamyoung/p/11804936.html

  • 相关阅读:
    DynamoDB-条件表达式ConditionExpression
    更新表达式updateExpression
    AWS AppSync 的基本语句
    post和get的区别
    图片缩小右移旋转
    加入购物车飞入特效
    c# out参数直接写法
    unity vs 重复打开
    canvas与sprite射线检测
    MySQL语法大全
  • 原文地址:https://www.cnblogs.com/dreamyoung/p/11803605.html
Copyright © 2020-2023  润新知