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 -->
数据库
增删改查,集合的遍历,鉴别器使用,分布查询等 完整代码