MyBatis的discriminator鉴别器的作用
DepartmentMapper.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.cn.mybatis.dao.DepartmentMapper">
<!-- public Department getDeptById(Integer id); -->
<select id="getDeptById" resultType="com.cn.zhu.bean.Department">
select id,dept_name
departmentName from tbl_dept where id=#{id}
</select>
</mapper>
EmployeeMapperPlus.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.cn.mybatis.dao.EmployeeMapperPlus">
<!-- public Employee getEmpByIdStep(Integer id); -->
<select id="getEmpByIdStep" resultMap="MyEmpDis">
select * from tbl_employee
where 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 * from
tbl_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;
}
@Override
public 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;
}
@Override
public String toString() {
return "Employee [email=" + email + ", gender=" + gender + ", id=" + id
+ ", lastName=" + lastName + "]";
}
}
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>
<!--
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: 指定要起别名的类型全类名 默认别名就是类名小写,employee
alias 指定新的类名
-->
<!--
<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> <dataSource
type=""></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"> 为不同的数据库厂商起别名字 <property
name="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> <mapper
class="com.cn.mybatis.dao.CopyOfEmployeeMapperAnnotation"/> </mappers>
-->
</configuration>
dbconfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
在这里进行模拟程序
<!--
0 是女生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来
-->
<!--
1是男生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来 把last_name
赋值给email
-->
<!--
0 是女生 resultType 指定封装的结果类型 如果是女性,就查询到employee的部门查询出来
-->
@Test
public 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());
// 分布查询getEmpByIdStep
Employee 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