MyBatis的discriminator鉴别器的作用

来源:互联网 发布:ubuntu自带gcc编译器 编辑:程序博客网 时间:2024/06/05 10:57

MyBatis的discriminator鉴别器的作用


DepartmentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.cn.mybatis.dao.DepartmentMapper"><!-- public Department getDeptById(Integer id); --><select id="getDeptById" resultType="com.cn.zhu.bean.Department">select id,dept_namedepartmentName from tbl_dept where id=#{id}    </select></mapper>
EmployeeMapperPlus.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.cn.mybatis.dao.EmployeeMapperPlus"><!-- public Employee getEmpByIdStep(Integer id); --><select id="getEmpByIdStep" resultMap="MyEmpDis">select * from tbl_employeewhere id=#{id} </select><!--分布好处 可以使用延迟加载 Employee==>Dept 我们每次查询Employee对象的时候,都将一起查询出来。部门信息在我们使用的时候再去查询 分段查询的基础之上加上两个配置--><!--查询二 查询部门的时候将部门对应的所有员工信息也查询出来 public List<Employee>getEmpsByDeptId(Integer deptId);--><!-- public List<Employee> getEmpsByDeptId(Integer deptId); --><select resultType="com.cn.zhu.bean.Employee" id="getEmpsByDeptId">select * fromtbl_employee where d_id=#{deptId}   </select><!--鉴别器discriminator mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为封装Employee: 如果查出的是女生,就把部门信息查询出来,否则不查询 如果是男生,把last_name这一列的值赋值给email;--><resultMap type="com.cn.zhu.bean.Employee" id="MyEmpDis"><id column="id" property="id" /><result column="last_name" property="lastName" /><!-- 把last_name 赋值给email --><result column="email" property="email" /><result column="gender" property="gender" /><!--association 定义管理对象的封装规则 select: 表明当前属性是调用select 指定的方法 colum:指定将哪一列的值传给这个方法 流程 : 使用select 指定的方法(传入column指定的这列参数的值)查出对象并封装给property 指定的属性--><!-- column 指定判定的列名    javaType:列值对应的java类型 --><discriminator javaType="String" column="gender"><!--0 是女生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来--><case value="0" resultType="com.cn.zhu.bean.Employee"><association property="dept"select="com.cn.mybatis.dao.DepartmentMapper.getDeptById" column="d_id"></association></case><!--1是男生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来 把last_name赋值给email--><case value="1" resultType="com.cn.zhu.bean.Employee"><id column="id" property="id" /><result column="last_name" property="lastName" /><!-- 把last_name 赋值给email --><result column="last_name" property="email" /><result column="gender" property="gender" /></case></discriminator></resultMap></mapper>
DepartmentMapper.java

package com.cn.mybatis.dao;import java.util.List;import java.util.Map;import org.apache.ibatis.annotations.MapKey;import org.apache.ibatis.annotations.Param;import com.cn.zhu.bean.Department;import com.cn.zhu.bean.Employee;public interface DepartmentMapper {public Department getDeptById(Integer id);public Department getDeptByIdPlus(Integer id);public Department getDeptByIdStep(Integer id);public List<Employee> getEmpsByDeptId(Integer deptId); }   
EmployeeMapperPlus.java

package com.cn.mybatis.dao;import java.util.List;import java.util.Map;import org.apache.ibatis.annotations.MapKey;import org.apache.ibatis.annotations.Param;import com.cn.zhu.bean.Employee;public interface EmployeeMapperPlus {public Employee getEmpById(Integer id);public Employee getEmpAndDept(Integer id);public Employee getEmpByIdStep(Integer id); }
Department.java

package com.cn.zhu.bean;import java.util.List;public class Department {private Integer  id;private  String  departmentName;private List<Employee> emps;public List<Employee> getEmps() {return emps;}public void setEmps(List<Employee> emps) {this.emps = emps;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getDepartmentName() {return departmentName;}public void setDepartmentName(String departmentName) {this.departmentName = departmentName;}@Overridepublic String toString() {return "Department [departmentName=" + departmentName + ", id=" + id+ "]";}}
Employee.java

package com.cn.zhu.bean;import org.apache.ibatis.type.Alias;@Alias("emp")public class Employee {private Integer id;private String lastName;private String email;private String gender;private Department dept;public Employee() {super();// TODO Auto-generated constructor stub}public Employee(Integer id, String lastName, String email, String gender) {super();this.id = id;this.lastName = lastName;this.email = email;this.gender = gender;}public Department getDept() {return dept;}public void setDept(Department dept) {this.dept = dept;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "Employee [email=" + email + ", gender=" + gender + ", id=" + id+ ", lastName=" + lastName + "]";}}
mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--1. mybatis可以使用properties来引入外部properties配置文件的内容 resource: 引入类路径下的资源url: 引入网路路径或者磁盘路径下的资源--><properties resource="dbconfig.properties"></properties><!--2 settings包含很多设置项 setting:用来设置每一个设置项 name 设置项名 value 设置项取值--><settings><setting name="mapUnderscoreToCamelCase" value="true" /><!-- 懒加载 ,延迟加载--><!--<setting name="lazyLoadingEnabled" value="true"/> --><!-- 立即加载 --><!--<setting name="aggressiveLazyLoading" value="false"/>--></settings><!--3 typeAliases: 别名处理器,可以为我们的java类型起个别名 别名不区分大小写--><typeAliases><!--typeAlias : 为某个java类型起个别名 type: 指定要起别名的类型全类名 默认别名就是类名小写,employeealias 指定新的类名--><!--<typeAlias type="com.cn.zhu.bean.Employee" alias="emp"/>--><!--package: 为 某个包下的所有类批量起别名 name: 指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认名(类名小写))--><package name="com.cn.zhu.bean" /><!--3  批量起别名情况下,使用@Alias注解为某个类型指定新的别名 --></typeAliases><!--4 environments: 环境们 ,mybatis可以配置多种环境,default指定使用某种环境 environment配置一个具体的环境信息,必须有两个标签,id 当前环境唯一标识 transactionManager 事务管理器 type 事务管理器的类型jdbc(jdbcTransactionFactory)|MANAGED(manged) 自定义事务管理器,实现TransactionFactory接口,type指定全类名 dataSource:数据源 type:--><!--<environments default="test"> <environment id="test"><transactionManager type="JDBC"></transactionManager> <dataSourcetype=""></dataSource> </environment> </environments>--><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments><!--5 databaseIdProvider 支持多数据库厂商 type="Db_venDor" 作用就是得到数据库厂商的标识mybatis就能根据数据库厂商 MYsql oracle sql sever--><!--<databaseIdProvider type="DB_VENDOE"> 为不同的数据库厂商起别名字 <propertyname="MySql" value="mysql"/> <property name="Oracle" value="oracle"/><property name="SQL Server" value="sqlserver"/> </databaseIdProvider>--><!--将我们写好的sql映射文件一定要注册到全局配置文件中 mapper: 注册一个sql文件 注册配置文件resource:引用类路径下的sql映射文件 注册接口 class: 引用(注册)接口 1.有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下 2 没有sql映射文件 ,所有的sql文件是利用注解方式--><!--<mappers> <mapper resource="mybatis/mapper/EmployeeMapper.xml" /></mappers>--><mappers><mapper resource="mybatis/mapper/EmployeeMapperPlus.xml" /><mapper resource="mybatis/mapper/DepartmentMapper.xml" /></mappers><!--<mappers> <mapperclass="com.cn.mybatis.dao.CopyOfEmployeeMapperAnnotation"/> </mappers>--></configuration>

dbconfig.properties

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.username=rootjdbc.password=root






在这里进行模拟程序

<!--0 是女生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来--><!--1是男生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来 把last_name赋值给email-->
<!--0 是女生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来-->

@Testpublic void test05() throws IOException{SqlSessionFactory sqlsessionFactory=getSqlSessionFactory();// 1  获取到的sqlsession不会自动提交数据SqlSession openSession=sqlsessionFactory.openSession();try{EmployeeMapperPlus mapper=openSession.getMapper(EmployeeMapperPlus.class);//级联查询 /*Employee empAndDept=mapper.getEmpAndDept(1);            System.out.println(empAndDept.getLastName());*///System.out.println(empAndDept.getDept());// 分布查询getEmpByIdStepEmployee  employee=mapper.getEmpByIdStep(1);System.out.println(employee);System.out.println(employee.getDept());}finally{openSession.commit();}}


<!--1是男生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来 把last_name赋值给email-->




数据库




增删改查,集合的遍历,鉴别器使用,分布查询等  完整代码

http://pan.baidu.com/s/1mitG0pq



原创粉丝点击