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(); } }
多对多的示例: